注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。
本节课程的主要目标是简要熟悉汇编程序的编写,以及对boot进行初始化。
注意:本课程假设您已经有了x86汇编的学习基础,或者其它类型CPU(如ARM)上编写汇编的基础。因此,在课程中我不会对汇编的每一处细节都讲解。如果此前完全没有学习过汇编程序的编写,请自行查找相关资料学习。
引导程序的作用
引导程序的主要作用如下。我们的课程为了设计方便,采用了二级引导,即boot只完成loader的加载工作,再由loader完成具体的初始化工作和内核加载。
实模式
CPU启动后,自动进入所谓的实模式。可以理解其为最早期的8086芯片的工作模式。这种模式无任何保护机制,只能运行16位代码、不支持虚拟内存、不支持访问1MB以上的内存。后续为通过代码切换到现代的高级保护模式。
内核寄存器
x86包含很多寄存器,以下仅列举与我们编程有关的部分。其中在CPU启动进入实模式后,EAX/EBX/ECX/EDX仅能使用低16位,即AX/BX/CX/DX。
CS/DS/SS/ES/FS/GS为段寄存器,用于指向一段内存区域。访问特定地址时,需要使用段:偏移的形式,生成的地址为段值 << 4 + 偏移,例如访问0x7c00,需要使用0x7c0: 0,或者0: 0x7c00。
在本课程中,没有使用其复杂的分段模式,即采用平坦模式,所有的段寄存器全部指向0。
存储映射
实模式模式只支持访问1MB以内的内存,具体的内存映射如下。(访问高于1MB的内存需要进入保护模式,此点将在后面提及)
其中,可供我们自由使用的区域如下图灰色部分所示。BIOS会自动将磁盘的第0扇区加载到0x7c00地址处。
参考资料
- Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture(第73、74、76页)
- 有关实模式的详细说明:https://wiki.osdev.org/Real_Mode
- x86存储映射:https://wiki.osdev.org/MemoryMap(x86)#BIOSData_Area.28BDA.29#BIOSData_Area.28BDA.29)