1.分配设备号
静态分配:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
动态分配
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);
注销设备号
void unregister_chrdev_region(dev_t from, unsigned count);
2.注册字符设备
1.分配cdev: struct cdev *cdev_alloc(void);
2.初始化cdev: void cdev_init(struct cdev *cdev, const struct file_operations *fops);
3.添加cdev: int cdev_add(struct cdev *p, dev_t dev, unsigned count)
3.设备注销:void cdev_del(struct cdev *p);
安装
1.cat /proc/devices 查看申请到的设备号
2.mknode /dev/xxx c xxx 0创建设备节点
或
cls = class_create(THIS_MODULE, “hello”);
class_device_create(cls, NULL, MKDEV(major, 0), NULL, “hello0”); /* /dev/hello0 */
class_device_destroy(cls, MKDEV(major, 0));
class_destroy(cls);
重要的数据结构
1.struct file:表示打开的文件描述符,系统中每个打开的文件都有一个相关联的file结构体在内核中。它们在open时创建,并传递给文件操作函数。当文件的所有实例都关闭后,内核会释放这个结构体。
2.struct inode:记录文件的物理信息。一个文件可以对应多个file结构,但是只有一个inode结构。indoe一般作为file_opreation结构中的参数传递过来。
inode可以理解为检索节点。每个存储设备或存储分区被格式化后,都有两部分:inode+block;block是存储部分,inode是用来存储文件大小,归属,组,权限等信息。indoe为每个文件进行信息检索,产生inode数值。操作系统根据指令,通过inode值来找到文件。