diff --git a/Booting/linux-bootstrap-2md.md b/Booting/linux-bootstrap-2md.md index 27c2a86..b3ac411 100644 --- a/Booting/linux-bootstrap-2md.md +++ b/Booting/linux-bootstrap-2md.md @@ -163,4 +163,18 @@ lgdt gdt * CPU根据`段选择子`从GDT中找到一个匹配的段描述符,然后将段描述符放入段寄存器的隐藏部分 * 在没有使用向下扩展段的时候,那么内存段的基地址就是`段描述符中的基地址`,段描述符的`limit + 1`就是内存段的长度。如果你知道一个内存地址的`偏移`,那么在没有开启分页机制的情况下,这个内存的物理地址就是`基地址+偏移` -![linear address](http://oi62.tinypic.com/2yo369v.jpg) \ No newline at end of file +![linear address](http://oi62.tinypic.com/2yo369v.jpg) + +当代码要从实模式进入保护模式的时候,需要执行下面的操作: is: + +* 禁止中断发生 +* 使用命令`lgdt`将GDT表装入内存 +* 设置CR0寄存器的PE位为1,是CPU进入保护模式 +* 跳转开始执行保护模式代码 + +在后面的章节中,我们将看到Linux 内核中完整的转换代码。不过在系统进入保护模式之前,还有很多准备工作需要完成。 + +让我们代开C文件 [arch/x86/boot/main.c](https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c)。这个文件包含了很多的函数,这些函数分别会执行键盘初始化,内存堆初始化等等操作...,下面让我们来具体看一些重要的函数。 + +将启动参数拷贝到"zeropage" +-------------------------------------------------------------------------------- \ No newline at end of file