跳到主要内容

x86 番外三:描述符和选择子

· 阅读需 31 分钟
wjc133
Back-end Engineer @ SHOPLINE

在实模式下,段的基地址直接由段寄存器存储,一个段最大是 64 KB(即 65536 字节)。

切换到保护模式后,段寄存器不再直接存储段基地址,而是存储 选择子(Selector),而真正的段信息(如基地址、段限长、特权级、类型等)则保存在 描述符(Descriptor) 中,这些描述符集中存放在 全局描述符表(GDT)局部描述符表(LDT) 中。

这样做是出于这样几个关键的目的:

  • 保护模式的核心是 “保护” ——防止程序越界访问或破坏系统或其他进程。因此,段描述符规定该段最大可访问偏移;特权级用于控制哪些代码可以访问该段;通过 Type 规定只读/可写/可执行等属性
  • 支持虚拟内存与多任务
  • 使用缓存(描述符缓存)优化效率
  • 所有段的元数据集中存放,便于操作系统统一管理

除了段,门(Gate)、任务状态段(TSS)等也是通过描述符来进行描述,通过选择子进行调用。

所以,很有必要好好梳理一下描述符和选择子机制。本篇是 x86 架构的番外篇,目标是理清「描述符」和「选择子」的本质。

x86 番外二:栈

· 阅读需 18 分钟
wjc133
Back-end Engineer @ SHOPLINE

栈是一个很简单的数据结构,但它很重要。在 x86 中有各种各样的栈。本篇是 x86 架构的番外篇,目标是理清「栈」的本质。

x86 番外一:锁

· 阅读需 39 分钟
wjc133
Back-end Engineer @ SHOPLINE

本篇是 x86 架构的番外篇,我希望借这篇博文,理清「锁」的本质。

多线程模式

· 阅读需 9 分钟
wjc133
Back-end Engineer @ SHOPLINE

前面了解的都是多任务管理,但现代操作系统都以线程为基本执行单位,所以本篇学习如何在多处理器系统下进行多线程管理。

64 位单处理器多任务管理

· 阅读需 12 分钟
wjc133
Back-end Engineer @ SHOPLINE

本文所述为操作系统在适配 64 位处理器时的一般逻辑,并不意味着某一具体操作系统的实现。

我们知道 IA-32e 架构在 64 位模式下取消了硬件任务切换,且强制使用平坦模型。这使得任务切换不再受到 CPU 规则的强约束,这使得任务切换变得更加轻量级。

本文会对 64 位模式下单核处理器的多任务管理的流程和方法做一些简要的整理。

详解 x86 分页机制

· 阅读需 27 分钟
wjc133
Back-end Engineer @ SHOPLINE

本文旨在全面回顾 x86 平台上各种分页技术的发展历程及其特点,帮助读者理解这些技术是如何逐步演进以适应不断增长的需求。