Chinaunix首页 | 论坛 | 博客
  • 博客访问: 661279
  • 博文数量: 81
  • 博客积分: 1659
  • 博客等级: 上尉
  • 技术积分: 1286
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-02 16:36
个人简介

专注于嵌入式和图像处理

文章分类

全部博文(81)

文章存档

2014年(1)

2013年(7)

2012年(46)

2011年(27)

分类: LINUX

2012-10-21 16:06:29

#include
void *kmalloc(size_t size,int flags)
分配的内存在物理上是连续的,且不对分配得到的内存空间清零。
参数:
size:分配内存块的大小
flags:分配标志,常取的值如下:
1.GFP_KERNEL
    内核内存通常分配方法,最终是调用get_free_pages()来实现分配。可能引起休眠。在空闲内存较少时,就会把当前需分配内存的进程转入休眠以等待一个页面。此时,内核会把缓冲区内的数据写入磁盘,或从一个进程换出内存,以获取一个页面。
2.GFP_ATOMIC
    用于在进程上下文之外调用kmalloc分配内存,如中断处理程序、tasklet、内核定时器中调用。因为此时当前进程不能休眠。所以该标志,用于进程上下文之外kmalloc内存分配,而且不会引起休眠。内核通常会为原子性分配预留一些空闲页面,用改标志可以用掉最后一个空闲页面,如连最后一个页面都没有了,则分配就返回失败。
3.GFP_USER
    用户空间页分配内存,可能会引起分配进程休眠。
4.GFP_HIGHUSER
    类似GFP_USER,但如有高端内存,则从高端内存分配。
以上的分配标志,可与下面的标志,“或“起来使用。
__GFP_DMA
    在DMA的内存区段中分配内存。一般为16M以下的地址,具体与平台有关。
__GFP_HIGHMEM
    在高端内存分配内存。一般为896M以上地址,具体与平台有关。
__GFP_REPEAT
    当分配失败时,会努力在尝试一次,重新尝试分配。但仍可能失败。
__GFP_NOFAIL
    始终不返回失败。不停尝试分配,不建议使用。
__GFP_NORETRY
    分配失败时,不再尝试,立即返回失败。
内存区段
linux内核把内存分为三个区段:
1.可用于DMA的内存
2.常规内存
3.高端内存
可用于DMA的内存:指外设可以利用这些内存执行DMA访问的内存,在X86平台上,DMA区段是RAM的前16MB.


阅读(1678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~