繁体   English   中英

Linux 中的字符设备驱动程序读/写

[英]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 程序中打开设备文件之前,是否需要进行此初始化?

让我们继续:

  • 第一个调用的 function 在调用之前是module_init ,文件在/dev中不存在
  • 最后调用的 function 调用后会是module_cleanup/dev中不存在该文件
  • 在 init 和 cleanup 之间,可以调用不同的openclosereadwrite function。 通常在openclose之间调用read / write

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM