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以上的内存被称为高端内存
内核空间划分: