进入保护模式的步骤是:
1、关中断;
2、打开A20地址线,使之能访问1M以上的内存;
3、设置GDT; GDT知识可查看《Intel微处理器 第8版》p541 也可以查看 Intel开发手册
4、加载GDT;
5、进入保护模式,跳转到setup.s
boot.s的源代码如下所示
.text
.global start
.include "kernel.inc"
.code16
start:
jmp $0x0, $code
msg:
.string "1kos booting......\x0"
code:
movw $0xb800,%ax #显存地址在0xb8000
movw %ax, %es
xorw %di, %di #es:di = 0xb8000
xorw %ax, %ax
movw %ax, %ds #ds:si = msg
movw $msg, %si
cld #si和di自增
movb $0x07, %ah #字符属性:黑底白字
#打印msg信息
print_c:
cmp $0x0, (%si)
je load
lodsb #ds:[si] -> al, ++si
stosw #ax -> es:[di], di += 2 #al=字符 ah=属性
jmp print_c
#读取kernel到0x7e00上
load:
#设置临时栈
xorw %ax, %ax
movw %ax, %ds # ds = 0x0
movw %ax, %ss # ss = 0x0,栈基址
movw $KERNEL_STACK_BOT,%sp # sp = 0x7c00,栈地址
#设置rd_kern的参数
#设置ES:BX参数
movw $KERNEL_START_SEGMENT, %ax
movw %ax, %es # es = 0x7e0
xorw %bx, %bx # bx = 0x0, es:bx = 0x7e00
#读取的起始扇区号(逻辑扇区起始扇区号是0)
movw $0x1, %si # si = 0x1 ,是rd_sect的参数
#读取1400个扇区,共700K
movw $KER