Linux内存管理

Linux将4G虚拟地址空间划分成用户空间和内核空间。
用户空间从0-3G 内核空间从3G-4G
用户进程通常情况下只能访问用户空间,不能访问内核空间。
用户空间到内核空间的切换方式:系统调用和硬件终端

kmalloc用于内核中动态分配内存,应用程序中使用malloc进行动态分配内存

kmalloc函数原型:
#include <linux/slab.h>
void *kmalloc(size_t size, int flags)
参数:
     size:要分配内存的大小
     flags:分配标志,它控制kmalloc的行为
分配标志:
GFP_ATOMIC:用来在进程上下文之外的代码(包括中断处理)中分配内存,从不睡眠
GFP_KERNEL:进程上下文中分配内存,可以睡眠
_GFP_DMA:这个标志要求分配能够DMA的内存区(物理地址在16M以下的页帧)
_GFP_HIGHMEM:这个标志表示分配的内存位于高端内存(896M以上的内存)


按页分配
如果模块需要分配更大块的内存,要使用面向页的分配
get_zeroed_page(unsgined int flags)
返回指向新页面的地址并将页面清零
get_free_page(unsigned int flags)

get_free_pages(unsigned int flags,unsigned int order)
分配若干个连续的页面,返回指向该内存区的指针,但是不清零这些内存区域

对应的页释放函数
void free_page(unsigned long addr);
void free_pages(unsigned long addr,unsigned long order)

在这里插入图片描述

内核空间是由内核负责映射的,它不会随着进程改变,是固定的,和用户空间不同。
物理内存896M以上的内存被称为高端内存

内核空间划分:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页