C 将应用程序与设备驱动程序连接

C 将应用程序与设备驱动程序连接,c,device-driver,C,Device Driver,这是一个面试问题 我已经为char设备编写了设备驱动程序,所以我知道代码结构如下所示 struct file_operations something { .owner=my_device_open; .read=my_device_read; .close=my_device_close; .write=my_device_write; } 当设备驱动程序处于活动状态时,则在 /dev/mydevice 你实际上可以读写它。 但我不清楚的是,应用程序将如何读取或写入此设备。 我

这是一个面试问题

我已经为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()
将在内核中注册驱动程序,但应用程序如何与此驱动程序通信。
请告诉我正确答案。

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


或者您是在问更复杂的问题吗?

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


还是你在问更复杂的问题?

马丁·贝克特总结了一下。其实并不复杂, 尽管你可以说得更详细一些。这是我的 试试看:

程序执行
open(“/dev/mydevice”,flags)
syscall,然后 内核从磁盘读取
/dev/mydevice
。它只是一个inode,没有 关联的数据块,但它包含两个重要的 信息:主要号码和次要号码。从这些数字来看, 内核将查找通过提供的
struct file\u操作
register\u chrdev()
,并调用它的
。打开
字段。它返回到
编写一个与此特定文件关联的文件描述符
struct file\u操作
。接下来,当内核收到一个系统调用时,如
write(fd,buf,count)
,它将调用
.write
字段,依此类推。

马丁·贝克特总结了一下。其实并不复杂, 尽管你可以说得更详细一些。这是我的 试试看:

程序执行
open(“/dev/mydevice”,flags)
syscall,然后 内核从磁盘读取
/dev/mydevice
。它只是一个inode,没有 关联的数据块,但它包含两个重要的 信息:主要号码和次要号码。从这些数字来看, 内核将查找通过提供的
struct file\u操作
register\u chrdev()
,并调用它的
。打开
字段。它返回到
编写一个与此特定文件关联的文件描述符
struct file\u操作
。接下来,当内核收到一个系统调用时,如
写入(fd、buf、计数)
,它将调用
。write
字段,依此类推。

贝克特我也告诉了面试官同样的事情,但他期待着更复杂的事情。贝克特我也告诉了面试官同样的事情,但他期待着更复杂的事情。嗯,我已经告诉了你提到的同样的事情,但似乎我的面试官是不相信我说的。所以你提到了inode中的主次数字?你的面试官有点奇怪。也许他期望得到一条非常具体的信息,比如打开文件的内存中的内核结构,或者是如何与任务结构链接,或者其他什么。。。他不想告诉你他到底在期待什么。我不知道我在两次不同的采访中被问到了同样的问题,他们没有透露结果。嗯,我说的和你提到的完全一样,但我的采访者似乎不相信我说的话。所以你确实提到了主要和次要的数字伊诺德?你的面试官有点奇怪。也许他期望得到一条非常具体的信息,比如打开文件的内存中的内核结构,或者是如何与任务结构链接,或者其他什么。。。他不想告诉你他到底在期待什么。我不知道我在两次不同的采访中被问到同样的问题,他们没有透露结果。