历史上的今天
今天是:2025年02月25日(星期二)
2020年02月25日 | ARMv8 内存管理架构.学习笔记
2020-02-25 来源:eefocus
操作系统Disk <=> Tape
用户
Disk <=> Tape
用户

数据结构(kernel3.10)
next | 所有的vm_struct子区域组成一个vmlist链表,next指针指向下一个vm_struct 节点地址 |
addr | vmalloc() 最终在内核空间申请一个vm_struct 内存子区域,addr指向该内存子区域首地址 |
size | 表示该vm_struct子区域的大小 |
flags | 表示该非连续内存区的类型标记 |
pages | 指针数组成员是struct page*类型指针,每个成员都关联一个映射到该虚拟内存区的物理页框 |
nr_pages | 指针数组pages中page结构的总数 |
phys_addr | 通常为0,当使用ioremap()映射一个硬件设备的物理内存时才填充此字段 |
caller | 返回地址 |
4.2 基本流程
。size 修正为PAGE_SIZE的整数倍,保证对齐 |
。在vmalloc内存范围内查找一块合适的虚拟地址子内存空间,存储到vm_struct结构中. |
。为申请到的vm_struct 子内存空间分配不连续的物理页框(Physical Frame) |
。建立连续的vm_struct子内存空间到非连续的物理页框(Physical Frame)之间的映射. |
4.3 代码实现分析
• vmallo()内部封装__vmalloc_node_range函数
size | 需要申请子内存的大小,通过vmalloc()传过来 |
align | 表示将所申请的内存区分为几个部分,1表示size大小的虚拟内存区作为一个整体 |
start | vmalloc区域范围从 VMALLOC_START 开始 |
end | vmalloc区域范围到 VMALLOC_END 结束 |
gfp_mask | 页面分配标志,GFP_KERNEL | __GFP_HIGHMEM 表示将从内核高端内存区分配内存空间 |
prot | 描述当前页的保护标志 |
node | 表示在哪个节点上(struct pg_data_t)为这段子内存区分配空间,-1表示在当前节点分配 |
caller | 返回地址 |
• __vmalloc_node_range函数分析
LINE 9 | 修正获取内存的size,PAGE_ALIGN 将size的大小修改成PAGE_SIZE的整数倍,假设要申请1KB的内存区,那么实际上分配的是PAGE_SIZE(4KB)大小 的区域,然后进行size合法性检查,若不合法则返回NULL,申请内存失败 上一篇:ARM内核全解析 推荐阅读
史海拾趣
|




