进程地址空间
虚拟内存
linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该
空间大小为3G,用户看到和接触的都是虚拟地址。
linux将4G的虚拟地址空间划分为两个部分--用户空间与内核空间。
用户空间:0--0xbfffffff
内核空间:3G--4G
内存分配:
应用程序中:malloc函数进行动态分配
linux内核中:kmalloc函数动态分配内存
#include<linux/slab.h>
void *kmalloc(size_t size, int flags)
参数:
size:要分配的内存大小
flags:分配标志,它控制kmalloc的行为。
flags:
GFP_ATOMIC
用来在进程上下文之外的代码(包括中断处理)中分配内存,从不睡
眠。
GFP_KERNEL
进程上下文中的分配。可能睡眠。(16M-896M)
__GFP_DMA
这个标志要求分配能够 DMA 的内存区(物理地址在16M以下的页
帧 )
__GFP_HIGHMEM
这个标志表示分配的内存位于高端内存。(896M以上)
按页分配
如果模块需要分配大块的内存,那使用面向页的分配技术会更好
* get_zeroed_page(unsigned int flags)
返回指向新页面的指针,并将页面清零
* __get_free_page(unsigned int order)
和get_free_page(unsigned int flags)
* __get_free_pages(unsigned int flags, unsigned int order)
分配若干个连续的页面,返回指向该内存区域的指针,但也不清楚这段内存区域。
释放
当程序用完这些页,可以使用下列函数之一来释放它们
kmalloc --- kfree
page:
void free_page(unsigned long addr)
void free_pages(unsigned long addr, unsigned long order)
*** 如果释放的和先前分配数目不等的页面,会导致系统错误 ***
内存使用:
注: Slab是Linux操作系统的一种内存分配机制。Linux内存中有许多内存动态分配的需求,而其中的对象大小也层次不齐,Linux内存提供了slab层,它扮演了通用数据结构缓存层的角色。对于一般的数据结构,每个slab层只有一个页即可。