這篇文章主要為大家展示了“Linux內(nèi)核環(huán)境下怎么申請大塊內(nèi)存”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux內(nèi)核環(huán)境下怎么申請大塊內(nèi)存”這篇文章吧。
創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計,有關(guān)企業(yè)網(wǎng)站設(shè)計方案、改版、費用等問題,行業(yè)涉及成都鑿毛機等多個領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認可。在Linux內(nèi)核環(huán)境下,申請大塊內(nèi)存的成功率隨著系統(tǒng)運行時間的增加而減少,雖然可以通過vmalloc系列調(diào)用申請物理不連續(xù)但虛擬地址連續(xù)的內(nèi)存,但畢竟其使用效率不高且在32位系統(tǒng)上vmalloc的內(nèi)存地址空間有限。所以,一般的建議是在系統(tǒng)啟動階段申請大塊內(nèi)存,但是其成功的概率也只是比較高而已,而不是100%。如果程序真的比較在意這個申請的成功與否,只能退用“啟動內(nèi)存”(Boot Memory)。下面就是申請并導(dǎo)出啟動內(nèi)存的一段示例代碼:
void* x_bootmem = NULL; EXPORT_SYMBOL(x_bootmem); unsigned long x_bootmem_size = 0; EXPORT_SYMBOL(x_bootmem_size); static int __init x_bootmem_setup(char *str) { x_bootmem_size = memparse(str, &str); x_bootmem = alloc_bootmem(x_bootmem_size); printk("Reserved %lu bytes from %p for x\n", x_bootmem_size, x_bootmem); return 1; } __setup("x-bootmem=", x_bootmem_setup);
可見其應(yīng)用還是比較簡單的,不過利弊總是共生的,它不可避免也有其自身的限制:
1.內(nèi)存申請代碼只能連接進內(nèi)核,不能在模塊中使用。
2.被申請的內(nèi)存不會被頁分配器和slab分配器所使用和統(tǒng)計,也就是說它處于系統(tǒng)的可見內(nèi)存之外,即使在將來的某個地方你釋放了它。
3.一般用戶只會申請一大塊內(nèi)存,如果需要在其上實現(xiàn)復(fù)雜的內(nèi)存管理則需要自己實現(xiàn)。
在不允許內(nèi)存分配失敗的場合,通過啟動內(nèi)存預(yù)留內(nèi)存空間將是我們的選擇。
以上是“Linux內(nèi)核環(huán)境下怎么申請大塊內(nèi)存”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!