linux驱动开发第2讲:应用层的write如何调用到驱动中的write

在Linux操作系统中,一切都以文件的形式呈现,包括文件、目录、设备、套接字和管道。
这种文件抽象将基于Linux的编程变成了面向文件的编程,这对于应用程序开发人员来说非常方便。
然而,对于内核开发者来说,情况就不同了。
虽然应用程序可以通过打开、写入、读取等函数来处理所有事情,但内核中需要几个驱动程序部分来实际实现这些操作。
本文将深入探讨Linux应用程序中的write()函数如何调用特定驱动程序(例如hello驱动程序)中的write()函数,并回答上一课留下的问题。
流程图如下:应用层调用系统调用,系统调用通过软中断进入内核空间,最后内核处理数据。
需要注意的是,应用程序空间和内核空间是相互隔离的,因此系统调用必须通过copy_from_user函数将应用层数据复制到内核空间才可以进行处理。
系统调用如何知道要调用哪个驱动程序函数?答案在于驱动程序初始化阶段。
在hello驱动中,gDev和gFile之间的关系是通过在init函数中定义主设备号和从设备号来建立的,然后通过cdev_init和cdev_add等函数进一步建立gFile和主设备号和从设备号之间的关联。
这样,当应用层尝试访问特定文件(如/dev/hello)时,就会与相应的驱动程序(hellodriver)建立关联。
实际上,应用层打开文件时,就已经和驱动中的structfile建立了对应关系,也和structfile_operations关联起来。
在Linux内核中,structfile_operations用于描述文件操作,而structfile用于表示打开的文件。
因此,应用层写操作通过系统调用进入内核空间后,内核会根据主、辅设备号找到对应的structfile_operations,然后调用对应驱动中的write函数。
在实现内核写系统调用(位于fs/read_write.c)时,关键是确定并调用特定驱动程序的写函数。
检查structfile_operations是否包含write函数的实现,系统调用最终调用hello驱动中的write函数。
由于hello驱动中的write函数实现了预期的功能,因此应用层写操作被执行并成功返回。
要使测试程序中的写入和读取操作返回非零值,只需更改驱动程序中写入函数的返回值即可。
通过亲自测试,您可以验证这个过程,并更深入地了解Linux驱动程序和应用程序之间的交互。

嵌入式做底层好还是应用层好?

嵌入式领域的底层和应用层之间,哪条路最适合你?就我个人而言,我参与了底层驱动程序和BSP开发,以及MCU和Linux应用程序开发。
根据这些经验,我相信最适合你的技术堆栈和研究是最重要的。
底层和应用程序各有优缺点。
重要的是找到最适合自己的发展道路。
基础开发包括Linux系统定制、SOC移植、外设驱动开发等,目的是使系统正常工作。
应用层重点是在运行的Linux系统上实现特定的功能,例如接收和转发H265数据。
选择路径应考虑个人兴趣和技术活动。
底层开发侧重于Linux系统基础和SOC功能,而应用程序开发则需要多线程、互斥、网络通信等理论知识。
两者都是融合发展不可或缺的组成部分。
关键是要匹配你的技术堆栈和个人兴趣。
例如,底层工程师专注于底层系统的优化和集成,而应用工程师则专注于具体功能的实现和系统的集成。
两者相辅相成,没有绝对的区别。
重要的是找到个人兴趣和技术技能的结合点,实现个人职业发展和技术成长。
在选择集成开发方向时,我们建议从个人技术兴趣出发,结合个人技术栈范围来选择适合自己的路径。
无论是底层还是应用都需要深厚的技术积累和不断的学习。
关键是找到适合你的技术领域。
一旦您了解了低级开发和应用程序开发之间的区别,您将能够更好地评估您的兴趣和技能,并做出最适合您的选择。
无论是底层还是应用,关键是要不断学习、不断实践,不断提高自己的技术水平。
希望本次分享能给大家提供参考,也欢迎对集成开发感兴趣的朋友一起讨论。
我是Snowdream,我专注于自动化和集成技术,我迫不及待地想与您一起成长。