第三章 設計與實作
3.2 管理機制與核心模組的實作
3.2.3 Flash Memory Kernel Module 的實作
因為在撰寫這篇論文的當下,我們沒有Linux 對於 hybrid disk 的驅動程式。但為求 證實我們演算法的效能,因此我們做了一個模擬flash memory 的 Linux kernel module。
我們沒有利用USB thumb drive 是因為它使用的是 USB 的 interface 不是 IDE 的 interface 並且有其software protocol 的 overhead,做出來的結果並不會比較準確。而我們在 kernel module 中動態的加入 flash memory 使用時的 time delay 可以更接近 hybrid disk 的架構,
以下將以五方面描述此kernel module 之實作:
1. Flash memory 的模擬:
我們的kernel module 以主記憶體 DRAM 來模擬 hybrid disk 中的 flash memory。
Kernel module 向記憶體要求部份空間當作 flash memory 的空間。我們利用了 Linux 內建要求記憶體的函式__get_free_pages()向系統要求記憶體空間。在插入 kernel module 時,我們以一次配置一張 page 的方式呼叫此函式將整個 flash memory 所需要的記憶體配置出來。
2. Pin 的動作:
我們透過將資料複製到我們kernel module 所配置之記憶體的方式來模擬 pin 的 動作。此外,為了能夠在爾後找到該筆資料,我們將該資料在磁碟上之block number 與在 kernel module 所配置之記憶體中之位置關聯起來。這些關聯存在一 個pin table 中。圖九顯示每一個 pin table entry 之格式。
3. 供應資料的動作:
如圖十,當系統需要的硬碟資訊不在記憶體時,系統會對硬碟發出request,我 們會去攔截這樣的需求,利用block number 先去比對 kernel module 裡面保留的 資料有沒有符合這次需求的資料並且檢查其invalid bit 是否為 0,如果有這個資 entry 設成 invalid。
5. 模擬 flash memory 速度的動作:
我們參考了之前flash memory 方面的文獻[32],在 kernel module 裡面加入了 time delay 以模擬 flash memory 讀取和寫入,使此模擬更加接近實際的狀況。此 外在flash memory 中進行 erase 運算所造成的 overhead 比較難以模擬正確的時 間,因為這牽涉到cleaning policy 的運作。而此 policy 則是內建於 hybrid disk 的 firmware 中,所以我們在無法得知某一特定的 hybrid disk 所用之 cleaning policy 的情況下,不容易去準確地模擬出其效能。因此,我們採用一個簡單的cleaning
policy:當 kernel module 沒有任何空間放入複製的 page 時,kernel module 會利用 我們的pin table 找尋在 table 中 invalid bit 為 1 的 entry 將其 block number 設成 0,
以代表此區的資料被清除。而在flash memory 中 erase 的動作是以 block 為單位,
一個block 一般來說是 16KBytes 的大小,而一個 entry 代表一張 page 的資料是 4KBytes。因此,以 4 個 entry cleans 做為一次 erase 計算加入 erase 所花費的時 間加在kernel module 之中。來計算 flash erase 所造成的時間。企圖更加接近實 際所花費的時間。
圖九 Kernel module 中 pin table entry 的結構
最後圖十一是資料在我們實作下的整體流程。Linux buffer cache 置換出來的資料(如 圖十一(1))透過我們 filter 的挑選,將符合我們需求的資料保存在 kernel module(emulated flash layer)中(如圖十一(2)),在系統對硬碟作 IO request 時,先檢查此 layer 是否有資料(如 圖十一(3)),如果有就回應系統需求並且結束此次 IO 流程(如圖十一(4)),如果沒有就按 照原本的行為從硬碟中讀取資料(如圖十一(5))。
圖十 Kernel module 在 Linux kernel 中的運作
圖十一 實作總圖