【问题标题】:connecting application with device driver将应用程序与设备驱动程序连接
【发布时间】:2011-07-05 04:02:18
【问题描述】:

这是一道面试题。

我已经为 char 设备编写了设备驱动程序,所以我知道代码结构看起来像这样

struct file_operations something {
 .owner=my_device_open;
 .read=my_device_read;
 .close=my_device_close;
 .write=my_device_write;

 }

当设备驱动程序处于活动状态时

/dev/mydevice

您实际上可以对其进行读写。 但我不清楚应用程序将如何读取或写入此设备。 我知道insmod 会将模块插入内核,register_chrdev(); 将在内核中注册驱动程序,但应用程序将如何与该驱动程序通信。 让我知道它的正确答案是什么。

【问题讨论】:

    标签: c device-driver


    【解决方案1】:

    Martin Beckett 总结了这一点。其实并不复杂, 尽管您可以稍微详细一点地说同样的话。这是我的 试试看:

    程序执行open("/dev/mydevice", flags) 系统调用,然后 内核从磁盘读取/dev/mydevice。它只是一个 inode,没有 相关的数据块,但它包含两个重要的部分 信息:主要编号和次要编号。从这些数字中, 内核找到您提供的struct file_operations register_chrdev(),它称之为.open 字段。它返回到 编写与此特定关联的文件描述符 struct file_operations。接下来,当内核收到类似的系统调用时 write(fd, buf, count),它会调用.write字段等等。

    【讨论】:

    • 嗯嗯嗯,我说的和你提到的完全一样,但我的面试官似乎不相信我说的。
    • 所以你确实提到了inode中的主要和次要数字?嗯,你的面试官有点奇怪。也许他期望得到一条非常具体的信息,例如打开文件的确切内核内存结构,或者如何从任务结构中链接,或者其他什么......他不想告诉你他实际上是什么期待。
    • 我不知道我在 2 次不同的采访中被问到了同样的问题,但他们没有透露结果。
    【解决方案2】:

    在 unix 中,它只是将设备节点作为文件打开并从中发送/接收数据和命令。
    Unix 的美妙之处在于,从应用程序的角度来看,设备没有什么特别之处——它们只是文件(除了 ioctls 来设置某些模式)。内核中有工作要做以适应这一点,但这是内核模块的问题。

    或者你问的是更复杂的问题?

    【讨论】:

    • Beckett 我也对面试官说了同样的话,但他期待更复杂的事情。
    猜你喜欢
    • 2012-11-25
    • 2012-08-02
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多