本节课程的主要目标是简要熟悉汇编程序的编写,以及对boot进行初始化。
注意:本课程假设您已经有了x86汇编的学习基础,或者其它类型CPU(如ARM)上编写汇编的基础。因此,在课程中我不会对汇编的每一处细节都讲解。如果此前完全没有学习过汇编程序的编写,请自行查找相关资料学习。
当然你不需要对汇编语言程序设计有非常多的了解,只需要有相关的编程经验即可。

引导程序的作用

引导程序的主要作用如下。我们的课程为了设计方便,采用了二级引导,即boot只完成loader的加载工作,再由loader完成具体的初始化工作和内核加载。
\image (3).png

实模式

CPU启动后,自动进入所谓的实模式。可以理解其为最早期的8086芯片的工作模式。这种模式无任何保护机制,只能运行16位代码、不支持虚拟内存、不支持访问1MB以上的内存。后续为通过代码切换到现代的高级保护模式。

内核寄存器

x86包含很多寄存器,以下仅列举与我们编程有关的部分。其中在CPU启动进入实模式后,EAX/EBX/ECX/EDX仅能使用低16位,即AX/BX/CX/DX。
\image (4).png
\image (5).png

CS/DS/SS/ES/FS/GS为段寄存器,用于指向一段内存区域。访问特定地址时,需要使用段:偏移的形式,生成的地址为段值 << 4 + 偏移,例如访问0x7c00,需要使用0x7c0: 0,或者0: 0x7c00。
\image (6).png

在本课程中,没有使用其复杂的分段模式,即采用平坦模式,所有的段寄存器全部指向0。
\image (7).png

存储映射

实模式模式只支持访问1MB以内的内存,具体的内存映射如下。(访问高于1MB的内存需要进入保护模式,此点将在后面提及)
其中,可供我们自由使用的区域如下图灰色部分所示。BIOS会自动将磁盘的第0扇区加载到0x7c00地址处。
\image (8).png

参考资料

  1. Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture(第73、74、76页)

  2. 有关实模式的详细说明:https://wiki.osdev.org/Real_Mode

  3. x86存储映射:https://wiki.osdev.org/Memory_Map_(x86)#BIOS_Data_Area_.28BDA.29



登陆发表评论