Efi Ext驱动支持

本文介绍了EFI BIOS如何支持EXT文件系统,包括EXT文件系统的结构、读取文件的方式、主要数据结构和实现方法。通过解析超级块、块组描述符、inode结构,实现了从EXT分区读取文件数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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选项。

 


<think>嗯,用户之前问过关于ext3文件系统的问题,现在又转向了EFI。我需要确定他们是否在了解操作系统或启动过程相关的知识。可能用户正在搭建系统,或者对计算机启动机制感兴趣。 首先,EFI的全称是Extensible Firmware Interface,后来发展成UEFI。需要解释清楚EFI和UEFI的关系,避免混淆。用户可能对这两个术语不太清楚,要简明扼要地说明。 接下来,用户可能需要了解EFI的作用,比如替代传统的BIOS,提供更现代的启动环境。需要强调EFI带来的改进,比如支持更大的硬盘、图形界面、安全启动等特性。同时,对比传统BIOS的局限性,帮助用户理解为什么EFI更重要。 用户可能还关心EFI的实际应用场景,比如在安装操作系统时的分区格式(GPT),或者如何访问EFI系统分区。需要提供一些实际操作的例子,比如使用命令行工具查看分区,或者启动配置。 另外,考虑到用户之前的问题涉及文件系统,可能需要提到EFI系统分区(ESP)的文件系统格式(通常是FAT32),以及其在系统启动中的作用。这部分内容可以结合之前的ext3介绍,展示不同文件系统的应用场景。 还要注意用户的技术水平,避免使用过多专业术语,用通俗易懂的语言解释。比如,将“固件”解释为“嵌入硬件的基础软件”,帮助用户理解EFI的位置和作用。 最后,确保回答结构清晰,分点列出核心要点,便于用户逐步理解。可能需要包括基本概念、核心功能、与传统BIOS的对比、组成结构、实际应用和操作示例等部分。同时,检查是否需要补充UEFI的安全启动、兼容性支持模块(CSM)等内容,以全面覆盖用户可能的需求。 检查是否有遗漏的重要信息,比如EFI的发展历史,从EFI到UEFI的演变,以及当前的主流支持情况。确保用户知道现在大多数系统使用的是UEFI,而EFI是前身,但两者常被混用。 总结来说,回答需要全面覆盖EFI的定义、功能、优势、结构、应用场景和实际操作,同时保持语言简洁明了,结构清晰,帮助用户逐步建立对EFI的理解。</think>--- ### 一、基本概念 **EFI**(Extensible Firmware Interface,可扩展固件接口)是计算机启动时运行的**底层固件标准**,最初由 Intel 在 2005 年提出,后发展为 **UEFI**(Unified EFI)。它取代了传统的 **BIOS**(Basic Input/Output System),提供更现代化、灵活的硬件初始化与操作系统引导环境。 --- ### 二、核心功能与优势 #### 1. **与传统 BIOS 的对比** | 特性 | BIOS | EFI/UEFI | |---------------------|--------------------------|------------------------------| | **启动模式** | 仅 16 位 | 32/64 位 | | **硬盘支持** | MBR 分区(最大 2TB) | GPT 分区(最大 9.4 ZB) | | **图形界面** | 文本界面 | 支持图形化设置 | | **启动速度** | 较慢 | 更快(并行初始化硬件) | | **安全特性** | 无 | Secure Boot(防止恶意程序) | #### 2. **核心改进** - **支持大容量存储**:突破传统 BIOS 的 2TB 限制。 - **模块化设计**:可通过驱动程序扩展功能(如网络启动、加密)。 - **独立于操作系统**:提供标准接口,简化操作系统开发。 --- ### 三、EFI 系统组成 1. **EFI 系统分区(ESP)** - **作用**:存储启动加载程序(如 GRUB)、驱动程序和系统工具。 - **格式**:通常为 FAT32(兼容性强)。 - **路径**:`/boot/efi`(Linux 系统中挂载点)。 2. **启动管理器** - 允许选择不同操作系统(如 Windows/Linux 双系统)。 3. **UEFI 固件设置** - 提供硬件配置界面(按 `Del`/`F2` 等键进入)。 --- ### 四、实际应用场景 1. **操作系统安装** - 现代操作系统(Windows 10/11、Linux 发行版)默认要求 **UEFI + GPT** 分区。 - 示例:安装 Linux 时需创建 ESP 分区(建议 512MB 以上)。 2. **安全启动(Secure Boot)** - 防止未签名恶意软件篡改启动过程(需操作系统支持)。 3. **快速启动技术** - 结合 UEFI 实现 Windows 的 "快速启动" 功能。 --- ### 五、操作示例 #### 1. **检查系统是否使用 UEFI** ```bash # Linux 下查看 ls /sys/firmware/efi # 若存在 efi 目录则为 UEFI 启动 # Windows 下: msinfo32 → 查看 "BIOS 模式" ``` #### 2. **查看 EFI 分区内容(Linux)** ```bash mount /dev/nvme0n1p1 /mnt # 挂载 ESP 分区 ls /mnt/EFI # 查看启动项 ``` #### 3. **修复 UEFI 启动(Windows)** ```cmd # 使用安装盘进入命令行,执行: bootrec /fixboot bcdboot C:\Windows /s S: # S: 为 ESP 分区盘符 ``` --- ### 六、注意事项 1. **兼容性支持模块(CSM)** - 旧硬件可启用 CSM 以兼容传统 BIOS 模式,但会丧失 UEFI 优势。 2. **分区对齐** - UEFI 要求 GPT 分区,需注意 4K 对齐以优化性能。 3. **备份 EFI 分区** - 损坏 ESP 分区会导致系统无法启动,建议定期备份。 --- 通过 EFI/UEFI,计算机实现了更安全、高效且灵活的启动方式。掌握其原理对系统维护、多系统安装和故障修复至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值