源代码在arch文件夹的boot.s汇编文件中.
首先看一个宏,这个宏定义在x86comm.h头文件中,
#define EXTERN(x) .global x; x:
这句代码在汇编中展开就变味一条伪指令,指示x是一个全局变量,然后定义x的开始标号。
EXTERN(_ChainLoadBiosBootSectorCode)
.code32
call switch_to_real
.code16
movb (_FrldrBootDrive),%dl
cli
movw $0x0000,%bx
movw %bx,%ds
movw %bx,%es
movw %bx,%fs
movw %bx,%gs
movw %bx,%ss
movw $0x7C00,%sp
ljmpl $0x0000,$0x7C00首先,整个处理器模式切换到实模式下面去(不知道是不是BIOS进行了模式转换),其中.code32标志32位模式,模式转换之后,将所有的段寄存器归零,当然CS是不能变的,然后跳转到CS为0,而偏移为0x7C00的地址去。这个地址是BIOS读入启动代码的存放地址。
#define HEX(y) 0x##y
#define NULL_DESC HEX(00)
#define PMODE_CS HEX(08)
#define PMODE_DS HEX(10)
#define RMODE_CS HEX(18)
#define RMODE_DS HEX(20)
在X86common.h文件中定义了四个16进制数用于表示不同模式下的代码段和数据段,每个数据的结构分析如下:

这篇博客深入探讨ReactOS操作系统在I386架构下的启动过程,主要关注源代码中arch文件夹的boot.s汇编文件。文章详细解析了x86comm.h头文件中的宏定义,以及不同模式下代码段和数据段的选择子。内容包括保护模式和实模式的段寄存器设置,以及如何通过长跳转进入实模式。在实模式下,通过清除CR0寄存器的保护模式开关位完成启动过程。
最低0.47元/天 解锁文章
9823

被折叠的 条评论
为什么被折叠?



