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

乔希

我写了一个字符设备驱动程序,我相信它应该可以工作。

我想测试读/写功能。在另一个堆栈溢出问题上,显然这可以通过写入 /dev 中的设备文件并回显输出来完成。

我不明白这是如何工作的:

当我通过分配主编号并调用 mknod 创建文件来加载我的设备驱动程序时,文件是否“打开”?如果它没有打开,那么从命令行读取/写入不应该像那样工作,或者我认为?

在 /proc/devices 中初始化并在 /dev 中创建文件时,设备驱动程序处于什么状态?

在尝试在 ac 程序中打开设备文件之前,是否需要进行此初始化?

这些答案在网上很难找到,而且很多资源已经过时了。谢谢

马修

一种很好的资源是Linux 设备驱动程序可以在此处找到更简短更简单的解释

创建文件驱动时,会在文件操作(fops)中实现一些功能:

  • open
  • close
  • read
  • write
  • seek
  • ...

并非所有功能都必须实现。write例如,如果未实现,您的设备将不支持写入。

当我通过分配主编号并调用 mknod 创建文件来加载我的设备驱动程序时,文件是否“打开”?

/dev被创建的文件,你的模块仅inited一个类似的函数init_module被调用

删除文件后,您的模块将被取消一个类似的函数module_cleanup被调用。

在 /proc/devices 中初始化并在 /dev 中创建文件时,设备驱动程序处于什么状态?

在这种情况下,模块被初始化,文件没有打开。

如果它没有打开,那么从命令行读取/写入不应该像那样工作,或者我认为?

当您从命令行读取文件时,文件是打开的,读取然后关闭,作为用户,您不必关心显式打开/关闭文件。

如果您是 C 程序员,情况就不一样了,在这种情况下,您必须明确地打开、读取、关闭文件。

您可以检查是否在内核代码中添加跟踪(用于printk将一些信息打印到内核控制台,使用 读取它dmesg)或使用strace它将跟踪系统调用。

在尝试在 ac 程序中打开设备文件之前,是否需要进行此初始化?

让我们继续:

  • 调用的第一个函数将module_init调用之前,该文件不存在于/dev
  • 最后调用的函数将module_cleanup在它被调用之后,该文件不存在于/dev
  • init和cleanup之间,你可以调用不同的openclosereadwrite功能。通常read/writeopen之间调用close

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章