Skip to content

Commit

Permalink
Merge pull request #8 from linux-kernel-labs-zh/lecture_address_space
Browse files Browse the repository at this point in the history
try to fix
  • Loading branch information
hanyujie2002 authored Dec 3, 2023
2 parents e27f279 + fb09a20 commit e4f0472
Showing 1 changed file with 0 additions and 113 deletions.
113 changes: 0 additions & 113 deletions lectures/address-space.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,116 +30,3 @@
* 内核空间

* 高内存(high memory)


x86 MMU
=======

x86 内存管理单元(MMU)包括分段单元和分页单元。分段单元可用于定义由逻辑(虚拟)起始地址、基本线性(映射)地址和大小定义的逻辑内存段。段也可以根据访问类型(读取、执行、写入)或特权级别(例如,我们可以定义一些只能由内核访问的段)来限制访问。

当 CPU 进行内存访问时,它将使用分段单元根据段描述符中的信息将逻辑地址转换为线性地址。

如果启用了分页,线性地址将使用页表中的信息进一步转换为物理地址。

请注意,分段单元无法禁用,因此如果启用了 MMU,将始终使用分段。

.. slide:: x86 MMU
:inline-contents: True
:level: 2

|_|

.. ditaa::

+--------------+ +------------+
logical | | linear | | physical
---------> | Segmentation | --------> | Paging | ---------->
address | Unit | address | Unit | address
| | | |
+--------------+ +------------+

选择器
---------

程序可以使用多个段(segment),为了确定使用哪个段,使用了特殊寄存器(称为选择器)。常用的基本选择器有 CS——“代码选择器”,DS——“数据选择器”和 SS——“堆栈选择器”。

指令获取默认使用 CS,而数据访问默认使用 DS,除非使用了堆栈(例如,通过 pop 和 push 指令进行数据访问),这种情况下默认使用 SS。

选择器有三个主要字段:索引,表索引(TI)和运行特权级别(RPL):


.. slide:: 选择器
:inline-contents: True
:level: 2

|_|

.. ditaa::
15 3 2 1 0
+------------+----+-----+
| | | |
Segment selectors | index | TI | RPL |
(CS, DS, SS, ES, FS, GS) | | | |
+------------+----+-----+

.. ifslides::

* 选择器: CS、DS、SS、ES、FS、GS

* 索引: 用于索引段描述符表

* TI: 选择 GDT 或 LDT

* RPL: 仅对 CS 表示(当前)运行的特权级别

* GDTR 和 LDTR 寄存器指向 GDT 和 LDT 的基址


索引用于确定应使用描述符表的哪个条目。 `TI` 用于选择全局描述符表(GDT)或局部描述符表(LDT)。这些表实际上是从特殊寄存器 `GDTR`(用于 GDT)和 `LDTR`(用于 LDT)指定的位置开始的数组。

.. note:: LDT 设计用于允许应用程序可以定义它们自己的特定段。尽管不是很多应用程序使用此功能,但 Linux(和 Windows)提供了系统调用,允许应用程序创建自己的段。

`RPL` 仅用于 CS,并表示当前特权级别。有 4 个特权级别,最高级别为 0(通常由内核使用),最低级别为 3(通常由用户应用程序使用)。


段描述符
------------------

CPU 使用选择器的 `index` 字段来访问一个 8 字节的描述符:

.. slide:: 段描述符
:inline-contents: True
:level: 2

|_|

.. ditaa::

63 56 44 40 32
+-------------------------------+---+---+---+---+---------------+---+---+---+---+---------------+-------------------------------+
| | | D | | A | Segment | | D | | | |
| Base Address 31:24 | G | / | L | V | Limit | P | P | S | Type | Base Address 23:16 |
| | | B | | L | 19:16 | | L | | | |
+-------------------------------+---+---+---+---+---------------+---+---+---+---+---------------+-------------------------------+
| | |
| Base address 15:0 | Segment Limit 15:0 |
| | |
+---------------------------------------------------------------+---------------------------------------------------------------+
31 15 0


* Base: 段的起始线性地址

* Limit: 段的大小

* G: 粒度位:如果设置,则大小以字节为单位,否则以 4K 页面为单位

* B/D: 数据/代码

* Type: 代码段、数据/堆栈、TSS、LDT、GDT

* Protection: 访问段所需的最低特权级别(RPL 与 DPL 进行比较)


一些描述符字段你应该比较熟悉。这是因为它们与我们之前讨论的中断描述符有一些相似之处。

0 comments on commit e4f0472

Please sign in to comment.