请稍侯

ELF文件的装载与Linux的进程

02 December 2020

ELF文件的装载与Linux的进程

进程的虚拟地址空间
查看进程虚拟空间分布

cat /proc/<pid>/maps

PAE(物理地址扩展)
在CPU字长不变的情况下,扩展地址线长度,修改页映射方式,便使新映射方式可以访问更多的物理内存。

程序的动态装载方法:覆盖装入(Overlay)、页映射(Paging)

可执行文件的装载:
1.进程的建立; 2.页错误;

Segment(程序头) 与 Section(段表)
Segment 是从装载的角度重新划分ELF的各个段;

# 使用静态链接方式编译链接可执行文件
gcc -static SectionMapping.c -o SectionMapping.elf  

# 使用 readelf 查看可执行文件
readelf -S SectionMapping.elf

# 使用 readelf 命令来查看 ELF 的 Segment
readelf -l SectionMapping.elf

进程的VMA

  • 代码VMA:权限只读、可执行;有映像文件;
  • 数据VMA:权限可读写、可执行;有映像文件;
  • 堆VMA:权限可读写、可执行;无映像文件,匿名,可向上扩展;
  • 栈VMA:权限可读写、不可执行;无映像文件,匿名,可向下扩展;

段地址对齐
默认页大小4096字节。优化空间和地址安排,让那个各个段接壤部分共享一个物理页面,然后将该物理页面分别映射两次。

进程栈的初始化:栈顶寄存器esp指向的位置是初始化以后堆栈的顶部。

Linux内核装载ELF的过程

  1. 检查ELF可执行文件格式的有效性,如魔数、程序度表中Segment的数量;
  2. 寻找动态链接.interrp段,设置动态链接路径;
  3. 根据程序头表的描述,对ELF文件进行映射,如代码、数据、只读数据;
  4. 初始化ELF进程环境,如进程启动时EDX寄存器的地址应该是DT_FINT的地址;
  5. 将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式;