核心記憶體配置

來源:互聯網
上載者:User

標籤:

在應用程式中,常使用malloc函數進行動態記憶體分配,而在Linux核心中,通常使用kmalloc來動態分配記憶體。

kmalloc 原型是:
#include <linux/slab.h>
void *kmalloc(size_t size, int flags)

參數:
size:要分配的記憶體大小。
flags:分配標誌, 它控制 kmalloc 的行為。

1、最常用的標誌是GFP_KERNEL(內部最終通過調用 __get_free_pages 來進行, 它是 GFP_ 首碼的來源),它的意思是該記憶體配置是由運行在核心態的進程調用的。

也就是說,調用它的函數屬於某個進程的,當空閑記憶體太少時,kmalloc函數會使當前進程進入睡眠,等待空閑頁的出現。

 

2、如果kmalloc是在進程上下文之外調用,比如在中斷處理,任務隊列處理和核心定時器處理中。這些情況屬於中斷上下文,不能進入睡眠,

這時應該使用優先權GFP_ATOMIC。

3、GFP_ATOMIC
用來在進程上下文之外的代碼(包括中斷處理)中分配記憶體,從不睡
眠。
4、GFP_KERNEL
進程上下文中的分配。可能睡眠。(16M-896M)
5、__GFP_DMA
這個標誌要求分配能夠 DMA 的記憶體區(物理地址在16M以下的頁
幀 )
6、__GFP_HIGHMEM
這個標誌表示分配的記憶體位於高端記憶體。(896M以上)

 

用kfree函數來釋放kmalloc分配的記憶體

 

如果模組需要分配大塊的記憶體,那使用面向頁的分配技術會更好

get_zeroed_page(unsigned int flags)
返回指向新頁面的指標,並將分頁清空。

__get_free_page(unsigned int flags)
和get_free_page類似,但不清零頁面。

__get_free_pages(unsigned int flags,unsigned int order )
分配若干個連續的頁面,返回指向該記憶體地區的指標,但也不清零這段記憶體地區。

當程式用完這些頁, 可以使用下列函數之一來釋放它們:

void free_page(unsigned long addr)
void free_pages(unsigned long addr, unsigned
long order)

如果釋放的和先前分配數目不等的頁面,會導致系統錯誤

 

核心記憶體配置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.