1

我是 linux 设备驱动程序编程的新手,所以我的问题可能有点幼稚。

这在 char 设备的范围内,但可能也与其他情况有关(??)。

到目前为止,据我所知,在模块的 __init 方法中,必须进行模块的所有必要初始化,并且一旦此函数完成 - 模块应该能够处理它从内核和/或用户空间应用程序获得的任何请求. 此外,作为 __init 方法的一部分,我们的模块需要获取一个主编号(假设我们动态分配它),然后在 /dev 目录下创建“相应的”设备文件。有几种方法可以做到这一点。

1)驱动本身可以打印新分配的编号,我们可以手工制作设备文件。

2) 新注册的设备在/proc/devices中会有一个入口,我们可以手工制作设备文件,也可以编写一个shell脚本来读取文件并制作设备文件。

3) 我们可以让我们的驱动程序在成功注册后使用 mknod 系统调用生成设备文件,并在调用 cleanup_module 期间使用 rm。

现在据我所知,除非 __init 方法中有一些代码在我们创建设备文件之前“暂停” __init 方法的终止 --> 这意味着我们的模块可能会在没有设备的情况下开始接收请求文件准备好了,这不是问题吗(假设我们采用第一种或第二种方法)?

static int major;
static struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = dev_read,
    .write = dev_write,
    .open = dev_open,
    .release = dev_release 
};
static int __init myModuleInitMethod()
{
    major = register_chardev(0, “myChaeDev”, &fops);

     // some more initialization
    // ...
    // yet no creation of the device file, using mknod
}  // myModuleInitMethod terminates and device file isn’t ready – problem ??

如果我没有提到它们,请随意注意一些其他要考虑的点。谢谢,

家伙。

4

0 回答 0