-
kmalloc
原型:void *kmalloc(size_t size, int flags);
参数:内容 说明 size 要分配的块的大小 flags 分配标志,控制kmalloc的行为 flags最常用的标志为GFP_KERNEL,表示在内核空间的进程中申请内存。注意,在使用该标志的时候,如果内核不满足所申请的内存的条件,会引起当前进程的阻塞,所以,不能在中断的上下文或有自旋锁的情况使用该标志。既然不能使用GFP_KERNEL标志,我们可以使用另外一个,GFP_ATOMIC标志,使用这个标志时,若申请的内存不满足,函数会直接返回,不阻塞进程。
列举一下flag标志
内容 说明 GFP_KERNEL 表示在内核空间的进程中申请内存,会阻塞 GFP_ATOMIC 函数会直接返回,不阻塞进程 GFP_USER 用来为用户空间页分配内存, 可能阻塞 GFP_HIGHUSER 类似GFP_USER, 但是它从高端内存分配 GFP_DMA 从DMA区域分配内存 GFP_NOIO 不允许任何I/O初始化 GFP_NOFS 不允许进行任何文件系统调用 __GFP_HIGHMEM 指示分配的内存可以位于高端内存 __GFP_COLD 请求一个较长时间不访问的页 __GFP_NOWARN 当一个分配无法满足时, 阻止内核发出警告 __GFP_HIGH 高优先级请求, 允许获得被内核保留给紧急状况使用的最后的内存页 __GFP_REPEAT 分配失败, 则尽力重复尝试 __GFP_NOFAIL 标志只许申请成功, 不推荐 __GFP_NORETRY 若申请不到, 则立即放弃 对应的释放函数为
kfree()
,使用方法和free()
一样。
kmalloc用于申请较小的、物理内存连续的内存空间 -
vmalloc()
原型:void *vmalloc(unsigned long size);
参数:需要申请的内存大小。
vmalloc用于申请较大的,虚拟内存连续的内存空间,需要注意的是,调用vmalloc来分配少量的内存是不太合适的,因为vmalloc的函数开销比较大。而且该函数不能用于原子上下文中,因为该函数内部实现了标志位GFP_KERNEL的kmalloc()。
对应的释放函数为vfree()
kmalloc和vmalloc
最新推荐文章于 2024-04-13 23:38:14 发布