BIOS工程师手边事--GPT

当我们使用EFI模式安装win8,win10的时候,windows安装程序总是先显示一个窗口,让我们选择把OS安装在哪里。在这个界面,我们选择完安装介质的时候,有时候发现并不能顺利点击下一步进行安装。为何?因为这时候,硬盘格式并不满足GPT的要求。我们需要根据windows安装程序的提示,进行新建分区操作。当我们新建一个分区后,发现居然还有其它分区生成。不要生气,埋怨windows安装程序设计不合理,因为这是GPT格式的要求。多出来的分区是ESP,需要做以前MBR分区做的事情。

GPT相关知识可以在UEFI SPEC上查到,讲述得很详细。可以用RW读取硬盘,对照代码解析一个接一个结构体。下面就来捋一下GPT的相关知识。

1. Block协议

这个协议起着承上启下的作用,往上和硬件相关。往下为DISKIO提供接口,让下层程序开始变得与硬件无关。

BlockIO可以由BUS驱动安装,也可以由设备驱动安装。具体要看设备类型。

2. DiskIo协议

这个协议其实是对BlockIo的封装,让使用者从扇区的概念中脱离出来。

3. Partition和GPT

//
// Partition Driver Global Variables.
//
EFI_DRIVER_BINDING_PROTOCOL gPartitionDriverBinding = {
  PartitionDriverBindingSupported,
  PartitionDriverBindingStart,
  PartitionDriverBindingStop,
  //
  // Grub4Dos copies the BPB of the first partition to the MBR. If the 
  // DriverBindingStart() of the Fat driver gets run before that of Partition 
  // driver only the first partition can be recognized.
  // Let the driver binding version of Partition driver be higher than that of
  // Fat driver to make sure the DriverBindingStart() of the Partition driver
  // gets run before that of Fat driver so that all the partitions can be recognized.
  //
  0xb,
  NULL,
  NULL
};

3.1 PartitionDriverBindingSupported()

由这个函数可以知道,要想将PartitionDriver安装在这个ControllerHandler上面,必须满足两个条件,该ControllerHandler上面安装了DiskIo和BlockIo协议。

3.2 PartitionDriverBindingStart()

这个函数是GPT最重要的部分。它分析磁盘格式,用来注册磁盘各个分区。

PartitionInstallGptChildHandles()首先读取第0个BLOCK,作为ProtectiveMBR,其与古老的MBR兼容,先分析其合法性,如果不合法,便不是GPT格式。然后读取第二个BLOCK作为PrimaryGPT和最后一个BLOCK作为BackupGPT,对其进行分析和校验,以确定其满足GPT格式。PrimaryGPT包含了很多有用的信息,其中包括PARTITION ENTRY开始的BLOCK No.和Partition entry个数以及Partition entry的大小。根据上述信息,我们可以分别在有效的PartitionEntry上建立分区的HardwareDevicePath,并将其附在其Parent DevicePath之后,并将其和BlockIO,DiskIO一起安装在新的HANDLE上,作为一个磁盘分区。

4. FAT

由3节所建立的Partition,我们可以将FAT,NTFS,EXT等驱动分别尝试往上挂,如果其满足FAT等驱动的要求,就在其上安装FAT等协议。到BDSBoot的时候,我们可以不再管以上的那些繁锁的步骤,直接加载FAT协议来启动OS Loader就好了。



(完)


















你可能感兴趣的:(BIOS,EFI基础)