我正在阅读这里的培训机构之一的 linux 笔记。根据这一点,每当创建一个进程时,就会为其分配一个区域。区域包含进程的所有段。
区域也由区域表指定。区域表包含以下条目;--
虚拟地址到 - 物理地址指针 + 磁盘块描述符
磁盘块描述符指向磁盘上的交换或 exe 文件。
我有两个问题:-----
1> Global & Local Descriptor 角色在哪里。
2> 每个进程都有自己的全局描述符表吗?我认为是的,否则两个进程的虚拟地址将指向相同的物理地址。
请建议
我正在阅读这里的培训机构之一的 linux 笔记。根据这一点,每当创建一个进程时,就会为其分配一个区域。区域包含进程的所有段。
区域也由区域表指定。区域表包含以下条目;--
虚拟地址到 - 物理地址指针 + 磁盘块描述符
磁盘块描述符指向磁盘上的交换或 exe 文件。
我有两个问题:-----
1> Global & Local Descriptor 角色在哪里。
2> 每个进程都有自己的全局描述符表吗?我认为是的,否则两个进程的虚拟地址将指向相同的物理地址。
请建议
1) 全局描述符表给出线性地址的基地址。它几乎总是零,并且“限制”设置得太“全1”(即所有可寻址内存)。实际上,实际上并未使用段选择器。该架构要求它们存在并加载,但它们“可用于”的实际效果并未在 Linux 中使用。
本地描述符表的工作方式完全相同,只是每个进程都有一个 LDT。通常它保存任务的堆栈段——它的基地址仍然为零。进程可以修改LDT,不能修改GDT。
要判断该段是 GDT 还是 LDT,请查看第 3 位(值 8 的那个) - 例如,在我的系统ss
中有 value 0x2b
,所以它设置了第 3 位。cs
另一方面是33
,所以它没有设置第 3 位,因此从 GDT 中出来。
2) 不。有一个 GDT(准确地说,每个 CPU 内核)——这就是它被称为“全局”的原因——所有事物都有一个。这也是堆栈段位于 LDT 中的原因,因为每个进程都有一个。