探索 Linux 内存模型--转
在 Linux 中,所有的段寄存器都指向相同的段地址范围 —— 换言之,每个段寄存器都使用相同的线性地址。这使 Linux 所用的段描述符数量受限,从而可将所有描述符都保存在 GDT 之中。这种模型有两个优点:
图 4 展示了对模型的修改。 Linux 使用以下段描述符:
下面详细介绍这些段寄存器。 GDT 中的内核代码段 (kernel code segment)?描述符中的值如下:
与这个段相关的线性地址是 4 GB,S = 1 和 type = 0xa 表示代码段。选择器在? 内核数据段 (kernel data segment)?描述符的值与内核代码段的值类似,惟一不同的就是 Type 字段值为 2。这表示此段为数据段,选择器存储在 用户代码段 (user code segment)?由处于用户模式中的所有进程共享。存储在 GDT 中的对应段描述符的值如下:
在 Linux 中,我们可以通过? 在?用户数据段 (user data segment)?描述符中,惟一不同的字段就是 Type,它被设置为 2,表示将此数据段定义为可读取和写入。Linux 中用来访问此段选择器的宏是? 除了这些段描述符之外,GDT 还包含了另外两个用于每个创建的进程的段描述符 —— TSS 和 LDT 段。 每个?TSS 段 (TSS segment)?描述符都代表一个不同的进程。TSS 中保存了每个 CPU 的硬件上下文信息,它有助于有效地切换上下文。例如,在? 每个进程都有自己在 GDT 中存储的对应进程的 TSS 描述符。这些描述符的值如下:
&tss_struct )这是在 Linux 内核的 schedule.h 文件中定义的
所有进程共享默认 LDT 段。默认情况下,其中会包含一个空的段描述符。这个默认 LDT 段描述符存储在 GDT 中。Linux 所生成的 LDT 的大小是 24 个字节。默认有 3 个条目: 要计算 GDT 中最多可以存储多少条目,必须先理解? GDT 中可存储的条目总数可通过以下公式确定: 在这 8192 个段描述符中,Linux 要使用 6 个段描述符,另外还有 4 个描述符将用于 APM 特性(高级电源管理特性),在 GDT 中还有 4 个条目保留未用。因此,GDT 中的条目数等于 8192 - 14,也就是 8180。 任何情况下,GDT 中的条目数 8180,因此: 2 *? (为什么使用?2 *? 这种 x86 架构中进程数量的限制是 Linux 2.2 中的一个组件,但自 2.4 版的内核开始,这个问题已经不存在了,部分原因是使用了硬件上下文切换(这不可避免地要使用 TSS),并将其替换为进程切换。 接下来,让我们了解一下分页模型。
分页单元负责将线性地址转换成物理地址(请参见图 1)。线性地址会被分组成页的形式。这些线性地址实际上都是连续的 —— 分页单元将这些连续的内存映射成对应的连续物理地址范围(称为?页框)。注意,分页单元会直观地将 RAM 划分成固定大小的页框。 正因如此,分页具有以下优点:
(编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |