#includevoid *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.
阅读(1710) | 评论(0) | 转发(0) |