文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>使用put_user()实验内核空间向用户空间传递数据

使用put_user()实验内核空间向用户空间传递数据

时间:2007-01-09  来源:基地小头目

测试中出现的问题:
1、无法在开发板上删除通过nfs共享的文件夹
   解决方法:加入no_root_squash参数后解决问题
    nfs 共享时是否加入了no_root_squash 这样在客户机挂载时就有root 权限.
如果没有的话,客户机挂载时就没有root 权限,只有noboday ,这时需要服务器就要设置对应读写权限了.
例如 一个目 /home 
对应权限    drwxr-xr-x   home
下层目录 ls /home
drwx------  26 wang     wang     4096 12月  3 12:48 wang
user wang uid=500,gid=500
example 1
nfs server  /etc/exports
/home *(rw,sync)       
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
mkdir: 无法创建目录‘1’: 权限不够
此时root 的身份已经为noboday,虽然共享权限为rw,但是只能r

example 2
nfs server  /etc/exports
/home *(rw,sync,all_squash,anonuid=500.anongid=500)       
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
mkdir: 无法创建目录‘1’: 权限不够
cd /mnt/wang
mkdir 1
ls -l
drwxr-xr-x  2 wang wang 4096 12月 12 23:45 1
此时root 的身份已经为wang,虽然共享权限为rw,但是只能在/mnt/wang 下面,这种情况很象你上面的相象

example 3
nfs server  /etc/exports
/home *(rw,sync,no_root_squash)       
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
ls -l
drwxr-xr-x  2 root root 4096 12月 12 23:49 1
此时root 的身份已经为root,可以在共享目录里面进行任何操作

2、insmod内核模块时出现错误:
  
[root@(none) ramdisk]# insmod ok.o

insmod: unresolved symbol __put_user_bad

解决方法:编译模块的时候是用优化选项O2解决问题!


源程序:

#ifndef __KERNEL__
#define __KERNEL__
#endif

#ifndef MODULE
#define MODULE
#endif

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include<linux/types.h>
#include<asm/hardware.h> //没有的 话导至 devfs_handle_t 找不到


#define SUCCESS 0
#define DEVICE_NAME "chardev"
#define BUF_LEN 80 /* Max length of the message from the device */

static devfs_handle_t dev_handle;
int Major; /* Major number assigned to our device driver */
int Device_Open = 0; /* Is device open? Used to prevent multiple */
char msg[BUF_LEN]; /* The msg the device will give when asked */
char *msg_Ptr;

int lj_open(struct inode *inode, struct file *file)
{
   static int counter = 0;
   if (Device_Open) return -EBUSY;
   Device_Open++;
   sprintf(msg,"I already told you %d times Hello world!\n", counter++);
   msg_Ptr = msg;
   printk("<1>device_open call\n");
   return SUCCESS;
}

int lj_release(struct inode *inode, struct file *file)
{
   Device_Open --; /* We're now ready for our next caller */

   printk("<1>device_release call\n");

   return 0;
}

ssize_t lj_read(struct file *filp,
       char *buffer, /* The buffer to fill with data */
       size_t length, /* The length of the buffer */
       loff_t *offset) /* Our offset in the file */
{

   int bytes_read = 0;

   if (*msg_Ptr == 0)

   return 0;

   while (length && *msg_Ptr)
   {
     put_user(*(msg_Ptr++), buffer++);
     length--;
     bytes_read++;
   }
 
   return bytes_read;
}

ssize_t lj_write(struct file *filp,
       const char *buff,
       size_t len,
       loff_t *off)
{
   printk ("<1>Sorry, this operation isn't supported.\n");
   return -EINVAL;
}

static struct file_operations keybd_fops =
{
  read:lj_read, //注意此处是:而不是= //.read=lj_read 才是=


  write:lj_write,
  open:lj_open,
  release:lj_release,
};

int init_module(void)
{
  
 Major = register_chrdev(240, DEVICE_NAME, &keybd_fops);
dev_handle = devfs_register(NULL,DEVICE_NAME, DEVFS_FL_DEFAULT,
240,0,S_IFCHR|S_IRUSR|S_IWUSR,&keybd_fops,NULL);

//注册字符驱动 第一个参数是主设备号 如果第一个参数是0 表示由内核自动分配


//第二个是设备名 可以在/proc/devices里面看到


//第三个是对此设备的操作函数 具体操作可以看file_operations结构定义 在linux/fs.h里面


   if (Major < 0) {
       printk ("Registering the character device failed with %d\n", Major);
       return Major;
   }

   Major = 240;
   printk("<1>I was assigned major number %d. To talk to\n", Major);
   printk("<1>Remove the device file and module when done.\n");
   return 0;
}

void cleanup_module(void)
{
   int ret = unregister_chrdev(Major, DEVICE_NAME);
   devfs_unregister(dev_handle);
   printk("bye \n");
   if (ret < 0) printk("Error in unregister_chrdev: %d\n", ret);
}

//测试方法

//echo"hello"> /dev/chardev


//cat /dev/chardev >hello


//然后看hello里的内容


相关阅读 更多 +
排行榜 更多 +
像素火影次时代永恒佐助下载

像素火影次时代永恒佐助下载

角色扮演 下载
托卡美发沙龙4安装下载

托卡美发沙龙4安装下载

模拟经营 下载
尤雅闪耀国际服下载安卓版

尤雅闪耀国际服下载安卓版

休闲益智 下载