字符设备

long xxx_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
{
...;
switch(cmd)
{
case XXX_CMD1:
...;
break;
case XXX_CMD2;
...;
break;
case XXX_CMD3;
...
break;
default:
/*不能支持的命令*/
return -ENOTTY;
}
return 0;
}
驱动函数当中,filp是文件结构体的指针,buf是用户空间内存的地址,该地址在内核空间当中不能直接读写。
count是要读写的字节数,f_ops是读的位置相对于文件开头的偏移。
copy_from_user()
copy_to_user()
完成用户空间与内核空间的数据交换。原型为:
unsigned long copy_from_user(void *to,void __user *from,unsigned long count);
unsigned long copy_to_user (void __user *to,void *from,unsigned long count);
函数返回不能被复制的字节数

如果复制的内存是简单的类型有如下的函数:
int val;
...;
get_user(val,(int *)arg);
...;
out_user(val,(int *)arg);
读写函数中的_usr是一个宏,表明其后的指针指向用户空间。实际上更多地充当了代码自注释的功能。
宏的定义如下:
#ifdef __CHECKER__
 #define __user __attribute__((nodeeref,address_space(1)))
#else
#define __user
#endif

内核空间访问用户空间,先要进行合法性的检查,已确定传入的空间的确属于用户空间。通过
access_ok(struct file *file,chae _user *buf,size_t count,loff_t *ppos)
{
unsigned long i = *ppos;
char __user *tmp = buf;

if(!access_ok(VERIFY_WRITE,buf,count))
return -EFAULT;
while(count-- > 0 && i < 65536)
{
if(__put_user(inb(i),tmp) < 0)
reutnrn -EFAULT;
i++;
tmp ++
}
} //大概是了解了
_put_user()不会进行相应的合法性检查
在界面处进行检查显得尤为的重要,许多的安全漏洞都是因为遗忘检查造成的。
非法入侵者可以伪造一片内核空间的缓冲区地址传入系统调用的接口,让内核对这个evil指针指向内核空间填充数据。
copy_from_user()和copy_to_user()内部也进行了类似的检查。
static inline unsigned long __must_check copy_from_user(void *to,const void __user *from,unsigned long)
{
if(access_ok(VERIFY_READ,from,n))
n = __copy_from_user(to,from,n);
else
memset(to,0,n);
return n;
}
static inline unsigned long __must_check copy_to_user(void __user *to,const void *from,unsigned long n)
{
if(access_ok(VERFY_WRITE,to,n))
n = __copy_to_user(to,from,n);
return n;
}

I/O 函数的cmd参数为是先定义的I/O 控制命令,arg为对应该命令的参数。
在字符设备中。需要定义一个file_operation的实例,并将具体设备驱动函数赋值给file_operation的成员,
struct file_operations xxx_fops = {
.owner = THIS_MODULE;
.read = xxx_read;
.write = xxx_write;
.unlock_ioctl= xxx_ioctl;
...
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值