mknod 命令的用法

mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 -m 了 name 自定义 type 有 b 和 c 还有 p 主设备号 次设备号 主设备号是由/usr/src/linux/include/linux/major.h定义的,如下定义了一个DOC设备: #define IGEL_FLASH_MAJOR 62 假如有一个命令mknod doc b 62 0 : 其中的doc为定义的名字,b指块设备,0指的是整个DOC。如果把0换为1,则1指的是DOC的第一个分区。2是第2个,依次类推。 至于mknod console c 5 1 的意思也很相似: console是设备的名字 c指字符设备 5是该设备在major.h中定义的标记 1是第一个子设备 mknod console c 5 1 console为设备文件名,自己随便取 c是指字符型设备 (可选b,块设备) 5是主设备号 /dev/devices里面记录现有的设备 找个没有用的就可以了 1是次设备号,当你要给两个同样的设备上一个驱动的时候就要分了,从0开始,1就是第二个了 设备文件 对于每种硬件设备,系统内核有相应的设备驱动程序负责对它的处理。而在Unix中,使用设备文件的方式来表示硬件设备,每种设备驱动程序都被抽象为设备文件的形式,这样就给应用程序一个一致的文件界面,方便应用程序和操作系统之间的通信。 习惯上,所有的设备文件都放置在/dev目录下。 $ ls -l /dev/rfd0 /dev/fd0 brw-r----- 9 root operator 2, 0 Nov 12 13:32 /dev/fd0 crw-r----- 9 root operator 9, 0 Nov 12 13:32 /dev/rfd0 在上面的列表中可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号(major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number),硬件驱动程序使用它来区分不同的设备和判断如何进行处理。FreeBSD下主设备号用8位表示,而从设备号用24位来表示。事实上设备文件的名字并不重要,重要的是这两个设备号,操作系统使用它确定硬件驱动程序,并与硬件驱动程序进行通信。 1) 磁盘和块设备文件 在Unix下将设备分为两种,块设备和字符设备,其中块设备主要用于随机存取的目的,磁盘为这一类设备的代表,而字符设备用于顺序存取的目的,例如磁带或终端设备就属于这个类别。 磁盘设备的命名方式在前一章中提到过,磁盘设备由磁盘名、磁盘的序号、分区的序号、以及FreeBSD子分区的序号来表示,例如在设备 wd0s1a中,wd为驱动程序,此后为设备序号,0表示为这个驱动程序的第一个设备,Unix习惯上从0开始计数,第三部分的分区序号为s1,注意这里为第一个分区,因为s1是从1开始向下排列的,与一般Unix的习惯不同,这是因为分区的概念是一个DOS概念,因此这里也使用与DOS相对应的顺序,最后一个a为FreeBSD子分区的顺序,每个UFS基本分区可以有8个子分区,这8个分区按照习惯用于不同的目的,例如wd0s1a用于根文件系统, wd0s1b用做交换分区,使用wd0s1c表示整个硬盘分区wd0s1。因此可以将fd0c用于对整个软盘fd0进行存取,wcd0c用于对整个光盘 wcd0进行存取等。 传统名字,例如wd0a,可以用于表示第一个UFS分区上的a子分区,如wd0s1a。一般一个硬盘上只有一个UFS分区,因此可以直接使用传统名字标识磁盘分区。 在使用ls命令列表时,系统使用c(character)标识一个字符设备文件,使用b(block)标识块设备文件。 $ ls -l /dev/*wd0s1 crw-r----- 1 root operator 3, 131072 Oct 31 19:59 /dev/rwd0s1 brw-r----- 1 root operator 0, 131072 Oct 31 19:59 /dev/wd0s1 虽然硬盘设备为块设备,用于随机存取的目的。但它也可以被顺序存取,这种方式称为raw方式。使用raw方式存取硬盘,就需要一个对应的字符类型的设备文件,对应wd0s1硬盘设备的字符类型硬盘设备为rwd0s1,设备名中第一个字母使用r表示对硬盘的raw方式顺序存取。 由于设备文件就代表了整个设备,就可以使用 FreeBSD的标准命令以raw方式直接操作设备文件,从而直接访问硬件设备。利用这种方式,能完成很多有用的工作,但是这种方式也非常危险,例如对硬盘设备文件的操作失误会破坏整个硬盘的数据。幸好大部分直接访问设备的操作都为读取相应数据的操作,而不需要写入磁盘设备。 当某个设备不可使用,则其对应的设备文件也不能正常访问,因此直接访问设备文件可以判断对应的设备是否真正正常。例如,判断连接到第一个串口, ttyd0上的鼠标是否正常工作,使用命令 “cat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Linux内核中,可以使用sys_mknod函数实现mknod命令。因此,在驱动中实现mknod命令的步骤如下: 1. 在驱动的初始化函数中,注册字符设备或块设备。 2. 在驱动中实现一个ioctl函数,用于接收用户空间传递的参数。 3. 在ioctl函数中,使用sys_mknod函数创建设备节点。需要注意的是,sys_mknod函数的第一个参数是设备节点名称,第二个参数是设备类型,第三个参数是设备号。 4. 将创建设备节点的结果返回给用户空间。 下面是一个简单的示例代码,用于在驱动中实现mknod命令: ``` #include <linux/fs.h> #include <linux/module.h> #include <linux/uaccess.h> static int my_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { char *dev_name = "/dev/my_device"; // 设备节点名称 int dev_major = 240; // 设备主设备号 int dev_minor = 0; // 设备次设备号 int dev_mode = 0666; // 设备权限 int result; printk(KERN_INFO "my_device: ioctl called\n"); switch (cmd) { case MY_IOCTL_MKNOD: // 使用sys_mknod函数创建设备节点 result = sys_mknod(dev_name, dev_mode | S_IFCHR, MKDEV(dev_major, dev_minor)); if (result < 0) { printk(KERN_ERR "my_device: failed to create device node\n"); return -1; } printk(KERN_INFO "my_device: device node created\n"); break; default: return -EINVAL; } return 0; } // 定义ioctl命令 #define MY_IOCTL_MAGIC 'm' #define MY_IOCTL_MKNOD _IO(MY_IOCTL_MAGIC, 1) static struct file_operations my_fops = { .owner = THIS_MODULE, .unlocked_ioctl = my_ioctl, }; static int my_device_init(void) { int result; // 注册字符设备 result = register_chrdev(240, "my_device", &my_fops); if (result < 0) { printk(KERN_ERR "my_device: failed to register device\n"); return result; } printk(KERN_INFO "my_device: device registered\n"); return 0; } static void my_device_exit(void) { // 卸载字符设备 unregister_chrdev(240, "my_device"); printk(KERN_INFO "my_device: device unregistered\n"); } module_init(my_device_init); module_exit(my_device_exit); ``` 在上面的代码中,驱动注册了一个字符设备,并实现了一个ioctl函数。当用户空间调用ioctl命令时,驱动会使用sys_mknod函数创建设备节点。需要注意的是,为了保证驱动能够正常运行,需要在驱动初始化时先创建设备节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值