1. 在busybox中先进入main函数
2. 根据调用号进入ash_main(也就是busybox的shell)
3. 进入cmdloop(1)中for循环
4. 在parsecmd中解析标准输入
5. 此时在控制台上输入./a_static执行(a_static为我的elf格式的应用程序)
6. shell解析出命令退出parsecmd进入evaltree再进入evalcommand
7. 调用forkshell创建子线程,该子线程用来执行a_static,父进程发布wait等待子线程
8. 子线程被调度后进入shellexec再进入tryexec再进行系统调用execve加载用户空间
9. arm中通过swi xxx (xxx为系统调用号)进入软中断向量,再进入vector_swi,保存硬件上下文,此时根据 lr-4 也就是swi指令的后半部
确定系统调用号,根据sys_call_table中的调用号偏移找到入口函数这里是sys_execve并执行
10. 此时我们的用户空间和父进程一样,TTB中的页表基地址是父进程的页表基地址
11. 调用do_execve为线程申请用户空间
12. 退出do_execve,这时我们有了新的用户线性区(我们这边打印出来有四个线性区)和页表,TTB也已经指向自己的页全局目录
线性区:
8000 88000 代码区
8f000 90000 数据区
90000 92000 堆区
be9b7000 be9d9000 栈+命令行参数+环境变量
13. 退出sys_execve,pop出内核栈中的硬件上下文
原文:https://www.cnblogs.com/genshu123/p/11867708.html