本篇主要讲解内核态内存映射,也是本系列文章的最后一篇
上一篇:用户态内存映射原理与源码分析
经常听说,虚拟内存内核空间也有映射区域vmalloc区,其实内核可以通过vmalloc在该区进行内存映射,也可以调用kmap_atomic_prot函数在临时映射区进行临时映射。
1.用户态和内核态的顶级页表在哪?
(1)用户态
pgd_t * pgd;//顶级页表项,mm_struct结构中
(2)内核态
swapper_pg_dir是内核的顶级页表,在系统初始化时就进行了定义,需要注意的是内核也有自己的mm_struct结构;
//linux-4.13.16\arch\x86\include\asm\pgtable_64.h
#define swapper_pg_dir init_top_pgt
2.vmalloc函数与kmap_atomic的区别
对于kmap_atomic发现没有页表的时候回直接创建页表进行映射,而vmalloc则和mmap一样只是分配虚拟地址,所以会发生缺页异常,然后调用do_page_fault处理之。
3.总结
- 物理内存之后为什么设计虚拟内存
- 物理内存的组织形式——对应的OS层的组织管理数据结构
- 页表机制的设计思想
- 大小块内存的分配技术,空闲页面的换出技术之Kswapd
- 虚拟内存中与用户态与内核态空间的划分
- 用户态与内核态的内存映射,设计思想(只分配虚拟内存)
- 缺页异常的产生
- Cr3寄存器的粗浅作用
- __pa与__va两个宏的作用
- malloc与free的底层实现原理