linux存储--linux内存分配图(九)

原文链接:https://blog.csdn.net/YuZhiHui_No1/article/details/46982231

在这里插入图片描述
用户空间和内核空间线性地址分配
在这里插入图片描述
内核空间的1G分配

在这里插入图片描述
通常会把内核空间中大于896M的空间称作内核空间中的高端内存(high_memory)。物理内存的末尾和非连续内存之间插入了一个大小为8MB的区间,这是一个安全区,目的是“捕获”对非连续区的非法访问。同样,在其他非连续区间也插入了大小为4KB的安全区,而每个非连续区的大小都是4KB的倍数。如下图:
在这里插入图片描述
非连续内存的线性地址空间是从VMALLOC_START~VMALLOC_END,共128MB大小。当内核需要用vmalloc类的函数进行非连续内存分配时,就会申请一个vm_struct结构来描述对应的vmalloc区,若分配多个vmalloc的内存区,那么相邻两个vmalloc区之间的间隔大小至少为4KB,即至少是一个页框大小PAGE_SIZE。

内核中描述非连续区的数据结构是vm_struct:

struct vm_struct {
            struct vm_struct *next;        //指向下一个vm_struct区,所有非连续区组成一个单链表,链表头为vmlist
            void *addr;               //代表每个内存区的起始地址,即指向申请的内存区的第一个内存单元(线性地址)            
            unsigned long size;            //当前所申请的内存区大小加4KB(安全区)
            unsigned long flags;           //标识内存区类型
            struct page **pages;       //指向nr_pages页描述符指针数组的指针
            unsigned int nr_pages;     //所申请的内存区大小对应的页框数
            phys_addr_tphys_addr;   //该字段一般为0,除非内存已经被申请用作映射一个硬件设备的I/O共享内存
            const void *caller;         //当前调用vmalloc类的函数的返回地址
 };

flags标志非连续区映射的内存类型,VM_ALLOC表示使用vmalloc()得到页,VM_MAP表示使用vmap()得到页,VM_IOREMAP表示ioremap()得到页。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值