概述:我们查阅大量资料试图寻找程序被执行过程的说明,发现基本上围绕着预处理、编译、汇编、链接(分别使用预处理器、编译器、汇编器、链接器,这四个程序构成了编译系统)四个步骤,将其翻译成可执行目标程序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