开启了分页,似乎是成功了,当然是对等的映射了,代码是一样的糟糕,也不知有多少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处的字符串。还是开图吧

这是没改的

开启了分页,似乎是成功了,当然是对等的映射了,代码是一样的糟糕,也不知有多少bug。

这是该过的    movl $0x1007, %eax

开启了分页,似乎是成功了,当然是对等的映射了,代码是一样的糟糕,也不知有多少bug。