2026/4/4 13:21:01
网站建设
项目流程
cms二次开发网站建设,wordpress访问满,外网访问wordpress全站路径设置,中囯军事网目录
一、主次设备号的定义
二、设备号常用宏
三、设备号的分配与释放
3.1 动态分配与释放
3.2 静态分配与释放
参考资料 一、主次设备号的定义
在 Linux 里#xff0c;/dev/xxx 这种设备文件本质上是一个 特殊文件#xff08;inode#xff09;#xff0c;里面最关键…目录一、主次设备号的定义二、设备号常用宏三、设备号的分配与释放3.1 动态分配与释放3.2 静态分配与释放参考资料一、主次设备号的定义在 Linux 里/dev/xxx这种设备文件本质上是一个特殊文件inode里面最关键的“身份信息”就是一个设备号 dev_t(本质上是一个整型编码是一个32位的数据类型高12位为主设备号低20位为次设备号)主设备号major告诉内核“应该找哪个驱动/哪个字符设备类或者块设备类来处理这个打开请求”次设备号minor告诉驱动“同一个驱动下的哪一个具体实例/通道/端口/逻辑设备”该类型的定义是在include/linux/types.h文件中当用户态做fd open(/dev/xxx, O_RDWR);VFS 在解析到这是字符设备/块设备文件后会拿到这个 inode 里保存的dev_t拆出 major/minor然后去内核里找到对应的cdev字符设备或 bdev块设备把这次open转交给对应的file_operations。在自己的设备中我们可以输入ls -l /dev/xxx0来查看设备节点的主次设备号与设备类型使用下述指令可以查看系统当前注册的主设备号cat /proc/devices二、设备号常用宏在include/linux/kdev_t.h包含了一些设备号相关的常见宏MAJOR(dev_t)/MINOR(dev_t)拆出主/次设备号MKDEV(major, minor)把主/次设备号合成一个dev_t三、设备号的分配与释放设备号分配的本质是向内核申请一个设备号区间一个 major 若干连续 minor并在退出时把这段区间归还。设备号分配与释放的函数在头文件include/linux/fs.h这里声明了alloc_chrdev_region()register_chrdev_region()unregister_chrdev_region()并且注释里直接标明来源/* fs/char_dev.c */还定义了动态 major 的范围常量CHRDEV_MAJOR_*。3.1 动态分配与释放动态分配alloc_chrdev_region()/ 释放unregister_chrdev_region()函数原型如下声明位置include/linux/fs.hint alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name); void unregister_chrdev_region(dev_t from, unsigned count);实现位置代码fs/char_dev.calloc_chrdev_region()传入major0的语义要求内核在“动态主设备号范围”内找一个未占用 major并把baseminor..baseminorcount-1这段 minor 区间登记进去成功后通过dev返回起始dev_t即major:baseminor。unregister_chrdev_region()反向把这段区间从内部表里摘掉并释放若跨 major会按段循环处理。3.2 静态分配与释放静态分配register_chrdev_region()/ 释放unregister_chrdev_region()函数原型声明位置include/linux/fs.hint register_chrdev_region(dev_t from,unsigned count,constchar *name); void unregister_chrdev_region(dev_t from,unsigned count);实现位置代码fs/char_dev.cregister_chrdev_region()由调用者给出from MKDEV(major, first_minor)内核只做两件关键事检查该 major/minor 区间是否与已登记区间重叠冲突则失败将这段区间登记为已占用必要时同样按 major 分段处理。释放仍统一使用unregister_chrdev_region()同上按段撤销登记。参考资料野火字符设备驱动Linux设备驱动程序第三版