之后,每填好一项,物理地址值减去0x1000,每项的值减4个字节,直至物理地址小于0。
在设置好页目录表和页表后,就可以设置页目录基址寄存器CR3的值,指向页目录表。
xor1 %eax, %eax
movl %eax, %cr3
并设置启动使用分页处理(CR0的PG标志,为31)
movl %CR0, %eax
orl $0x80000000, %eax
movl %eax, %cr0
5. 跳转到/init/main.c
至此,调用返回指令,将堆栈中的main程序的地址弹出,并开始运行/init/main.c程序。
与压栈相关的指令如下:
push1 $0
push1 $0
push1 $0
push1 $L6
push1 $_main
调用返回指令代码如下:
在head.s程序执行结束后,已经正式完成了内存页目录和页表的设置,并重新设置了内核实际使用的中断描述符表和全局描述符表。此时system模块在内存中的详细映像如下:
0x0000--0x0FFF:内存页目录表(4KB)
0x1000--0x1FFF:内存页表PG0(4KB)
0x2000--0x2FFF:内存页表PG1(4KB)
0x3000--0x3FFF:内存页表PG2(4KB)
0x4000--0x4FFF:内存页表PG3(4KB)
0x5000--0x53FF:软盘缓冲区(1KB)
head.s部分代码
中断描述符表IDT(2KB)
全局描述符表GDT(2KB)
main.c程序代码
kernel模块代码
mm模块代码
fs模块代码
lib模块代码