《程序员的自我修养》第三部分小结

第六章

可执行文件只有装载到内存以后才能被CPU执行。

进程:程序运行时的一个过程。

C 语言指针大小的位数与虚拟空间的位数相同。

装载方式

覆盖装入

程序用到哪个模块就将哪个模块装入,如果不用就在内存不装入,放在磁盘。

image-20211107214506653

箭头是依赖关系,互不依赖的模块可以覆盖放置在同一片内存。如果模块没有在内存,需要从磁盘或其他存储器读取,时间换取空间

页映射

将内存和磁盘中的数据和指令按照“页(page)”为单位划分。

image-20211107215141553

可执行文件的装载

进程的建立

  1. 创建虚拟地址空间。
  2. 读取可执行文件头,并建立虚拟空间与可执行文件的映射关系。
  3. 将CPU指令寄存器设置成可执行文件入口,启动运行。

进程虚拟空间的分布

划分虚拟空间的基本原则是将相同权限属性的、有相同映像文件的映射组成一个VMA。

image-20211107220312214

段地址对齐

页是映射的最小单位,假如操作系统的默认页大小是4096字节,那么在映射一段物理内尺寸和虚拟地址空间的时候,这段内存空间的长度必须是4096的整数倍。

起始虚拟地址 大小 长度 偏移 权限
SEG0 0x08048000 0x1000 127 34 r-x
SEG1 0x08049000 0x3000 9899 164 rw-
SEG2 0x0804C000 0x1000 1988 r--

这种对齐方式会造成许多内存碎片。

解决方式:让各个段接壤部分共享一个物理页面,然后将该物理页面分别映射两次。

个人理解:数据在物理内存上连续存储,对于同时存储了两个段的物理页做两次映射。

image-20211107222845929

// todo

第七章

第八章

第九章

原文地址:https://www.cnblogs.com/weirwei/p/15522138.html