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