用户态和内核态的内存分配

用户态内存分配
C语言中,在用户态分配内存空间可以使用malloc() ,函数原型如下:

void *malloc(size_t size);
1
参数:

size – 内存块的大小,以字节为单位。
返回值

函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。
在用户态分配的空间需要使用free() 回收。

内核态内存分配
在内核态可以使用kmalloc()、vmalloc()、kzalloc()、vzalloc()分配内存,区别如下:

void * kmalloc(size_t size, gfp_t flags)
1
参数:
size_t size – how many bytes of memory are required.
gfp_t flags – the type of memory to allocate.

flags 类型:
GFP_KERNEL – Allocate normal kernel ram. May sleep.
GFP_NOWAIT-- Allocation will not sleep.
GFP_ATOMIC – Allocation will not sleep. May use emergency pools.
GFP_HIGHUSER – Allocate memory from high memory on behalf of user.

kmalloc()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。

void * vmalloc(unsigned long size)
1
参数:
unsigned long size – allocation size
返回值:
pointer to the allocated memory or NULL on error

vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

void * kzalloc(size_t size, gfp_t flags)
1
参数
size_t size – how many bytes of memory are required.
gfp_t flags – the type of memory to allocate (see kmalloc).

kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。

void * vzalloc(unsigned long size)
1
参数:
unsigned long size – allocation size
返回值:
pointer to the allocated memory or NULL on error

vzalloc() 函数与 vmalloc() 相似,参数及返回值也是一样的。
释放:vzfree(地址);
————————————————
版权声明:本文为CSDN博主「qq_36059308」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36059308/article/details/111567610

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值