内存申请 GFP_KERNEL GFP_ATOMIC

Linux 内核空间申请内存涉及的函数主要包括 kmalloc()_ _get_free_pages()和vmalloc()

  

1、kmalloc()和_ _get_free_pages()(及其类似函数)申请的内存位于物理内存映射区域而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系
2、vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而 vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系 

使用 GFP_ KERNEL 标志申请内存时,若暂时不能满足,则进程会睡眠等待页,即会引起阻塞,因此不能在中断上下文或持有自旋锁的时候使用GFP_KERNE 申请内存 

在中断处理函数、tasklet 和内核定时器等非进程上下文中不能阻塞,此时驱动应当使用 GFP_ATOMIC 标志来申请内存。当使用 GFP_ATOMIC 
标志申请内存时,若不存在空闲页,则不等待,直接返回

 vmalloc()不能用在原子上下文中,因为它的内部实现使用了标志为 GFP_KERNEL 的kmalloc() 






posted on 2018-09-10 17:42  紫枫术河  阅读(6079)  评论(0编辑  收藏  举报

导航