偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1760)
分类: LINUX
2010-11-24 14:33:07
#include
void *kmalloc(size_t size, int flags);
kmalloc 这个函数快(除非它阻塞)并且不清零它获得的内存; 分配的区仍然持有它原来的内容.分配的区也是在物理内存中连续
kmalloc 能够分配的内存块的大小有一个上限. 这个限制随着体系和内核配置选项而变化.一般情况下为128KB.
标志 flags
GFP_KERNEL, 意思是这个内存分配是为 “代表运行在内核空间的进程“ 而进行的.GFP_KENREL 意味着 kmalloc 能够使当前进程在少内存的情况下睡眠来等待一页。他能使当前的代码进入休眠。如果要使的代码不进入休眠的情况(在中断处理, tasklet, 和内核定时器中),在最好GFP_ATOMIC
标志来代替,这样内核会寻找合适的空闲页,如果没有返回错误而不会等待进入休眠状态。
用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.
内核内存的正常分配. 可能睡眠.
用来为用户空间页来分配内存; 它可能睡眠.
如同 GFP_USER, 但是从高端内存分配.
这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进行任何文件系统调用, 而 GFP_NOIO 根本不允许任何 I/O 初始化. 它们主要地用在文件系统和虚拟内存代码, 那里允许一个分配睡眠, 但是递归的文件系统调用会是一个坏注意.