eax 之后,每填好一项,物理地址值减去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 调用返回指令代码如下: ret 在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模块代码
|