Linux中有关内核非连续的思维导图,包括非连区的数据结构、创建一个非连续区的结构、分配非连续内存区等
树图思维导图提供 内核非连续思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 内核非连续思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:cf0a13b0ffd4326b7f0a90b85b77fd64
内核非连续思维导图思维导图模板大纲
CPU 访问的都是虚拟内存
首先,非连续内存处于 3GB 到 4GB 之间,也就是处于内核空间
PAGE_OFFSET 为 3GB,high_memory 为保存物理地址最高值的变量
VMALLOC_START 为非连续区的的起始地址,定义于 include/i386/pgtable.h 中
在物理地址的末尾与第一个内存区之间插入了一个 8MB(VMALLOC_OFFSET)的区间
是一个安全区
是为了“捕获”对非连续区的非法访问
每个非连续内存区的大小都是 4096 的倍数
描述非连续区的数据结构为 struct vm_struct,定义于 include/linux/vmalloc.h 中
非连续区组成一个单链表,链表第一个元素的地址存放在变量 vmlist 中
Addr 域是内存区的起始地址
size 是内存区的大小加 4096(安全区的大小)
函数 get_vm_area()创建一个新的非连续区结构,其代码在 mm/vmalloc.c 中
在单链表中插入一个元素
调用了 kmalloc()和 kfree()函数
分别用来为 vm_struct 结构分配内存和释放所分配的内存
vmalloc()函数给内核分配一个非连续的内存区
vmalloc()最终调用的是__vmalloc()函数,该函数的代码在 mm/vmalloc.c 中
pgd_offset_k()宏导出这个内存区起始地址在页目录中的目录项
pmd_alloc()为新的内存区创建一个中间页目录
子主题 3alloc_area_pmd()为新的中间页目录分配所有相关的页表,并更新页的总目录
调用 pte_alloc_kernel()函数来分配一个新的页表,之后再调用 alloc_area_pte()
为页表项分配具体的物理页面
从 vmalloc_area_pages()函数可以看出,该函数实际建立起了非连续内存区到物