Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32247
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-04 21:15
文章分类
文章存档

2015年(11)

2014年(2)

我的朋友

分类: C/C++

2014-08-04 21:33:22

由于最近接触内核模块方面的编程,因此想把几个常见的分配内存的函数汇总一下,方便以后的查阅,如果有错误的地方,欢迎大家指正


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()

阅读(996) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:收录 Uboot 详解

给主人留下些什么吧!~~