由于最近接触内核模块方面的编程,因此想把几个常见的分配内存的函数汇总一下,方便以后的查阅,如果有错误的地方,欢迎大家指正
1.kmalloc()
文件包含:#include
功能描述:kmalloc()用于分配在物理上连续的内存,虚拟地址也是连续的,是基于slab分配实际上存在的内存。
但是kmalloc最多只能开辟大小为32XPAGE_SIZE的内存,一般的PAGE_SIZE=4kB,也就是128kB的大小的内存。
函数定义:static __always_inline void * kmalloc (size_t size, gfp_t flags);
输入参数:size:分配内存的字节数
flags:分配标志,要分配内存的类型
返回参数:返回一个指向分配的内存块起始地址的地址指针
释放函数:kfree()
2.kcalloc()
文件包含:#include
功能描述:kcalloc()是基于slab分配实际上存在的内存,并且在分配后将内存中的内容都初始化为0,但kcalloc()主要为一个数组分配
内存空间,数组中的一个元素对应一个内存对象
函数定义:static inline void * kcalloc (size_t n, size_t size, gfp_t flags);
输入参数:n:数组中的元素个数
size:分配数组中每个元素所对应的内存对象的字节数
flags:分配标志,要分配内存的类型
返回参数:返回一个对所分配的内存对象数组的引用
释放函数:kfree()
3.kzalloc()
文件包含:#include
功能描述:kzalloc()是基于slab分配实际上存在的内存,在分配内存后将内存中的内容都初始化为0,和kcalloc()有些相似,
但不针对数组。
函数定义:static inline void * kzalloc (size_t size, gfp_t flags);
输入参数:size:分配内存的字节数
flags:分配标志,要分配内存的类型
返回参数:返回一个指向分配的内存块起始地址的地址指针
释放函数:kfree()
4.krealloc()
文件包含:#include
功能描述:重新分配内存,但不改变原地址空间中的内容
函数定义:void * __must_check krealloc (const void *p, size_t new_size, gfp_t flags);
输入参数:p:重新分配的原内存空间的起始地址
new_size:重新分配内存的字节数
flags:分配标志,要分配内存的类型
返回参数:重新分配的内存空间的起始地址
释放函数:遵从原分配内存函数的分配函数
5.vmalloc()
文件包含:#include
功能描述:用于分配一块非连续的地址空间,物理地址一般是非连续的,但是虚拟地址是连续的,分配的内存空间
被映射进入内核数据段中,从用户空间是不可见的。vmalloc比kmalloc要慢。
函数定义:void *vmalloc(unsigned long size);
输入参数:size:分配内存的字节数
返回参数:返回创建的地址区间的虚拟地址,如果分配失败返回NULL。
释放函数:vfree()
6.vmalloc_to_page()
文件包含:#include
功能描述:找到vmalloc()所分配内存的虚拟地址所映射的物理页,并返回该页的指针描述符
函数定义:struct page *vmalloc_to_page(const void *addr);
输入参数:addr:一般是vmalloc()的返回地址,也是一个虚拟地址
返回参数:addr映射的物理页的指针描述符
7.vmalloc_user()
文件包含:#include
功能描述:功能类似于vmalloc(),在vmalloc()的基础上将地址空间清零,这样该地址空间被映射到用户空间不会发生数据泄露
函数定义:void *vmalloc_user(unsigned long size);
输入参数:size:分配内存的字节数
返回参数:返回创建的地址区间的虚拟地址,如果分配失败返回NULL。
释放函数:vfree()
阅读(1107) | 评论(0) | 转发(0) |