源代码在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进制数用于表示不同模式下的代码段和数据段,