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