zoukankan      html  css  js  c++  java
  • 9.应用程序如何访问驱动

                    应用程序如何访问驱动

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

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

    源码:

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <sys/types.h>
     4 #include <sys/stat.h>
     5 #include <fcntl.h>
     6 
     7 int main()
     8 {
     9     int dst = 0;
    10     int fd = 0;
    11     fd = open("/dev/memdev",O_RDWR);    //打开设备文件
    12     read(fd,&dst,sizeof(int));         //写入数据
    13     printf("dat is %d
    ",dst);  
    14     close(fd);    //关闭设备
    15     return 0;
    16 }

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

    一、进入代码分析阶段

    1.1使用静态编译编译并且反汇编

    [root@localhost lesson1]#arm-linux-gcc -static -g read.c -o read
    [root@localhost lesson1]# arm-linux-objdump -D -S read >dump

      接着打开dump: vim dump

      使用底行模式搜索:main函数:/main(一般来说我们搜索的是main这里我直接搜索sizeof)

    我们主要是看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文件因此我们支架跳入call.S文件中

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

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

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

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

    总结:

     

  • 相关阅读:
    「SAP技术」SAP MM MB5M报表不显示特殊库存数据
    python-day3-条件判断与循环
    python-day2-运算符
    Mysql数据库意外崩溃导致表数据文件损坏无法启动的问题解决
    图书管理系统(Servlet+Jsp+Java+Mysql,附下载演示地址)
    求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法
    HTML+CSS+JavaScript实现植物大战僵尸(附演示地址)
    面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
    面试官:手撕十大排序算法,你会几种?
    用x种方式求第n项斐波那契数,99%的人只会第一种
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5345963.html
Copyright © 2011-2022 走看看