Files
linux-insides-zh/Booting/linux-bootstrap-2md.md
2016-01-29 10:05:46 -05:00

2.8 KiB
Raw Blame History

在内核安装代码的第一步

#https://0xax.gitbooks.io/linux-insides/content/Booting/linux-bootstrap-2.html

内核启动的第一步

上一节中我们开始接触到内核启动代码,并且分析了初始化部分,最后我们停在了对main函数(main函数是第一个用C写的函数的调用main函数位于arch/x86/boot/main.c

在这一节中我们将继续对内核启动过程的研究,我们将

  • 认识保护模式
  • 如何从实模式进入保护模式
  • 堆和字符界面初始化
  • 内存检测cpu验证键盘初始化
  • 还有更多

现在让我们开始我们的旅程

保护模式

在操作系统可以使用Intel 64位CPU的长模式之前内核必须首先将CPU切换到保护模式运行。

什么是保护模式保护模式于1982年被引入到Intel CPU家族并且从那之后知道Intel 64出现保护模式都是Intel CPU的主要运行模式。

淘汰实模式的主要原因是因为在实模式下系统能够访问的内存非常有限。如果你还记得我们在上一节说的在实模式下系统最多只能访问1M内存而且在很多时候实际能够访问的内存只有640K。

保护模式带来了很多的改变不过只要的改变都集中在内存管理方法。在保护模式中实模式的20位地址线被替换成32位地址线因此系统可以访问多大4GB的地址空间。另外在保护模式中引入了内存分页功能,在后面我们将介绍这个功能。

保护模式提供了2种完全不同的内存关机机制

  • 段式内存管理
  • 内存分页

在这一节中,我们只介绍段式内存管理,内存分页我们将在后面的章节进行介绍。

在上一节中我们说过在实模式下一个物理地址是由2个部分组成的

  • 内存段的基地址
  • 从基地址开始的偏移

通过这2个信息我们可以通过下面的公式计算出对应的物理地址

PhysicalAddress = Segment * 16 + Offset

在保护模式中内存段的定义Memory segmentation was completely redone in protected mode. There are no 64 Kilobyte fixed-size segments. Instead, the size and location of each segment is described by an associated data structure called Segment Descriptor. The segment descriptors are stored in a data structure called Global Descriptor Table (GDT).