W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們我們已經(jīng)在前面章節(jié)中注意到的, 大量連續(xù)內(nèi)存緩沖的分配是容易失敗的. 系統(tǒng)內(nèi)存長(zhǎng)時(shí)間會(huì)碎片化, 并且常常出現(xiàn)一個(gè)真正的大內(nèi)存區(qū)會(huì)完全不可得. 因?yàn)槌3S修k法不使用大緩沖來(lái)完成工作, 內(nèi)核開(kāi)發(fā)者沒(méi)有優(yōu)先考慮使大分配能工作. 在你試圖獲得一個(gè)大內(nèi)存區(qū)之前, 你應(yīng)當(dāng)真正考慮一下其他的選擇. 到目前止最好的進(jìn)行大 I/O 操作的方法是通過(guò)發(fā)散/匯聚操作, 我們?cè)诘?1 章的"發(fā)散-匯聚 映射"一節(jié)中討論了.
如果你真的需要一個(gè)大的物理上連續(xù)的緩沖, 最好的方法是在啟動(dòng)時(shí)請(qǐng)求內(nèi)存來(lái)分配它. 在啟動(dòng)時(shí)分配是獲得連續(xù)內(nèi)存頁(yè)而避開(kāi) __get_free_pages 施加的對(duì)緩沖大小限制的唯一方法, 不但最大允許大小還有限制的大小選擇. 在啟動(dòng)時(shí)分配內(nèi)存是一個(gè)"臟"技術(shù), 因?yàn)樗@開(kāi)了所有的內(nèi)存管理策略通過(guò)保留一個(gè)私有的內(nèi)存池. 這個(gè)技術(shù)是不優(yōu)雅和不靈活的, 但是它也是最不易失敗的. 不必說(shuō), 一個(gè)模塊無(wú)法在啟動(dòng)時(shí)分配內(nèi)存; 只有直接連接到內(nèi)核的驅(qū)動(dòng)可以這樣做.
啟動(dòng)時(shí)分配的一個(gè)明顯問(wèn)題是對(duì)通常的用戶它不是一個(gè)靈活的選擇, 因?yàn)檫@個(gè)機(jī)制只對(duì)連接到內(nèi)核映象中的代碼可用. 一個(gè)設(shè)備驅(qū)動(dòng)使用這種分配方法可以被安裝或者替換只能通過(guò)重新建立內(nèi)核并且重啟計(jì)算機(jī).
當(dāng)內(nèi)核被啟動(dòng), 它贏得對(duì)系統(tǒng)種所有可用物理內(nèi)存的存取. 它接著初始化每個(gè)子系統(tǒng)通過(guò)調(diào)用子系統(tǒng)的初始化函數(shù), 允許初始化代碼通過(guò)減少留給正常系統(tǒng)操作使用的 RAM 數(shù)量, 來(lái)分配一個(gè)內(nèi)存緩沖給自己用.
啟動(dòng)時(shí)內(nèi)存分配通過(guò)調(diào)用下面一個(gè)函數(shù)進(jìn)行:
#include <linux/bootmem.h>
void *alloc_bootmem(unsigned long size);
void *alloc_bootmem_low(unsigned long size);
void *alloc_bootmem_pages(unsigned long size);
void *alloc_bootmem_low_pages(unsigned long size);
這些函數(shù)分配或者整個(gè)頁(yè)(如果它們以 _pages 結(jié)尾)或者非頁(yè)對(duì)齊的內(nèi)存區(qū). 分配的內(nèi)存可能是高端內(nèi)存除非使用一個(gè) _low 版本. 如果你在為一個(gè)設(shè)備驅(qū)動(dòng)分配這個(gè)緩沖, 你可能想用它做 DMA 操作, 并且這對(duì)于高端內(nèi)存不是一直可能的; 因此, 你可能想使用一個(gè) _low 變體.
很少在啟動(dòng)時(shí)釋放分配的內(nèi)存; 你會(huì)幾乎肯定不能之后取回它, 如果你需要它. 但是, 有一個(gè)接口釋放這個(gè)內(nèi)存:
void free_bootmem(unsigned long addr, unsigned long size);
注意以這個(gè)方式釋放的部分頁(yè)不返回給系統(tǒng) -- 但是, 如果你在使用這個(gè)技術(shù), 你已可能分配了不少數(shù)量的整頁(yè)來(lái)用.
如果你必須使用啟動(dòng)時(shí)分配, 你需要直接連接你的驅(qū)動(dòng)到內(nèi)核. 應(yīng)當(dāng)如何完成的更多信息看在內(nèi)核源碼中 Documentation/kbuild 下的文件.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: