Efi Ext驅動支持

1 EFI文件系統現狀

    無論是EDK還是最新的EDKII,都只支持FAT,並沒有對LINUX系統原生態文件系統EXT進行支持。我剛寫了EXT驅動沒多長時間,趁着沒有忘記,就把整個過程寫下來,俗話說的好,好記性不如賴筆頭。

 

2 EXT文件系統結構

   我們來看一張圖:


上面的圖爲一個磁盤分區的結構。

最起始的部分是BootBlock,固定佔有1024字節,只是磁盤廠商傳承下來的產物,對於我們的文件系統來說並無幫助。

Block Group,EXT爲了便於管理磁盤,便將磁盤劃分爲不同的塊組。因爲操作系統不是以扇區爲單位進行磁盤讀取,而是以邏輯塊爲基本單位進行讀取,在BITMAP中每一個BIT代表一個邏輯塊,所以可以將邏輯塊乘以8組成一個塊組。這樣就方便了磁盤管理和讀取。

SuperBlock,佔有1024字節,磁盤格式化後,便維護着這樣一個結構。這個結構特別重要,它指示了整個文件系統的Block和Inode的大小、Block和Inode的數量、Block和Inode的已使用和未使用數量、文件系統版本號、最近一次掛載時間等等。

Group Description,組描述符,整個文件系統只使用Block Goup0的組描述符即可,其它不用訪問,只是數據的一個拷貝。它記錄着各個BLOCK GROUP的BLOCK BITMAP和INODE BITMAP的起始位置。

DataBlock Bitmap:本組數據塊使用情況,使用過,其BIT設爲1,空閒則爲0。

Inode Bitmap:本組Inode Table使用情況,其用法與DataBlockBitmap相同。作爲EFI生BIOS工程師,我們只負責讀取文件系統,並不會去往磁盤上寫數據,所以這兩個結構可以不去管它們。

Inode Table:每個目錄或文件都佔用一個Inode,用Inode Table來描述此目錄或文件的使用情況及屬性。對於EFI BIOS工程師來說,我們更注重其中的數據塊及佔有的數據塊數量以及一級指針,二級指針三級指針幾個字段,因爲這關係到我們讀取文件數據。文件大小不一般來講,並不是正好是BLOCKSIZE整數倍大小,那怎麼可以讀到大小正確數據值?這裏面還有一個SIZE大小的字段,整個數據BLOCK的最後一個BLOCK要根據這個SIZE字段來截斷。

DataBlock:我們解析目錄和文件都在這裏。如果是目錄,就有一個DIR_ENTRY的結構來解析此數據塊。

以上便是理論部分。具體應該怎麼做呢?下面我便粗略地描述一下讀文件方式,因爲作爲EFI BIOS工程師來說,更關心如何讀取文件。

 

3 讀取文件方式

    我們想要讀取一個文件,首先要找到其inode號,然後根據inode號找到inodetable中對應的inode結構,則inode結構找到數據塊及大小,然後將其讀出。

我們來看一下紅帽的grub.efi讀取。當然它是FAT文件系統,但我們先假設其是EXT文件格式的。其路徑爲:\EFI\redhat\grub.efi

    首先找根目錄\,其inode號固定爲2,其肯定在Group Block0內,找到其inode結構,然後找到其數據塊,根據DIR_ENTRY檢索EFI目錄項。

    由EFI目錄項,可以找到其佔用的inode號,同理可以找到其對應的inode結構,進而找到其數據塊,分析並得到redhat目錄項。

    同上面兩個步驟一樣,再次循環得到grub.efi文件項。

    在grub.efi文件項中可以找到其對應的inode號,由inode號找到其對應的inode結構,進而找到其佔用的數據塊和文件大小,將其所有數據塊讀出,並由SIZE確定最後一個數據塊佔用大小,其所有數據塊最終組成一個文件就是grub.efi文件的數據。

 

4 主要數據結構

   讀取文件所用到的結構羅列如下:

    超組塊,塊描述符,Inode結構,文件目錄項,其結構可以自行在網上查找。

 

5 具體做法

(1)建一EXT驅動,因爲其會爲很多控制器提供驅動,所以類型選擇UEFI_DRIVER。

(2)在驅動入口處,安裝binding協議。

(3)在Supported函數中,規定非裝有DISKIO和BlockIO的控制器不得進入。

(4)在Start函數中,讀取superblock,並根據其字段判斷該分區是否支持EXT文件系統,若是便將EXT解析函數封裝爲一個Ext協議,並安裝在該控制器上。

(5)在LoadImage中,在FAT讀取程序段下面,添加EXT數據讀取程序段。

(6)在BootOption枚舉函數中,檢索各個裝有Ext協議的控制器是否有我們所需要的BootLoader,如果有,便爲其註冊BoorOrder選項。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章