Linux内存分配
程序员文章站
2022-04-30 09:26:22
...
原文链接: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()得到页。
上一篇: 机器学习中的参数调整
下一篇: Qt图像打标签小程序
推荐阅读
-
PHP共享内存用法实例分析
-
揭秘SQL Server 2014有哪些新特性(1)-内存数据库
-
在VMware虚拟机中安装redhat linux操作系统图文详解教程
-
在VMware虚拟机中安装Linux(Fedora16)的方法
-
虚拟机中的Linux安装VMware Tools的方法
-
虚拟机VMware中安装VMware Tools for Linux的方法(Fedora16)
-
在VMware中为Linux系统安装vmware tools的详解教程
-
Linux centos7环境下MySQL安装教程
-
ASP.NET Core程序发布到Linux生产环境详解
-
linux命令详解之useradd命令使用方法