目的:将内核内存的一块作为字符设备,用户可通过这些调用来读写这段内存。
总结:
1、设备号
主设备号标识设备对应的驱动程序,次设备号由内核使用,用于确定设备文件所指的设备。
通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。
设备编号用dev_t表示(linux/types.h 32位,其中12位表示主设备号,20位表示次设备号)。
由dev_t获得主设备号或次设备号:MAJOR(dev_t dev); MINOR(dev_t dev)
已知主设备号和次设备号来获取dev_t类型:MKDEV(int major, int minor)
获取一个或多个设备编号:int register_chrdev_region(dev_t first, unsigned int count, char *name);(静态分配,事先已知道设备号)
动态分配设备编号:int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); 调用成功后dev会保存已分配的第一个编号。
释放设备编号:void unregister_chrdev_region(dev_t first, unsigned int count);
接下来,驱动程序需要将设备编号和内部函数连接起来。
注:(下一步可尝试采用动态分配设备号)
动态分配设备号缺点:不能预先创建设备节点(因为分配的设备号不能保证始终一致)。
2、文件操作file_operations:
这些操作将与设备编号连接起来。
__user:用于文档,表明该指针是一个用户空间地址。
主要成员:open, ioctl, read, write, llseek
3、struct file结构 linux/fs.h 文件描述符
每打开一个文件,内核就会创建一个对应的file结构,在open()时创建,同时会传递给在该文件上进行操作的所有函数(因为file结构中包含file_operations结构,而该结构包含了所有驱动操作的函数)。
内核中用filp作为执行file结构的指针。
主要成员:
Mode_t f_mode; loff_t f_pos; struct file_operations *f_pos; void private_data;
4、inode结构
对单个文件只有一个inode,而可能有多个file(由于fork,<