Linux 字符设备
来源:互联网 发布:星球基地mac 编辑:程序博客网 时间:2024/05/29 17:02
Linux的device主要可以分为三种:
1:char device
2:block device
3:network device
本文主要描述chardevice:
1:主、次设备号(Major and Mirror Numbers)
通过ls的时候就可以看到,每个设备都有主、次设备号,其中主设备号用于表示哪个驱动,次设备号用于表示哪个设备;
可以通过MAJOR(dev_t dev)、MINOR(dev_tdev)从一个设备号获取主、次设备号;
可以通过MKDEV(int major, intminor)将主、次设备号组合成一个设备号。
1)设备号的申请
设备号可以动态申请,也可以用户指定
用户指定:int register_chrdev_region(dev_tfrom, unsigned count, const char *name);
动态申请:int alloc_chrdev_region(dev_t *dev,unsigned baseminor, unsigned count,
constchar *name)
2)设备号的释放
unregister_chrdev_region
2:主要数据结构
struct cdev {
structkobject kobj;
structmodule *owner;
const struct file_operations *ops;
structlist_head list;
dev_tdev;
unsignedint count;
};
其中ops为常见的文件操作接口(read、write等),
当用户态open一个字符设备文件,并通过read、write等系统调用操作字符设备文件时,由于内核态不能直接访问用户态的地址,必须在系统调用处理函数入口通过copy_to_user或copy_from_user来完成用户态空间与内核态地址的数据交换,原因如下:
1):在不同的架构以及不同的配置下,用户态的指针在内核态下可能是无效的,没有映射的;
2):如果用户态指针所映射的内存区域被交换出去,那在内核态访问的话就会导致缺页异常,而内核是不允许缺页的;
3):处于安全的考虑,如果不做用户态指针的判断与转换,那即使传进来一个恶意的地址,内核也会直接去访问、修改。
内核在处理copy_to_user或copy_from_user时,如果用户态的地址空间还没有建立物理页映射,则会产生异常,不过内核针对copy_to_user和copy_from_user产生的异常做了特殊判断,保证内核产生缺页异常时不会挂死;
3:注册一个字符设备主要步骤
1):分配设备号
register_chrdev_region或alloc_chrdev_region
2):分配字符设备控制块(一般用全局变量)
cdev = cdev_alloc();
3):设置字符设备处理函数
cdev->ops = fops;
4):设置kobject的name,用于在sysfs里显示
kobject_set_name(&cdev->kobj,"%s", name);
5):通过cdev_add将新的字符设备注册到系统中
- linux 块设备,字符设备
- linux字符设备 cdev
- LINUX--字符设备驱动
- Linux字符设备驱动
- Linux字符设备驱动
- Linux字符设备驱动
- linux字符设备模型
- linux字符设备
- linux字符设备驱动
- linux字符设备驱动
- linux 字符设备驱动
- linux字符设备驱动
- linux 字符设备驱动
- Linux 字符设备记录
- linux字符设备注册
- Linux字符设备驱动
- linux字符设备驱动
- linux字符设备驱动程序
- zookeeper安装配置 (转自ITeye博客)
- A计划(BFS)
- k8s使用ceph rbd
- AR(制作流程)
- C231n-SVM-assignment1-完全代码及注释
- Linux 字符设备
- 如何:对 Windows 窗体控件进行线程安全调用
- 【HDU
- 1002:方便记忆的电话号码
- Myeclipse 2017 汉化教程
- 苹果ios app提交审核,一直提示本地化(简体中文simplified chinese)错误的解决办法
- Android开机速度优化简单回顾
- codeforces 384A Coder
- 20个正则表达式