⑴ linux驱动开发第2讲:应用层的write如何调用到驱动中的write
在Linux操作系统中,一切都以文件的形式呈现,包括文件、目录、设备、socket套接字和管道。这种文件抽象使得基于Linux的编程转变为面向文件的编程,对应用程序开发者来说十分便捷。
然而,对于内核开发者而言,情况则有所不同。尽管应用程序可以通过open、write、read等函数操作一切,但在内核中,需要不同的驱动部分来真正实现这些操作。本文将深入探讨Linux应用程序中的write()函数如何调用到特定驱动(如hello驱动)内的write()函数,并解答上一讲遗留的问题。
流程图说明如下:应用层调用系统调用,系统调用再通过软中断方式进入内核空间,最终由内核处理数据。需要注意的是,应用空间与内核空间彼此隔离,因此系统调用需要通过_from_user函数将应用层数据复制到内核空间,才能进行处理。
系统调用如何知道调用哪个驱动的函数呢?答案隐藏在驱动初始化阶段。在hello驱动中,通过定义主次设备号并在init函数中建立gDev和gFile之间的关系,然后通过cdev_init、cdev_add等函数进一步建立了gFile与主次设备号之间的关联。这样,当应用层尝试访问特定文件(如/dev/hello)时,已经建立了与对应驱动(hello驱动)的关联。
实际上,当应用层打开文件后,已经与驱动中的struct file建立了对应关系,同时与struct file_operations也建立了关联。在Linux内核中,struct file_operations用于描述文件的操作,而struct file则用于表示打开的文件。因此,应用层的write操作通过系统调用进入内核空间后,内核会根据主次设备号查找对应的struct file_operations,进而调用相应驱动内的write函数。
在内核的write系统调用实现中(位于fs/read_write.c),关键在于判断并调用特定驱动的write函数。通过检查struct file_operations中是否包含write函数的实现,系统调用最终调用到hello驱动内的write函数。由于hello驱动中的write函数实现了预期功能,因此应用层的write操作得以成功执行并返回。
要使测试程序中的write和read操作返回非零值,只需在驱动中修改write函数的返回值即可。通过自行测试,你可以验证这一过程并深入理解Linux驱动与应用程序之间的交互机制。
⑵ linux驱动怎么读写文件
struct file_operations scull_fops = {
.read = scull_read,
.write = scull_write,
.open = scull_open,
};
在linux驱动中比较重要的结构体 file_operations里面实现 驱动读写的功能