一、内存分区
二、kmalloc:
在用户空间,我们使用一个面向堆的内存分配函数malloc来分配连续的堆空间,在内核中对应使用kmalloc
1、分配的空间连续 2、分配的内存里面保存了原有的数据
#include <linux/slab.h> void *kmalloc(size_t size, int flags);
flag:
- GFP_ATOMIC
-
用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.
- GFP_KERNEL
-
内核内存的正常分配. 可能睡眠.
- GFP_USER
-
用来为用户空间页来分配内存; 它可能睡眠.
- GFP_HIGHUSER
-
如同 GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述.
- GFP_NOIO
- GFP_NOFS
-
这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进行任何文件系统调用, 而 GFP_NOIO 根本不允许任何 I/O 初始化. 它们主要地用在文件系统和虚拟内存代码, 那里允许一个分配睡眠, 但是递归的文件系统调用会是一个坏注意.
上面列出的这些分配标志可以是下列标志的相或来作为参数, 这些标志改变这些分配如何进行:
- __GFP_DMA
-
这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖的并且在下面章节来解释.
- __GFP_HIGHMEM
-
这个标志指示分配的内存可以位于高端内存.
- __GFP_COLD
-
正常地, 内存分配器尽力返回"缓冲热"的页 -- 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个"冷"页, 它在一段时间没被使用. 它对分配页作 DMA 读是有用的, 此时在处理器缓冲中出现是无用的. 一个完整的对如何分配 DMA 缓存的讨论看"直接内存存取"一节在第 1 章.
- __GFP_NOWARN
-
这个很少用到的标志阻止内核来发出警告(使用 printk ), 当一个分配无法满足.
- __GFP_HIGH
-
这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页.
- __GFP_REPEAT
- __GFP_NOFAIL
- __GFP_NORETRY
-
- size:
- 三、每-CPU变量
在接触dvfs驱动的时候时长涉及这一概念:
最显著的是在网络子系统中,将计数器放到每CPU-变量中,更新计数器的时候无须上锁和处理缓存。