内核中申请内存的函数

内核中申请内存的函数,第1张

Linux内核空间中常见的内存分配函数

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

较常用的flags()有:

flags 的参考用法:

 |– 进程上下文,可以睡眠 GFP_KERNEL

 |– 进程上下文,不可以睡眠GFP_ATOMIC

 ||– 中断处理程序 GFP_ATOMIC

 ||– 软中断GFP_ATOMIC

 ||– Tasklet GFP_ATOMIC

 |– 用于DMA的内存,可以睡眠 GFP_DMA | GFP_KERNEL

 |– 用于DMA的内存,不可以睡眠GFP_DMA |GFP_ATOMIC

释放内存

void kfree(const void *objp)

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

static inline void *kzalloc(size_t size,gfp_t flags) {return kmalloc(size,flags |_GFP_ZERO)}

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

释放内存

void vfree(const void *addr)

注意vmalloc和vfree时可以睡眠的,因此不能从中断上下问调用

kmalloc()、kzalloc()、vmalloc() 的区别是:

一般地,在使用虚拟内存技术的多任务系统上,内核和应用有不同的地址空间,因此,在内核和应用之间以及在应用与应用之间进行数据交换需要专门的机制来实现,众所周知,进程间通信(IPC)机制就是为实现应用与应用之间的数据交换而专门实现的。

通常情况下,应用程序通过内核接口访问驱动程序,因此,驱动程序需要和应用程序交换数据。Linux将存储器分为“内核空间”和“用户空间”。操作系统和驱动程序在内核空间运行,应用程序在用户空间运行,两者不能简单地使用指针传递数据。因为Linux系统使用了虚拟内存机制,用户空间的内存可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核提供了多个函数和宏用于内核空间和用户空间传递数据。

给你介绍两个函数吧:

malloc函数 void * malloc(size) 动态内存分配函数,分配size字节的内存,返回的是指向该区域的指针

realloc函数 void * realloc(void * ptr ,size)重新分配内存,将ptr所指的已分配内存块的大小改为size,返回的也是指向该内存区域的指针

另外都包含在<stdlib.h>头文件中

楼主说的就是malloc函数了,这两个函数在数据结构中经常用到的

希望可以帮助你

上面那个,你貌似不懂耶

看好了

malloc

原型:extern void *malloc(unsigned int num_bytes)

用法:#include <alloc.h>

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

举例:

// malloc.c

#include <syslib.h>

#include <alloc.h>

main()

{

char *p

clrscr() // clear screen

p=(char *)malloc(100)

if(p)

printf("Memory Allocated at: %x",p)

else

printf("Not Enough Memory!\n")

free(p)

getchar()

return 0

}

free

原型:extern void free(void *p)

用法:#include <alloc.h>

功能:释放指针p所指向的的内存空间。

说明:p所指向的内存空间必须是用calloc,malloc,realloc所分配的内存。

如果p为NULL或指向不存在的内存块则不做任何操作。

举例:

// free.c

#include <syslib.h>

#include <alloc.h>

main()

{

char *p

clrscr() // clear screen

textmode(0x00)

p=(char *)malloc(100)

if(p)

printf("Memory Allocated at: %x",p)

else

printf("Not Enough Memory!\n")

getchar()

free(p)// release memory to reuse it

p=(char *)calloc(100,1)

if(p)

printf("Memory Reallocated at: %x",p)

else

printf("Not Enough Memory!\n")

free(p)// release memory at program end

getchar()

return 0

}

为什么很多人不喜欢c,c++,因为管理内存的一部分任何必须由程序员自己管理,不然很容易内存泄露,现在有很多检查内存泄露的软件比较常用的有(boundchecker)有兴趣的可以下个试一下自己的程序,你会发现自己好可怕。malloc free使用一般有几个原则(自己总结的,不一定正确,但很实用)

1 ,malloc free必须配套使用,并且尽可能逆序。

2 ,谁malloc的谁free

3,能够不动态分配的尽量不动态分配,动态分配是很费时间的,而且存在一定的风险。

很多人喜欢这样写程序:

type * f()

{

type *t = (type*)malloc ( sizeof(type))

.

.

return t

}

这个肯定会出问题,一般象这种情况,一般声明f(type* t),谁调用它谁为t分配空间,谁来释放它的空间。不过很有意思的是,在有写系统函数的会这样.如(char* asctime() ,它返回一个表示时间的字符指针,但是并不要求你释放,你也没有办法释放,但是我可以肯定它这个串肯定不是在堆区分配的)

free的顺序也很重要,很多时候free的时候会出现空指针的引用,不足为齐。有人提议free(t)t = NULL 这种用法,有一定的道理,当你free一块空间后,操作系统不会立即回收,所以在你再次用t的时候可能还是可以用的,t就成了个野指针,而将其t = NULL后,对t的引用会出问题。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/56893.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-26
下一篇2023-02-26

发表评论

登录后才能评论

评论列表(0条)

    保存