linux驱动说开去(四)--程序执行

概述:我们查阅大量资料试图寻找程序被执行过程的说明,发现基本上围绕着预处理、编译、汇编、链接(分别使用预处理器、编译器、汇编器、链接器,这四个程序构成了编译系统)四个步骤,将其翻译成可执行目标程序hello这样一个过程,究竟hello可执行程序是如何被运行的我们依旧是一头雾水,究其原因上述只是一个浅显的概念,那从操作系统层面来讲具体又是如何实现的呢?接下来我们将给出答案.

预处理、编译、汇编、链接流程图:

编译流程要清楚程序具体的执行过程是一个繁重的任务,并非三言两语能够解释清楚,这也是我写这个系列的目的所在.

这一章节我们先做一个简单的概述,后面将围绕这些概述做详细的解剖

从操作系统层面而言,程序的执行分2层:应用态、内核态

应用态:应用层hello.c的执行过程

内核态:应用程序的加载(进程管理)、内存管理、内核加载.ko文件、当前程序以进程展现的各种状态(运行、结束)、如何访问硬件资源

1.进程管理       

        

shell@sc2410_box:/system/bin # ./hello &                                       
[1] 1998
shell@sc2410_box:/system/bin # langtype=chinese:Ni hao leon.
langtype=pinyin:ni hao! leon.
langtype=english:Hello! leon.

shell@sc2410_box:/system/bin # ps |grep hello
root      1998  1993  912    300   c005e530 b6f445ac S ./hello

        fork:系统首先会调用fork创建一个进程,去加载hello这个可执行程序

  execve: 在fork内部会调用execve将hello文件进行识别、加载入内存、切换进程执行hello

 经上述步骤后hello编真正进入执行过程,即cpu开始执行hello二进制命令

  exit:程序执行后系统对各资源的回收

2.文件加载

        hello可执行程序push到板子上的一个路径下,去执行加载的时候如何由路径找到具体的文件呢,这就涉及到文件系统的作用了,如hello放于/system/bin目录,假设该目录对应实际文件系统为ext2,现在对此做一个大体的描述:

        1.adb push hello /system/bin

            改命令会调用系统命令create在/system/bin创建hello并将pc机下hello的内容写入,此时ext2文件系统会创建该文件的节点    信息

        2.execve在根据path找hello时会通过VFS->ext2找到hello的文件节点信息,并将内容映射到内存

        3.执行途中如修改磁盘文件则会进行回写

3.内存管理

        内存管理分2块:虚拟内存、物理内存

        虚拟内存:如cpu为32位地址总线,理论寻址范围为2^32

        物理内存:如当前物理内存为1G

        虚拟内存远大于物理内存,但在实际过程中将内存分页(如4k)我们并非一次将程序所有指令全部调入内存,只调入所在指令当前分页进内存,如不在需要则进行废弃页面处理,

4.驱动模块加载

        应用程序依赖的.ko模块又是如何加载被内核所示别的呢?

    在执行指令insmod时会进入init_module调用,最终会执行module_init()内的hello_mod_init


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值