字符设备驱动(二)
程序员文章站
2022-03-30 12:25:08
...
在字符设备驱动(一)那节中,我们学习了一个字符设备驱动程序设计的大体框架。但是字符设备驱动是如何实现的呢,这节我们就来深入理解一下内核驱动是怎么和应用程序联系在一起的。
首先我们在linux中创建一个read_mem.c的文件,如下图。
然后对其静态链接
arm-linux-gcc -static -g read_mem.c -o read_mem
然后对其反汇编,并将其放到dump文件中
arm-linux-objdump -D -S read_mem >dump
打开dump
vi dump
找到read函数执行的部分,发现首先将各类参数放到通用寄存器r1—-r4中,然后调用了_libc_read,再找到_libc_read部分。如下图。
_libc_read汇编代码很多,这里主要看红色框框里面的两行代码的内容,将3数值传给r7,然后再执行svc指令。
svc是系统调用指令,当执行这个指令的时候,pc指针会从用户空间进入到内核空间,进入内核空间的时候有一个固定的入口,然后取系统调用的编号number,这里就是取的3,根据这个编号去查表,这个可以参考之前我的系统调用那节,里面讲解的较详细,可以通过那节了解应用程序read怎么找到内核中的sys_read。
这里我主要说一下sys_read是怎么实现的:
1 内核源码Read_write.c这个文件包括了sys_read代码,通过形参中文件描述符fd会找到struct file,然后再利用struct file调用vfs_read函数。
2 在vfs_read函数中,利用所找到的struct file中的file_operation,file_operation中就存放着xxx_read设备方法,也就是上节我们实现的mem_read设备方法,这样就找到了mem_read这个设备方法并且调用它了。
以上就是应用程序一步一步如何找到xxx_read的内核代码,通过这个步骤的学习便于我们更好的了解设备驱动程序。