首页 > 系统服务 > 详细

解析Linux中shell执行一次命令的全过程

时间:2019-11-15 17:48:20      阅读:116      评论:0      收藏:0      [点我收藏+]

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出内核栈中的硬件上下文

 

 

 

 

解析Linux中shell执行一次命令的全过程

原文:https://www.cnblogs.com/genshu123/p/11867708.html

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