第六章
可执行文件只有装载到内存以后才能被CPU执行。
进程:程序运行时的一个过程。
C 语言指针大小的位数与虚拟空间的位数相同。
装载方式
覆盖装入
程序用到哪个模块就将哪个模块装入,如果不用就在内存不装入,放在磁盘。
箭头是依赖关系,互不依赖的模块可以覆盖放置在同一片内存。如果模块没有在内存,需要从磁盘或其他存储器读取,时间换取空间。
页映射
将内存和磁盘中的数据和指令按照“页(page)”为单位划分。
可执行文件的装载
进程的建立
- 创建虚拟地址空间。
- 读取可执行文件头,并建立虚拟空间与可执行文件的映射关系。
- 将CPU指令寄存器设置成可执行文件入口,启动运行。
进程虚拟空间的分布
划分虚拟空间的基本原则是将相同权限属性的、有相同映像文件的映射组成一个VMA。
段地址对齐
页是映射的最小单位,假如操作系统的默认页大小是4096字节,那么在映射一段物理内尺寸和虚拟地址空间的时候,这段内存空间的长度必须是4096的整数倍。
段 | 起始虚拟地址 | 大小 | 长度 | 偏移 | 权限 |
---|---|---|---|---|---|
SEG0 | 0x08048000 | 0x1000 | 127 | 34 | r-x |
SEG1 | 0x08049000 | 0x3000 | 9899 | 164 | rw- |
SEG2 | 0x0804C000 | 0x1000 | 1988 | r-- |
这种对齐方式会造成许多内存碎片。
解决方式:让各个段接壤部分共享一个物理页面,然后将该物理页面分别映射两次。
个人理解:数据在物理内存上连续存储,对于同时存储了两个段的物理页做两次映射。
// todo