当前位置: 首页 > 面试题库 >

如何从Linux内核模块的init_module代码创建设备节点?

丌官利
2023-03-14
问题内容

我正在为Linux内核编写模块,并且我想在init函数中创建一些设备节点

int init_module(void)
{
    Major = register_chrdev(0, DEVICE_NAME, &fops);
 // Now I want to create device nodes with the returned major number
}

我还希望内核为我的第一个节点分配一个次要编号,然后由我自己分配其他节点的次要编号。

我该如何在代码中做到这一点。我不想使用mknod从外壳创建设备


问题答案:

要更好地控制设备编号和设备创建,您可以执行以下步骤(而不是register_chrdev()):

  1. 致电alloc_chrdev_region()以获取一个主要号码和一系列次要号码。
  2. 使用创建设备类的设备class_create()
  3. 对于每个设备,调用cdev_init()并将cdev_add()字符设备添加到系统。
  4. 对于每个设备,请致电device_create()。因此,Udev将为您的设备创建设备节点。不需要mknod之类的。device_create()还允许您控制设备的名称。

网上可能有很多这样的例子,这里是其中之一。



 类似资料:
  • 问题内容: 我有一个同时具有两个外部内核模块和一个用户空间守护程序的应用程序。我想在启动时从用C编写的守护程序代码中加载模块,然后在干净退出时将其卸载。我可以用比使用相应的方式更干净的方式加载它们吗? 问题答案: 最小的可运行示例 使用此简单的参数打印机模块,在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试。 我们使用/ 和 Linux系统调用。 Linux内核为

  • 问题内容: 我一直在尝试移植一些Linux驱动程序,并且意识到内核版本2.4与2.6的Linux之间存在实质性差异。 在2.4版本的内核中,模块编程如下- 但是,对于2.6版本的内核,必须对模块执行以下操作- 内核2.6中进行此类更改有何优势?为什么在Linux内核2.6中需要进行此更改? 问题答案: 如果您查看新功能的定义: 您会看到它确保包含正确的样板文件,以便编译器可以正确处理这些特殊功能。

  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 问题内容: 在不深入了解 为什么 的细节的情况下,我正在寻找一种干净的(尽可能)的方法来替换可加载模块中的内核函数和系统调用。我最初的想法是编写一些代码来覆盖某些功能,这些功能将采用原始功能(可能的话, 调用 该功能),然后添加一些自己的代码。关键是我编写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将改为访问我的函数。 通过将代码放入适当的函数中,我可以轻松地(相对地)直接在内核中执行

  • 主要内容:内核模块保存位置与模块保存文件,内核模块的查看,内核模块的添加与删除Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。 模块的全称是 动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内

  • 问题内容: 我想构建一个将与所有内核发行版兼容的内核模块。例如,如果我在内核3.2.0-29上构建内核模块并尝试在3.2.0-86上加载它,则会出现以下错误: modprobe my_driver 致命:插入my_driver(/lib/modules/3.2.0-86-generic/kernel/fs/my_drv/my_drv.ko)时出错:无效的模块格式 [在日志消息中:my_drv:对符