<commit_before>## 章节六 GDT全局描述表


归功于GRUB，你的内核不再是 [real mode(实模式)](http://baike.baidu.com/view/404433.htm)，而是处于[protected mode（保护模式）](http://en.wikipedia.org/wiki/Protected_mode)，该模式允许我们使用微处理器的所有能力，比如 虚拟内存管理，分页，安全的多任务。

#### GDT 是什么？

[GDT](http://en.wikipedia.org/wiki/Global_Descriptor_Table) ("Global Descriptor Table" 全局描述表) 是一个用来定义不同内存区的数据结构，其包括:基地址，大小，访问特权（比如执行和写），这些区域被称为 "segments（段）"。

我们将使用GDT定义不同的内存段：

> 为了保留作者的原义，保留了该段原文

* *"code"*: kernel code, used to stored the executable binary code
* *"data"*: kernel data
* *"stack"*: kernel stack, used to stored the call stack during kernel execution
* *"ucode"*: user code, used to stored the executable binary code for user program
* *"udata"*: user program data
* *"ustack"*: user stack, used to stored the call stack during execution in userland


* *"code"*: 内核代码，用来存储二进制执行代码
* *"data"*: 内核数据
* *"stack"*: 内核栈，用来存储内核执行的调用栈 
* *"ucode"*: 用户代码，用来存储用户程序的二进制代码
* *"udata"*: 用户程序数据
* *"ustack"*: 用户栈，用来存储用户态执行的调用栈


#### 如何加载GDT?

GRUB初始化一个GDT，但这个GDT不属于我们的内核。
这个GDT是使用 LGDT(加载全局描述符) 汇编指令加载的。 它用来获取一个GDT描述结构体的位置。

GRUB initializes a GDT but this GDT is does not correspond to our kernel.
The GDT is loaded using the LGDT assembly instruction. It expects the location of a GDT description structure:
<commit_msg>Change desc<commit_after>## 章节六 GDT全局描述表


归功于GRUB，你的内核不再是 [real mode(实模式)](http://baike.baidu.com/view/404433.htm)，而是处于[protected mode（保护模式）](http://baike.baidu.com/view/177586.htm)，该模式允许我们使用微处理器的所有能力，比如 虚拟内存管理，分页，安全的多任务。

#### GDT 是什么？

[GDT](http://baike.baidu.com/view/4109224.htm) ("Global Descriptor Table" 全局描述表) 是一个用来定义不同内存区的数据结构，其包括:基地址，大小，访问特权（比如执行和写），这些区域被称为 "segments（段）"。

我们将使用GDT定义不同的内存段：

> 为了保留作者的原义，保留了该段原文

* *"code"*: kernel code, used to stored the executable binary code
* *"data"*: kernel data
* *"stack"*: kernel stack, used to stored the call stack during kernel execution
* *"ucode"*: user code, used to stored the executable binary code for user program
* *"udata"*: user program data
* *"ustack"*: user stack, used to stored the call stack during execution in userland


* *"code"*: 内核代码，用来存储二进制执行代码
* *"data"*: 内核数据
* *"stack"*: 内核栈，用来存储内核执行的调用栈 
* *"ucode"*: 用户代码，用来存储用户程序的二进制代码
* *"udata"*: 用户程序数据
* *"ustack"*: 用户栈，用来存储用户态执行的调用栈


#### 如何加载GDT?

GRUB初始化一个GDT，但这个GDT不属于我们的内核。
这个GDT是使用 LGDT(加载全局描述符) 汇编指令加载的。 它用来获取一个GDT描述结构体的位置。

GRUB initializes a GDT but this GDT is does not correspond to our kernel.
The GDT is loaded using the LGDT assembly instruction. It expects the location of a GDT description structure:

{'fraction_non_alphanumeric': 0.1346613545816733, 'fraction_numerical': 0.0099601593625498, 'mean_word_length': 6.1335227272727275, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3993557', 'n_tokens_mistral': 1278, 'n_tokens_neox': 1390, 'n_words': 249}