我写了一个字符设备驱动程序,我相信它应该可以工作。
我想测试读/写功能。在另一个堆栈溢出问题上,显然这可以通过写入 /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
open
,close
,read
和write
功能。通常read
/write
在open
和之间调用close
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句