Linux内核之内存管理
来源:互联网 发布:恒指期货实时行情数据 编辑:程序博客网 时间:2024/05/18 02:49
一、页page
内核把物理页作为内存管理的基本单元。内存管理单元(MMU)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。
32位体系结构支持4KB的页,而64位的体系结构支持8KB的页。
内核用struct page结构来表示系统中的每个物理页。
二、区zone
由于硬件的限制,内核就把所有的页划分成不同的区(zone),Linux主要有四种分区:
- ZONE_DMA–该区包含的页能用来执行DMA操作
- ZONE_DMA32–也可用来执行DMA操作,但是只能被32位设备访问
- ZONE_NARMAL–该区包含的是能正常映射的页
- ZONE_HIGHMEM–高端内存,并不能永久映射到内核地址空间
x86-32上,分区情况:
三、获得页
static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)
该函数分配2的order次方个连续的物理页,返回指向第一个页的结构体的指针。
void *page_address(const struct page *page)
将指定的页转换成它的逻辑地址。
若无需用到struct page,就可以调用:
extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);//注意,该函数要进行错误检查,分配失败必须进行相应处理
该函数直接返回请求的第一个页的逻辑地址。
如果只需要一页,就可以用一下两个函数:
struct page * alloc_page(gdp_t gfp_mask)unsigned long __get_free_page(gfp_t gfp_mask);
如果你需要让返回的页的内容全为0,请用下面这个函数:
unsigned long get_zeroed_page(gfp_t gfp_mask);
释放页:
void __free_pages(struct page *page, unsigned int order);void free_pages(unsigned long addr, unsigned int order);void free_page(unsigned long addr);
释放时需要谨慎,仅释放属于你的页,释放错了地址或者用错了order值可能导致系统崩溃。
四、kmalloc
kmalloc()函数与用户空间的malloc函数类似,只不过多了一个flags参数。该函数是申请获得以字节为单位的一块内核内存。分配的内存在物理上是连续的。
void *kmalloc(size_t size, gfp_t flags)void kfree(const void *ptr)
gfp_mask标志:
这些标志分为三类:行为修饰符、区修饰符、类型标志
五、vmalloc()
vmalloc函数的工作方式与kmalloc类似,只不过vmalloc分配的虚拟地址是连续的,但物理地址无需连续。
通过分配非连续的物理内存块,再修正页表,把内存映射到连续的虚拟地址空间中。这就带来一些消耗,带来性能上的影响,仅仅在不得已时才会使用。
void *vmalloc(unsigned long size)void vfree(const void *addr)
0 0
- Linux内核之内存管理
- Linux内核之内存管理
- Linux内核分析之内存管理
- Linux 内核开发之内存管理
- LINUX内核设计思想之内存管理
- linux-0.12内核之内存管理(1)
- 深入理解Linux内核之内存管理
- 浅析linux内核内存管理之内存池
- Linux 内核解读之内存管理----memory.c
- Linux内核之内存管理(4)--缺页处理程序
- Linux内核设计基础(五)之内存管理
- linux 内核学习之内存管理-未完待续
- 《Linux内核设计与实现》读书笔记之内存管理
- Linux 内核学习之内存管理(一) 总体描述
- Linux 内核子系统之内存与进程管理子系统
- Linux 内核解读之内存管理----memory.c
- Linux内核内存管理之内存结构概述(一)
- 深入Linux内核架构之内存管理(1)
- c++教程(八:Functions)
- php中的依赖注入
- Android 中线程间通信原理分析:Looper, MessageQueue, Handler
- 【poj2187】 Beauty Contest
- 机房收费系统(二)-导出为excel
- Linux内核之内存管理
- [2016ACM多校] HDU5809 KD树 并查集
- hiho_110week
- ZJK的黑OJ(树的最大独立集)(树形DP)
- Effective C++ Item 12-复制对象时忽忘其每一个成分
- JS中typeof用法
- Linux下的PS和grep指令的简单使用
- RxAndroid结合Retrofit,看看谁才是最佳拍档!
- 《设计模式之装饰模式》