kmalloc和vmalloc

  1. 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用于申请较小的、物理内存连续的内存空间

  2. vmalloc()
    原型:void *vmalloc(unsigned long size);
    参数:需要申请的内存大小。
    vmalloc用于申请较大的,虚拟内存连续的内存空间,需要注意的是,调用vmalloc来分配少量的内存是不太合适的,因为vmalloc的函数开销比较大。而且该函数不能用于原子上下文中,因为该函数内部实现了标志位GFP_KERNEL的kmalloc()。
    对应的释放函数为vfree()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值