【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )
文章目录
一、free_area 空闲区域结构体源码分析
上一篇博客 【Linux 内核 内存管理】分区伙伴分配器 ① ( 分区伙伴分配器源码数据结构 | free_area 空闲区域数组 | MAX_ORDER 宏定义 | 空闲区域的页最大阶数 ) 中 ,
分析到 内存区域 zone
结构体中的 free_area
成员 , 就是用于维护 空闲页块 的 数组 数据结构 , 该 free_area
数组的 下标索引 对应 页块 阶数 ;
free_area
结构体定义在 Linux 内核源码 linux-4.12\include\linux\mmzone.h#95 位置 ;
MIGRATE_TYPES
是枚举类型 , 值为
;
struct free_area {
struct list_head free_list[MIGRATE_TYPES];
unsigned long nr_free;
};
源码路径 : linux-4.12\include\linux\mmzone.h#95
二、分配标志位
申请 物理页 时 , 内存区域 类型 是 根据 最低的
个标志位 确定的 ;
常用的
个标志位如下 , 这些标志位定义在 Linux 内核源码 linux-4.12\include\linux\gfp.h#18 位置 ;
/* Plain integer GFP bitmasks. Do not use this directly. */
#define ___GFP_DMA 0x01u
#define ___GFP_HIGHMEM 0x02u
#define ___GFP_DMA32 0x04u
#define ___GFP_MOVABLE 0x08u
源码路径 : linux-4.12\include\linux\gfp.h#18
三、GFP_ZONE_TABLE 标志位区域类型映射表
Linux 内核中 , 使用了 GFP_ZONE_TABLE
宏 , 定义了 " 标志位组合 " 与 " 区域类型 " 之间的映射 ,
GFP_ZONES_SHIFT
是 区域类型 对应的 位数 ,
GFP_ZONE_TABLE
中 , 每个 标志位组合 映射到
位的 整型 的指定位置 ,
其中 偏移 是 标志组合 * 区域类型位数 ;
#define GFP_ZONE_TABLE ( \
(ZONE_NORMAL << 0 * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA << ___GFP_DMA * GFP_ZONES_SHIFT) \
| (OPT_ZONE_HIGHMEM << ___GFP_HIGHMEM * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA32 << ___GFP_DMA32 * GFP_ZONES_SHIFT) \
| (ZONE_NORMAL << ___GFP_MOVABLE * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA << (___GFP_MOVABLE | ___GFP_DMA) * GFP_ZONES_SHIFT) \
| (ZONE_MOVABLE << (___GFP_MOVABLE | ___GFP_HIGHMEM) * GFP_ZONES_SHIFT)\
| (OPT_ZONE_DMA32 << (___GFP_MOVABLE | ___GFP_DMA32) * GFP_ZONES_SHIFT)\
)
四、分配标志位对应的内存区域类型
源码路径 : linux-4.12\include\linux\gfp.h#296
上述标志位对应的区域类型如下 :
___GFP_DMA
标志 , 对应ZONE_DMA
内存区域类型 ;___GFP_HIGHMEM
标志 , 对应ZONE_HIGHMEM
内存区域类型 ;___GFP_DMA32
标志 , 对应ZONE_DMA32
内存区域类型 ;
#ifdef CONFIG_HIGHMEM
#define OPT_ZONE_HIGHMEM ZONE_HIGHMEM
#else
#define OPT_ZONE_HIGHMEM ZONE_NORMAL
#endif
#ifdef CONFIG_ZONE_DMA
#define OPT_ZONE_DMA ZONE_DMA
#else
#define OPT_ZONE_DMA ZONE_NORMAL
#endif
#ifdef CONFIG_ZONE_DMA32
#define OPT_ZONE_DMA32 ZONE_DMA32
#else
#define OPT_ZONE_DMA32 ZONE_NORMAL
#endif
源码路径 : linux-4.12\include\linux\gfp.h#296
内存区域类型 参考 【Linux 内核 内存管理】物理内存组织结构 ⑤ ( 内存区域 zone 类型简介 | 内存区域类型zone_type 枚举源码分析 | zone_type 枚举源码 ) 博客 ;
相关文章
- 【Linux 内核 内存管理】Linux 内核堆内存管理 ② ( 动态分配堆内存方式 | brk 系统调用 | mmap 系统调用 | brk 系统调用源码介绍 )
- 文件Linux 内存中的文件映射磁盘(linux内存映射磁盘)
- 安装 Linux远程安装软件:让系统变得更简单(linux远程软件)
- 量Linux进程:利用信号量进行同步(linux进程信号)
- 许可Linux 授权许可:自由之旅(linux授权)
- 编程世界中的Linux内核定制(linux编辑内核)
- 心探索Linux内核的无限潜力(linux核)
- Linux内核:开拓美好未来的前景。(linux内核前景)
- 开发Linux下安卓软件开发新技术突破。(linux安卓软件)
- Linux内核发展史:自1991年以来的进展(linux内核历史)
- Linux查看内核版本:一步一步教程(linux看内核版本)
- 探究 Linux 内核构成的奥秘(linux内核组成)
- Linux内核配置:从配置文件开始(linux内核配置文件)
- Linux系统的功能模块:探究其优缺点(linux有哪些模块)
- Linux翻墙神器——SSH穿越防火墙(linux翻墙ssh)
- Linux内核:下载代码迈向技术革新(linux内核代码下载)
- Linux的分支:分类、特点及应用(linux的分支)
- 快速入门:Linux系统SSH连接操作指南(linux系统ssh)
- 深入了解64位Linux内核,提升性能和安全性(64位linux内核)
- Linux下强大的图形监控工具(linux图形监控工具)
- 使用Linux优化工具提高系统性能(linux优化工具)
- 深入Linux内核:阅读工具登场(linux内核阅读工具)
- Linux 源代码有多庞大?一探究竟(linux源码有多大)
- 推荐优质Linux教学视频,助你轻松掌握操作技巧。(linux教学视频推荐)
- Linux内核学习视频实用教程(linux 内核视频教程)
- Linux下操作MPC 求打开封闭的新世界(mpc linux)