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