Operating system Linux中的分段:分段和;寻呼是多余的吗?

Operating system Linux中的分段:分段和;寻呼是多余的吗?,operating-system,linux-kernel,paging,Operating System,Linux Kernel,Paging,我正在读“理解Linux内核”。这是一段解释Linux如何使用我不理解的分段的代码片段 分段已包含在80 x中 86个微处理器鼓励 程序员要分开他们的工作 逻辑相关的应用程序 实体,如子例程或 全球和本地数据区。然而, Linux以非常简单的方式使用分段 有限的方式。事实上,分割 而且分页有些多余, 因为两者都可以用来分开 的物理地址空间 进程:分段可以指定一个 不同的线性地址空间 进程,而分页可以映射相同的 将线性地址空间转换为不同的 物理地址空间。Linux更喜欢 分页到 原因如下: 内存管

我正在读“理解Linux内核”。这是一段解释Linux如何使用我不理解的分段的代码片段

分段已包含在80 x中 86个微处理器鼓励 程序员要分开他们的工作 逻辑相关的应用程序 实体,如子例程或 全球和本地数据区。然而, Linux以非常简单的方式使用分段 有限的方式。事实上,分割 而且分页有些多余, 因为两者都可以用来分开 的物理地址空间 进程:分段可以指定一个 不同的线性地址空间 进程,而分页可以映射相同的 将线性地址空间转换为不同的 物理地址空间。Linux更喜欢 分页到 原因如下:

内存管理在所有 进程使用相同的段 注册值,即 共享同一组线性 地址

Linux的设计目标之一 是否可移植到广泛的 建筑;中的RISC架构 特别是,我们对这方面的支持有限 分割

所有Linux进程都在用户环境中运行 模式使用相同的一对线段 地址说明和数据。这些 段称为用户代码段 和用户数据段。 同样,所有Linux进程都在运行 在内核模式下,使用同一对 用于处理指令和 数据:它们被称为内核代码 段和内核数据段, 分别地表2-3所示为: 段描述符的值 这四个领域至关重要 分段

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

现代操作系统(如Linux、其他Unixen、Windows NT等)不使用x86处理器提供的分段功能。相反,它们使用的是平面32位内存模型。每个用户模式进程都有自己的32位虚拟地址空间

(在x86_64系统上,宽度自然扩展到64位)

现代操作系统(即Linux、其他Unixen、Windows NT等)不使用x86处理器提供的分段功能。相反,它们使用的是平面32位内存模型。每个用户模式进程都有自己的32位虚拟地址空间


(在x86_64系统上,宽度自然扩展到64位)

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

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

Windows将
fs
段用于本地线程存储。
因此,必须使用它,linux内核需要支持它。

Windows使用
fs
段进行本地线程存储。
因此,必须使用它,linux内核需要支持它。

英特尔首先在80286上添加了分段,然后在80386上添加了分页。类Unix操作系统通常使用虚拟内存分页


无论如何,由于x86上的分页直到最近才支持执行权限,OpenWall Linux使用分段来提供非可执行堆栈区域,即它将代码段限制设置为比其他段限制更低的值,并进行了一些仿真以支持堆栈上的蹦床。

英特尔首先在80286上添加了分段,然后在80386上添加了分页。类Unix操作系统通常使用虚拟内存分页


无论如何,由于x86上的分页直到最近才支持执行权限,OpenWall Linux使用分段来提供非可执行堆栈区域,即它将代码段限制设置为比其他段限制更低的值,并进行了一些仿真,以支持堆栈上的蹦床。

分段和分页根本不是多余的。Linux操作系统完全集成了按需分页,但它不使用内存分段。这为所有任务提供了一个32/64位的平面、线性虚拟地址空间

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

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

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

32位处理器没有用于禁用的模式位 分割,但通过映射 堆栈、代码和数据空间到相同的线性地址范围。 32位处理器指令使用的32位偏移量可以覆盖 4G线性地址空间

另外,英特尔文档说明:

佛罗里达州