人家如何管理的
我们怎么使用呢
1、需要掌握的基本概念
1)内核管理内存是以物理内存页为基本单位,通常一个物理内存页为4KB
内核会为每个物理内存页创建一个struct page类型的对象
struct page{
atomic_t _count;//记录该物理内存页被引用的次数 为0 代表空闲页
}
2)内核管理内存时对所有的内存并不是一视同仁
低端内存:<896M(可调)的内存,采用静态的映射方式
虚拟地址 -0xc0000000+物理偏移
例如物理地址为0x40000000的内存单元,其对应的虚拟地址为
0xc0000000 + 0 (偏移) = 0xc0000000
高端内存:>896M(可调)的内存,采用动态映射方式
需要访问高端内存时,动态建立映射关系
使用完毕后立刻解除映射
从而使得解除映射的虚拟地址可以再去对应其他的高端物理内存
2、按页分配
__get_free_pages -- free_pages
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
gfp_mask,常用取值:
GFP_KERNEL 申请内存不成功,阻塞睡眠等待(不能用于中断上下文)
GFP_ATOMIC 申请内存不成功,直接返回错误信息(不能用于中断上下文)
order,要申请2^oder个物理内存页
返回值,申请成功映射之后的起始虚拟地址
void free_pages(unsigned long addr, unsigned int order)
addr,__get_free_pages的返回值
order,要连续释放2^order个物理内存页
3、按字节分配
kmalloc -- kfree
void *kmalloc(size_t size, gfp_t flags)
size,要申请的字节数
flags,常用取值:
GFP_KERNEL 申请内存不成功,阻塞睡眠等待(不能用于中断上下文)
GFP_ATOMIC 申请内存不成功,直接返回错误信息(不能用于中断上下文)
返回值,映射后的起始虚拟地址
void kfree(const void *x)
addr,kmalloc的返回值
vmalloc -- vfree
void *vmalloc(unsigned long size)
size,要申请的字节数
返回值,映射后的起始虚拟地址
void vfree(const void *addr)
addr,vmalloc的返回值