linux vmalloc的page_fault分析
vmalloc是内核中非连续内存分配接口,返回高端的线性地址,而且处于VMALLOC_START ---VMALLOC_END之间。物理地址通过伙伴算法来获取,利用page_alloc来获取每个page,这样在线性地址上看是连续的,但是实际上物理地址是离散分布的,通过页表来实现连续的线性地址到非连续的物理地址的映射。下面分析整个vmalloc的流程:__vmalloc->vmallc_node
·
vmalloc是内核中非连续内存分配接口,返回高端的线性地址,而且处于VMALLOC_START ---VMALLOC_END之间。物理地址通过伙伴算法来获取,利用page_alloc来获取每个page,这样在线性地址上看是连续的,但是实际上物理地址是离散分布的,通过页表来实现连续的线性地址到非连续的物理地址的映射。
下面分析整个vmalloc的流程:__vmalloc->vmallc_node->
1.__get_vm_area_node,返回线性地址
用于从VMALLOC_START ---VMALLOC_END之间获取一个VMA结构,其大小是SIZE。
2. 利用alloc_page获取足够的物理地址,保存在struct page **数组中。
3.map_vm_area
在页表中映射 线性地址和物理地址,这里使用initmm.pgd作为页全局目录,并没有修改current->mm->pgd中的页全局目录。
因此可能出现3G-4G的vmalloc错误,这个错误在page_fault中修正,将initmm.pgd中对应的addr页全局表项项拷贝到current->mm->pgd中的addr对应的页全局表项
下面引用:
更多推荐
已为社区贡献1条内容
所有评论(0)