Linux系统提供了4GB虚拟地址。在linux系统中不使用物理地址,使用的是虚拟地址,所以物理地址需要映射成虚拟地址。
0-3G为用户空间,3-4G为内核空间。在内核空间中,0-896M为物理内存映射区(直接映射区),映射方式简单,他们与物理地址只有一个固定的偏移量。
32位的虚拟地址与物理地址的转换如图:1、cr3寄存器中的基地址加上虚拟地址的高10位得到页目录中页表的基地址;2、页表的基地址加上虚拟地址的中间10位得到页表中页的基地址;3、页的基地址加上低12位得到物理地址。
用户空间调用malloc等函数来申请内存,只是得到了虚拟地址,但是没有分配到物理内存,只有在访问地址的时候才真正分配到物理内存。在访问虚拟地址的时候会产生请页异常,然后通过get_free_page(s)从空闲的页框中分配内存。
内核空间中vmalloc申请的内存也只是地址,也是在访问的时候通过请页异常分配的物理内存的。
Kmalloc在进行申请的时候就直接对应了一段物理内存