如何从 Linux 内核模块的 init_module 代码创建设备节点?
我正在为 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() 从 shell 创建设备。
I am writing a module for the Linux kernel, and I want to create some device nodes in the init() function:
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
// Now I want to create device nodes
// with the returned major number
}
I also want the kernel to assign a minor number for my first node, and then I will assign the other nodes' minor numbers by myself.
How can I do this in the code? I don’t want to create devices from the shell using mknod().
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
要更好地控制设备编号和设备创建,您可以执行以下步骤(而不是
register_chrdev()
):alloc_chrdev_region()
获取主设备编号以及一系列可供使用的次要号码。class_create()
为您的设备创建设备类。cdev_init()
和cdev_add()
将字符设备添加到系统。device_create()
。因此,除其他外,Udev 将为您的设备创建设备节点。不需要mknod()
或类似的东西。device_create()
还允许您控制设备的名称。互联网上可能有很多这样的例子,其中之一在这里。
To have more control over the device numbers and the device creation, you could do the following steps (instead of
register_chrdev()
):alloc_chrdev_region()
to get a major number and a range of minor numbers to work with.class_create()
.cdev_init()
andcdev_add()
to add the character device to the system.device_create()
. As a result, among other things, Udev will create device nodes for your devices. There isn’t any need formknod()
or the like.device_create()
also allows you to control the names of the devices.There are probably many examples of this on the Internet, and one of them is here.
最小可运行示例
从其他答案中最小化。 GitHub 上游 以及测试设置。
Minimal runnable example
Minimized from other answers. GitHub upstream with test setup.