bootsect执行完后,setup和system被加载到了内存中,此时控制权转交给setup,即如下代码。
; 0x90000:光标位置 0x90002:扩展内存数
; 0x9000C:显卡参数 0x901FC:根设备号
... ; 获取硬件参数到0x90000
mov ah, 0x88 int 0x15 mv [2], ax ; 获得物理内存到0x90002
; 移动system到内存0地址
; 利用ax控制循环,利用es:di与ds:si控制目的地址与源地址
mov cx, 0x8000 rep movsw ; 每次移动8000H word
jmp move
; 设置GDT,IDT同理
lgdt gdt_48
gdt_48: .word 0x800 .word 512+gdt, 0x9
gdt: .word 0, 0, 0, 0
.word 0x07FF, 0x0000, 0x9A00, 0x00C0
.word 0x07FF, 0x0000, 0x9200, 0x00C0
mov ax, 0x0001 mov cr0, ax ; 使能保护模式
jmpi 0, 8 ; 跳转到0地址,此处非CS<<4+IP
setup最终跳转到了内存0地址,此处是system的head模块。