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