Skip to content

09 Intel 内存管理两板斧:分段与分页

你好,我是闪客。

这一讲,我们看一个特别重要的东西,即 CPU 是如何管理内存的?当然,我们聊的是最最基础和底层的管理手段——分段和分页。

分页机制如何开启

上一讲咱们说到,head.s 代码在重新设置了 gdt 与 idt。之后,我们就会看到这样一段代码:

jmp after_page_tables
...
after_page_tables:
    push 0
    push 0
    push 0
    push L6
    push _main
    jmp setup_paging
L6:
    jmp L6

也就是开启分页机制,并且跳转到 main 函数。如何跳转到之后用 c 语言写的 main.c 里的 main 函数,是个有趣的事,也包含在这段代码里。

不过,我们先瞧瞧这分页机制是如何开启的,也就是 setup_paging 这个标签处的代码。

setup_paging:
    mov ecx,1024*5
    xor eax,eax
    xor edi,edi
    pushf
    cld
    rep stosd
    mov eax,_pg_dir
    mov [eax],pg0+7
    mov [eax+4],pg1+7
    mov [eax+8],pg2+7
    mov [eax+12],pg3+7
    mov edi,pg3+4092
    mov eax,00fff007h
    std
L3: stosd
    sub eax,00001000h
    jge L3
    popf
    xor eax,eax
    mov cr3,eax
    mov eax,cr0
    or  eax,80000000h
    mov cr0,eax
    ret