Linux中的分段:分段和分页是多余的?

cla*_*aws 5 paging operating-system linux-kernel

我正在读"理解Linux内核".这是解释Linux如何使用我不理解的分段的片段.

分段已包含在80 x 86微处理器中,以鼓励程序员将其应用程序拆分为逻辑相关的实体,例如子程序或全局和本地数据区域.但是,Linux以非常有限的方式使用分段.事实上,分段和分页有点多余,因为两者都可以用来分离进程的物理地址空间:分段可以为每个进程分配不同的线性地址空间,而分页可以将相同的线性地址空间映射到不同的物理地址空间.由于以下原因,Linux更喜欢分页分段:

当所有进程使用相同的段寄存器值时,即当它们共享同一组线性地址时,内存管理会更简单.

Linux的设计目标之一是可移植到各种架构; 特别是RISC架构对分段的支持有限.

在用户模式下运行的所有Linux进程都使用相同的段对来处理指令和数据.这些段分别称为用户代码段和用户数据段.类似地,在内核模式下运行的所有Linux进程都使用相同的段对来处理指令和数据:它们分别称为内核代码段和内核数据段.表2-3显示了这四个关键段的段描述符字段的值.

我无法理解第一段和最后一段.

小智 7

80x86系列CPU通过将称为段寄存器的CPU寄存器的内容添加到程序计数器的内容来生成实际地址.因此,通过更改段寄存器内容,您可以更改程序访问的物理地址.通过将相同的虚拟地址映射到不同的实际地址,分页执行类似的操作.Linux使用后者 - Linux进程的段寄存器将始终具有相同的不变内容.

  • 在保护模式下,实际上并不是段寄存器本身的内容被添加到地址中; 段寄存器包含对段描述符的引用(存储在存储器中,在描述符表中),并且段描述符的字段之一是段的基址,其被添加到偏移以生成线性地址. (7认同)

typ*_*eaf 6

分段和分页完全没有多余.Linux操作系统完全包含需求分页,但它不使用内存分段.这为所有任务提供了32/64位的平坦,线性,虚拟地址空间.

分页为内存地址转换添加了另一层抽象.通过分页,线性存储器地址被映射到存储器页面,而不是直接转换为物理存储器.由于页面可以交换进出物理RAM,因此分页允许分配比物理可用内存更多的内存.只有正在使用的页面才需要映射到物理内存中.

页面交换的替代方法是段交换,但由于段通常大于页面,因此效率通常低得多.

存储器的分段是一种为不同目的分配多个存储器块(每个任务)并允许这些块彼此保护的方法.在Linux中,任务的代码,数据和堆栈部分都映射到单个内存段.

32位处理器没有用于禁用分段的模式位,但是通过将堆栈,代码和数据空间映射到相同范围的线性地址可以实现相同的效果.32位处理器指令使用的32位偏移量可以覆盖4千兆字节的线性地址空间.

另外,英特尔文档声明:

没有最小分页的平面模型需要具有一个代码和一个数据段描述符的GDT.还需要第一个GDT条目中的空描述符.具有分页的平面模型可以为管理员模式提供代码和数据描述符,并为用户模式提供另一组代码和数据描述符

这就是拥有一对CS/DS用于内核权限执行(环0)和一对CS/DS用于用户权限执行(环3)的原因.

简介:分段提供了一种隔离和保护内存部分的方法.分页提供了一种分配更多内存的方法,即物理上可用的内存.