3.6. scull 的內(nèi)存使用

2018-02-24 15:49 更新

3.6.?scull 的內(nèi)存使用

在介紹讀寫(xiě)操作前, 我們最好看看如何以及為什么 scull 進(jìn)行內(nèi)存分配. "如何"是需要全面理解代碼, "為什么"演示了驅(qū)動(dòng)編寫(xiě)者需要做的選擇, 盡管 scull 明確地不是典型設(shè)備.

本節(jié)只處理 scull 中的內(nèi)存分配策略, 不展示給你編寫(xiě)真正驅(qū)動(dòng)需要的硬件管理技能. 這些技能在第 9 章和第 10 章介紹. 因此, 你可跳過(guò)本章, 如果你不感興趣于理解面向內(nèi)存的 scull 驅(qū)動(dòng)的內(nèi)部工作.

scull 使用的內(nèi)存區(qū), 也稱為一個(gè)設(shè)備, 長(zhǎng)度可變. 你寫(xiě)的越多, 它增長(zhǎng)越多; 通過(guò)使用一個(gè)短文件覆蓋設(shè)備來(lái)進(jìn)行修整.

scull 驅(qū)動(dòng)引入 2 個(gè)核心函數(shù)來(lái)管理 Linux 內(nèi)核中的內(nèi)存. 這些函數(shù), 定義在 <linux/slab.h>, 是:


void *kmalloc(size_t size, int flags); 
void kfree(void *ptr);

對(duì) kmalloc 的調(diào)用試圖分配 size 字節(jié)的內(nèi)存; 返回值是指向那個(gè)內(nèi)存的指針或者如果分配失敗為NULL. flags 參數(shù)用來(lái)描述內(nèi)存應(yīng)當(dāng)如何分配; 我們?cè)诘?8 章詳細(xì)查看這些標(biāo)志. 對(duì)于現(xiàn)在, 我們一直使用 GFP_KERNEL. 分配的內(nèi)存應(yīng)當(dāng)用 kfree 來(lái)釋放. 你應(yīng)當(dāng)從不傳遞任何不是從 kmalloc 獲得的東西給 kfree. 但是, 傳遞一個(gè) NULL 指針給 kfree 是合法的.

kmalloc 不是最有效的分配大內(nèi)存區(qū)的方法(見(jiàn)第 8 章), 所以挑選給 scull 的實(shí)現(xiàn)不是一個(gè)特別巧妙的. 一個(gè)巧妙的源碼實(shí)現(xiàn)可能更難閱讀, 而本節(jié)的目標(biāo)是展示讀和寫(xiě), 不是內(nèi)存管理. 這是為什么代碼只是使用 kmalloc 和 kfree 而不依靠整頁(yè)的分配, 盡管這個(gè)方法會(huì)更有效.

在 flip 一邊, 我們不想限制"設(shè)備"區(qū)的大小, 由于理論上的和實(shí)踐上的理由. 理論上, 給在被管理的數(shù)據(jù)項(xiàng)施加武斷的限制總是個(gè)壞想法. 實(shí)踐上, scull 可用來(lái)暫時(shí)地吃光你系統(tǒng)中的內(nèi)存, 以便運(yùn)行在低內(nèi)存條件下的測(cè)試. 運(yùn)行這樣的測(cè)試可能會(huì)幫助你理解系統(tǒng)的內(nèi)部. 你可以使用命令 cp /dev/zero /dev/scull0 來(lái)用 scull 吃掉所有的真實(shí) RAM, 并且你可以使用 dd 工具來(lái)選擇貝多少數(shù)據(jù)給 scull 設(shè)備.

在 scull, 每個(gè)設(shè)備是一個(gè)指針鏈表, 每個(gè)都指向一個(gè) scull_dev 結(jié)構(gòu). 每個(gè)這樣的結(jié)構(gòu), 缺省地, 指向最多 4 兆字節(jié), 通過(guò)一個(gè)中間指針數(shù)組. 發(fā)行代碼使用一個(gè) 1000 個(gè)指針的數(shù)組指向每個(gè) 4000 字節(jié)的區(qū)域. 我們稱每個(gè)內(nèi)存區(qū)域?yàn)橐粋€(gè)量子, 數(shù)組(或者它的長(zhǎng)度) 為一個(gè)量子集. 一個(gè) scull 設(shè)備和它的內(nèi)存區(qū)如圖一個(gè) scull 設(shè)備的布局所示.

圖?3.1.?一個(gè) scull 設(shè)備的布局

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)