內存申請 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() 







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM