mknod命令

##简介

命令mknod,可以生成块设备文件或者字符设备文件,格式为:

mknod [OPTION] NAME TYPE [MAJOR MINOR]

OPTION是选项,比较有用的是-m,表示生成的设备文件的权限;

NAME是生成的设备的名称

TYPE是设备类型,b表示块设备,c表示字符设备,p表示管道

MAJOR是主设备号,MINOR是次设备号,主设备号是由文件/usr/include/linux/major.h定义的。摘取的代码段如下:

#ifndef _LINUX_MAJOR_H
#define _LINUX_MAJOR_H

/*
 * This file has definitions for major device numbers.
 * For the device number assignments, see Documentation/devices.txt.
 */

#define UNNAMED_MAJOR           0
#define MEM_MAJOR               1
#define RAMDISK_MAJOR           1
#define FLOPPY_MAJOR            2
#define
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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函数创建设备节点。需要注意的是,为了保证驱动能够正常运行,需要在驱动初始化时先创建设备节点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值