首页 > 其他 > 详细

16、驱动访问大揭秘

时间:2016-02-14 00:26:54      阅读:204      评论:0      收藏:0      [点我收藏+]

技术分享

应用程序主要是通过系统调用来访问驱动程序图。

接下来我们以read.c应用程序来分析:

我们知道read.c是个系统调用,系统调用之前,他是在我们的应用程序当中。实现是在内核当中,但是read.c是怎么找到内核的实现代码的呢?接下来就是这内容:

 

 

 

 

 

这是read.c的代码:

技术分享

我们现在静态编译和反汇编:

技术分享

然后打开dump:搜索:main函数:/main

我们主要是看read方法是如何实现的:

技术分享

这个代码主要做了两件工作:

第一件是把我们read的三个参数传到我们的r0-r2里面去,保存起来。我们都知道在arm系统中,当参数小于4个时是采用通用寄存器来保存参数。第二件就是去调用libc_read.

技术分享

这里最重要的是两行代码:

Mov r7,#3 ;0x3

Svc 0x00000000

从上面看到,read的主要的工作是把3传给r7,然后使用svc这个命令,叫做系统调用指令。当我们使用了这个指令之后。我们的pc指针会从用户空间进入到内核空间,而且入口是固定的,其次就是内核如何处理的问题了。

1.首先是pc指针进入内核的固定入口。

2.其次,内核回去取这个number,就是3.(3代表的是,从统一的入口进入后,我要去调用read的实现代码)。

3.第三是根据number去查这个表,查出来的3是read所对应的内核系统的实现代码sys_read.

 

 

这是证明上面的说法:

首先找固定的入口:

技术分享

这就是入口的系统代码,我们从注释可以清楚的看到。这是取得系统调用的编号。

接着就是根据这编号去查表了,接着往下找,就可以看到sys_call_table.

技术分享

通过搜索,找到了这张表:

技术分享

我们看到他紧接着又去包含call.S:

技术分享

这是一个包含了很多函数的一张表,然后系统根据我们的number=3,去找到对应的函数。上面知道,我们传进来的number是等于3的。利用3这个标号找这个表,找出来的正好是sys_read这个函数。

接下来就是分析sys_read是咋实现的啦,该函数是在read_write.c中。

技术分享

通过宏定义的替换,就会变成sys_read.最重要的是调用vfs_read函数。

技术分享

 

//其中最重要的是上面这个函数。当我们初始化驱动程序的时候,就会给设备指定一个file_operation结构,然后使用read这个设备指针来调用。这个设备指针就是我们在驱动程序实现的设备方法。

技术分享

总结图:

技术分享

16、驱动访问大揭秘

原文:http://www.cnblogs.com/FORFISH/p/5188457.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!