凡亿教育-童童
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 电子小白如何看懂Linux进程加载程序?
电子小白如何看懂Linux进程加载程序?

在Linux系统中,当用户在Shell界面输入一个可执行文件名并按下回车键时,一系列复杂步骤随即展开,旨在将可执行文件加载到内存中,并创建新的进程来执行,这一过程不仅涉及底层操作系统的资源管理,还体现了现代操作系统的多任务处理和内存管理机制。

image.png

1、启动新进程

  • 用户通过shell输入./可执行文件名命令。

  • Shell识别这不是内建命令,调用fork()系统调用来创建一个新进程,作为shell的子进程。

  • fork()通过sys_fork()函数实现,为新进程分配一个唯一的进程号(PID),并初始化其进程控制块(task_struct)。

2、初始化task_struct

  • 内核为新进程分配一块内存,用于存储task_struct和内核栈。

  • 复制父进程(shell)的task_struct到新进程,并进行必要的个性化设置,如PID、父进程ID、时间片、TSS段等。

3、内存映射与分页

  • 为新进程创建或复制页表,并设置相应的页面目录。

  • 确定新进程的代码段、数据段、BSS段的基地址和限长,这些信息来源于可执行文件的头部信息。

4、全局描述符表(GDT)关联

将新进程的TSS(任务状态段)和LDT(局部描述符表)挂接到GDT的相应位置,确保进程切换时能够正确恢复和保存上下文。

5、设置进程状态

将新进程的状态设置为就绪,等待CPU调度执行。

6、加载可执行文件

  • 调用execve()系统调用(通过do_execve()函数实现),解析可执行文件的头部信息。

  • 根据可执行文件的格式(如ELF),将必要的段(代码、数据、BSS等)加载到内存中。

  • 初始化新进程的栈,包括环境变量、命令行参数等。

  • 更新task_struct中的相关内存映射信息,确保新进程能够正确访问其内存空间。

本文凡亿教育原创文章,转载请注明来源!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论