本文就来揭秘一下到底一个驱动的接口函数是如何被调用的:
首先我们来反汇编读驱动的程序:
跳转到__libc_read,发现他把r7赋值给3,3是传过去的参数,然后调用svc指令,进入内核态相应的入口:
接下来就已经进入内核态,入口函数中将存入r7中的3取出。
然后加载一张表,表名是sys_call_call,根据这个表中内容,断定3到底是对应什么操作:
这个表如下,可以看出表中第三项对应CALL(sys_read),也就是说传进的参数3代表要执行sys_read:
Sys_read对应函数实现如下图:
其中的vfs_read实现如下图,他获取了要读的那个文件的file对象,然后调用file->f_op->read,这正是我们写驱动的时候编写的接口函数: