mknod

在系统与设备通信之前,系统首先要建立一个设备文件,这个设备文件存放在/dev目录下。其实系统默认情况下就已经生成了很多设备文件,但有时候我们需要自己手动新建一些设备文件,这个时候就会用到像mkdir, mknod这样的命令。

mknod 的标准形式为: mknod DEVNAME {b | c}  MAJOR  MINOR

1,DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹下,就需要先用mkdir在dev目录下新建一个目录;

2,b和c 分别表示块设备和字符设备:

b表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘;

c表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、终端都是以字符的形式传送数据;

3,MAJOR和MINOR分别表示主设备号和次设备号:

为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备号,所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1。

下面,我们就可以用mknod命令来申请设备文件了。       

mkdir -p  /dev/cobing

mknod /dev/cobing/mydev1 c 128 512
 

Linux 系统中,`mknod` 操作用于创建设备文件,包括字符设备、块设备以及 FIFO 文件等。该操作通常由系统管理员或设备驱动程序触发,确保用户空间能够访问对应的硬件设备或虚拟设备。 ### 创建设备文件的方式 #### 使用 `mknod` 命令 用户可以通过命令行工具 `mknod` 直接创建设备文件。例如,创建一个字符设备文件: ```bash sudo mknod /dev/mydevice c 250 0 ``` 其中,`c` 表示字符设备,`250` 是主设备号,`0` 是次设备号。这种方式需要手动指定设备号,通常用于静态设备管理,设备号需与驱动模块注册的设备号一致 [^1]。 #### 使用 `mknod` 系统调用 在 C 程序中,可以使用 `mknod` 系统调用来创建设备文件。其原型定义在 `<sys/types.h>` 和 `<sys/stat.h>` 中: ```c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { mode_t mode = S_IFCHR | 0666; // 字符设备,权限为所有用户可读写 dev_t dev = makedev(250, 0); // 主设备号 250,次设备号 0 if (mknod("/dev/mydevice", mode, dev) == -1) { perror("mknod"); return 1; } return 0; } ``` 此方式适用于需要动态创建设备节点的场景,但需确保程序有足够权限操作 `/dev` 目录 [^1]。 ### 设备文件系统的自动管理(devtmpfs / udev) 现代 Linux 系统通常使用 `udev` 或 `devtmpfs` 实现设备文件的自动创建,无需手动调用 `mknod`。当驱动模块加载时,内核通过 `device_create` 接口通知设备模型子系统,系统会自动在 `/dev` 下创建对应的设备节点 [^2]。 例如,在驱动模块中使用以下接口注册设备: ```c struct class *my_class; struct device *my_device; my_class = class_create(THIS_MODULE, "my_class"); my_device = device_create(my_class, NULL, dev, NULL, "mydevice"); ``` 当模块加载后,`/dev/mydevice` 会自动被创建,避免了手动调用 `mknod` 的需求 [^2]。 ### 触发 `mknod` 操作的典型场景 1. **手动设备管理**:在嵌入式系统或无 `udev` 环境中,手动创建设备文件用于访问特定硬件。 2. **驱动调试**:开发内核模块时,为测试设备节点与驱动的绑定关系,需手动创建设备文件。 3. **脚本自动化**:在系统初始化脚本中,通过 `mknod` 创建临时设备节点以支持早期用户空间操作 [^1]。 ### 权限与安全注意事项 - 创建设备文件需要 `CAP_MKNOD` 权限,通常只有 root 用户具备。 - 设备文件的访问权限应合理设置,防止未授权访问设备。 - 在多用户系统中,应避免使用过于宽松的权限模式(如 `0666`) 。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟高工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值