开启了分页,似乎是成功了,当然是对等的映射了,代码是一样的糟糕,也不知有多少bug。
对了页目录表的地址是0xfff000, 页表是随后的0x1000000,这大概应该是16M处吧
.align 8
_setup_page:
movl $0x400, %ecx
movl $0x1000007, %eax
movl $0xfff000, %edi
cld
1:
stosl
addl $0x1000, %eax
loop 1b
movl $0x100000, %ecx
movl $0x7, %eax
movl $0x1000000, %edi
1:
stosl
addl $0x1000, %eax
loop 1b
movl $0xfff000, %eax
movl %eax, %cr3
movl %cr0, %eax
orl $0x80000000, %eax
movl %eax, %cr0
ret
主程序中加入的代码,字符串的地址选择了0x7c00,是不是很熟悉
char * addr0 = (char *) 0x7c00;
*addr0 = '$';
*(addr0 + 1) = 'I';
*(addr0 + 2) = 'a';
*(addr0 + 3) = 'b';
*(addr0 + 4) = '\0';
fillbox(0x001e90ff, 0, 0, 799, 599);
str = "希望分页机制是顺利的打开了";
print_gb2312(0xffffffff, 0, 0, str);
print_gb2312(0xffffffff, 80, 80, addr0);
setup_page();
print_gb2312(0x00000000, 80, 160, addr0);
如果更改红字处的映射关系,则不能显示0x7c00处的字符串。还是开图吧
这是没改的
这是该过的 movl $0x1007, %eax