您的位置 首页 被动

Linux加载程序的过程

Linux加载程序的步骤-一个进程在内存中主要占用了以下几个部分,分别是代码段、数据段、BSS,栈,堆,等参数。其中,代码、数据、BSS的内容是可执行文件中对应的内容,加载程序并不是把它们的内容从可执行程序中填充到内存中,而是将它们的信息(基地址、长度等)更新到进程控制块(task_struct)中,当CPU第 一次实际寻址执行的时候,就会引起缺页中断,操作系统再将实际的内容从可执行文件中复制内容到物理内存中。

一个进程在内存中首要占用了以下几个部分,分别是代码段、数据段、BSS,栈,堆,等参数。其间,代码、数据、BSS的内容是可履行文件中对应的内容,加载程序并不是把它们的内容从可履行程序中填充到内存中,而是将它们的信息(基地址、长度等)更新到进程操控块(task_struct)中,当CPU第 一次实践寻址履行的时分,就会引起缺页中止,操作体系再将实践的内容从可履行文件中仿制内容到物理内存中。
       堆的内容是程序履行中动态分配的,所以加载程序 仅仅将它的开端地址更新到进程操控块中,履行进程中遇到动态分配内存的操作的时分再在物理内存分配实践的页。参数区在新进程加载的时分要存入环境变量和指令行参数列表。栈在程序加载时分存入的内容便是环境参数列表和指令行参数列表的指针和指令行参数的个数。

Linux加载程序的进程

       1)在shell界面输入./可履行文件名

经shell剖析,该参数非shell内建指令,则认为是加载可履行文件。所以调用fork函数开端创立新进程,发生0x80中止,映射到函数sys_fork()中,调用find_empty_process()函数,为新进程请求一个可用的进程号。

2)为可履行程序的办理结构找到存储空间

为了完结对进程的维护,体系为每个进程的办理专门规划了一个结构,即task_struct。内核经过调用get_free_page函数取得用于保存task_struct和内核栈的页面只能在内核的线性地址空间。

3)shell进程为新进程仿制task_struct结构

为可履行程序仿制了task_struct后,新进程便承继了shell的悉数办理信息。但由于每个进程呢的task_struct结构中的信息是不一样的,所以还要对该结构进行个性化设置(为避免在设置的进程中被切换到该进程,应先设置为不行中止状况)。个性化设置首要包含进程号、父进程、时刻片、TSS段(为进程间切换而规划的,进程的切换时树立在对进程的维护的基础上的,在进程切换时TSS用来保存或康复该进程的现场所用到的寄存器的值)。这些都是经过函数copy_process来完结的。

4)仿制新进程页表并设置其对应的页目录项

现在调用函数copy_mem为进程分段(LDT),更新代码段和数据段的基地址,即确认线性地址空间(关键在于确认段基址和限长)。接着便是分页,分页是树立在分段的基础上的。

5)树立新进程与大局描述符(GDT)的相关

将新进程的TSS和LDT挂接在GDT的指定方位处。(注:TSS和LDT对进程的维护至关重要)

6)将新进程设置为安排妥当状况

7)加载可履行文件

进入do_execve函数之后,将可履行文件的头表加载到内存中并检测相关信息。加载履行程序(讲程序按需加载到内存)。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/98266.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部