[英]Character Device Driver Read/Write in Linux
我编写了一个字符设备驱动程序,我相信它应该可以工作。
我想测试读/写功能。 在另一个堆栈溢出问题上,显然这可以通过写入 /dev 中的设备文件并回显 output 来完成。
我不明白这是如何工作的:
当我通过分配主设备号并调用 mknod 创建文件来加载设备驱动程序时,文件是否“打开”? 如果它没有打开,那么读/写不应该像从命令行那样工作,或者我是这么想的?
state 是在 /proc/devices 中初始化并在 /dev 中创建文件时的设备驱动程序?
在尝试在 c 程序中打开设备文件之前,是否需要进行此初始化?
这些答案在网上很难找到,而且很多资源已经过时。 谢谢
一个很好的资源是Linux 设备驱动程序。 可以在这里找到更短更简单的解释。
创建文件驱动程序时,您将在文件操作(fops)中实现一些功能:
open
close
read
write
seek
并非所有 function 都必须实现。 例如,如果未实现write
,则您的设备将不支持写入。
当我通过分配主设备号并调用 mknod 创建文件来加载设备驱动程序时,文件是否“打开”?
创建/dev
文件时,您的模块仅是inited 。 像init_module
这样的 function 被调用
删除文件后,您的模块将被deinited 。 调用了类似module_cleanup
的 function。
state 是在 /proc/devices 中初始化并在 /dev 中创建文件时的设备驱动程序?
在这种情况下,模块已启动,文件未打开。
如果它没有打开,那么读/写不应该像从命令行那样工作,或者我是这么想的?
当您从命令行读取文件时,文件是打开的,读取然后关闭,作为用户,您不必显式地打开/关闭文件。
如果您是 C 程序员,情况就不同了,在这种情况下,您必须明确地打开、读取、关闭文件。
您可以检查在 kernel 代码中添加跟踪(使用printk
将一些信息打印到 kernel 控制台,使用dmesg
读取它)或使用strace
将跟踪系统调用。
在尝试在 c 程序中打开设备文件之前,是否需要进行此初始化?
让我们继续:
module_init
,文件在/dev
中不存在module_cleanup
, /dev
中不存在该文件open
、 close
、 read
和write
function。 通常在open
和close
之间调用read
/ write
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.