这是一个面试问题。
我为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();
会在内核中注册驱动程序,但应用程序如何与此驱动程序通信。
让我知道它的正确答案。
答案 0 :(得分:2)
马丁贝克特总结道。它并不是真的更复杂, 虽然你可以用更多的细节说同样的话。这是我的 尝试一下:
程序执行open("/dev/mydevice", flags)
系统调用,然后执行
内核从磁盘读取/dev/mydevice
。它只是一个inode,没有
相关的数据块,但它拥有两个重要的部分
信息:主要号码和次要号码。从这些数字来看,
内核找到你提供的struct file_operations
register_chrdev()
,它称之为.open
字段。它回到了
编程与此特定关联的文件描述符
struct file_operations
。接下来,当内核收到类似的系统调用时
write(fd, buf, count)
,它会调用.write
字段,依此类推。
答案 1 :(得分:1)
在unix中,它只是将设备节点作为文件打开,并从中发送/接收数据和命令 Unix的优点在于从应用程序的角度来看,设备没有什么特别之处 - 它们只是文件(除了设置某些模式的ioctls)。在内核中有工作要做以适应这个,但那是内核模块问题。
或者你在问一些更复杂的事情?