在学习字符设备驱动时,尝试理解下列问题。
1、 什么是字符设备?什么是字符设备驱动?
这是两个完全不同的概念,字符设备是以字节为单位进行顺序访问的一类设备的总称,常见的字符设备有键盘、串口、控制台等。而字符设备驱动就是提供字符设备操作的机制。
2、 字符设备的主设备号,次设备号的分配和注册?内核通过主设备号找到字符设备,而次设备号通过什么途径传递给驱动模块代码使用。
Linux内核允许多个驱动共享主设备号,次设备号则被内核用来决定引用哪个设备。从内核得到一个设备的直接指针或使用次设备号作为本地设备数组的索引,不管用哪个方法,内核都不知道次设备号的任何事情,除了指向驱动实现的设备。
在内核中,dev_t(在<include/linux/types.h>中定义)用来表示主次设备号,12位作主设备号,20位作次设备号。
typedef __u32 __kernel_dev_t; //32位的整数
typedef __kernel_dev_t dev_t; //设备号
在<include/linux/kdev_t.h>里定义了相关的宏,为获得一个dev_t的主次设备号:
MAJOR(dev_t dev); //获得主设备号
MINOR(dev_t dev); //获得次设备号
相反,如果有主次设备号,要将其转换为一个dev_t,则使用
MKDEV(int major, int minor);
在<include/linux/fs.h>中申明:
//函数原形在<fs/Char_dev.c>
extern int register_chrdev_region(dev_t, unsigned, const char *); //向系统静态申请设备号,设备号已知
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *); //向系统动态申请设备号,设备号未知,由系统分配
当设备号不再使用时,则需注销:
extern void unregister_chrdev_region(dev_t, unsigned);
注:一些主设备编号是静态分派给最普通的设备的,一个这些列表在内核源码树的 Documentation/devices.txt中。对于新的驱动,强烈建议使用动态分配来获取主设备号,而不是随机选择取一个当前空闲的编号
3、 怎样创建设备节点?mknod怎么使用
4、字符设备的file_operations 包括哪些成员函数指针,这些指针在应用中如何使用?