您的位置首页>企业动态>

Linux加载程序的步骤

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux加载程序的步骤问题。一个进程在内存中主要占用以下几个部分,分别是代码段、

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux加载程序的步骤问题。

一个进程在内存中主要占用以下几个部分,分别是代码段、数据段、BSS、栈、堆等参数。其中,代码、数据、BSS的内容是可执行文件中对应的内容。加载程序更新它们的信息(基址、长度等),而不是将它们的内容从可执行程序填充到内存中。)放入过程控制块(task_struct)。当CPU第一次实际寻址执行时,会造成页面故障中断,操作系统会将实际内容从可执行文件复制到物理内存中。

堆的内容是在程序执行过程中动态分配的,因此加载器只将其起始地址更新到进程控制块,然后在执行过程中遇到动态分配内存的操作时,在物理内存中分配实际页面。加载新进程时,参数区域应存储在环境变量和命令行参数列表中。程序加载时,栈中存储的内容是环境参数表和命令行参数表的指针以及命令行参数的个数。

1)输入。shell界面中的可执行文件名。

经过shell分析,这个参数不是shell的内置命令,所以被认为是加载可执行文件。然后调用fork函数开始创建新进程,并生成0x80中断,该中断映射到sys_fork()函数,并调用find_empty_process()函数为新进程申请一个可用的进程号。

2)为可执行程序的管理结构找到存储空间。

为了保护进程,系统专门为每个进程设计了一个管理结构,即task_struct。通过调用get_free_page函数保存task_struct和内核堆栈得到的页面只能在内核的线性地址空间中。

3)外壳进程复制新进程的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函数后,将可执行文件的头表加载到内存中,并检测相关信息。执行程序(假设程序根据需要加载到内存中)。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。