uefi里面device path 是什么 ? 长什么样

在EDK II 代码里面,DEVICE PATH 长这个样子

/**
  This protocol can be used on any device handle to obtain generic path/location 
  information concerning the physical device or logical device. If the handle does 
  not logically map to a physical device, the handle may not necessarily support 
  the device path protocol. The device path describes the location of the device 
  the handle is for. The size of the Device Path can be determined from the structures 
  that make up the Device Path.
**/
typedef struct {
  UINT8 Type;       ///< 0x01 Hardware Device Path.
                    ///< 0x02 ACPI Device Path.
                    ///< 0x03 Messaging Device Path.
                    ///< 0x04 Media Device Path.
                    ///< 0x05 BIOS Boot Specification Device Path.
                    ///< 0x7F End of Hardware Device Path.
                    
  UINT8 SubType;    ///< Varies by Type
                    ///< 0xFF End Entire Device Path, or
                    ///< 0x01 End This Instance of a Device Path and start a new
                    ///< Device Path.
                    
  UINT8 Length[2];  ///< Specific Device Path data. Type and Sub-Type define
                    ///< type of data. Size of data is included in Length.
                    
} EFI_DEVICE_PATH_PROTOCOL;
但是这个还是很抽象,我们以创文件为例,在debug 模式,看看它的真实模样:

EfiShellCreateFile(
  IN CONST CHAR16       *FileName,
  IN UINT64             FileAttribs,
  OUT SHELL_FILE_HANDLE *FileHandle
  )
{
  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
  EFI_STATUS                Status;
  BOOLEAN                   Volatile;

  //
  // Is this for an environment variable
  // do we start with >v
  //
  if (StrStr(FileName, L">v") == FileName) {
    Status = IsVolatileEnv (FileName + 2, &Volatile);
    if (EFI_ERROR (Status)) {
      return Status;
    }
    if (!Volatile) {
      return (EFI_INVALID_PARAMETER);
    }
    *FileHandle = CreateFileInterfaceEnv(FileName+2);
    return (EFI_SUCCESS);
  }

  //
  // We are opening a regular file.
  //
  DevicePath = EfiShellGetDevicePathFromFilePath(FileName);

  __asm int 3;
  if (DevicePath == NULL) {
    return (EFI_NOT_FOUND);
  }

  Status = InternalOpenFileDevicePath(DevicePath, FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, FileAttribs);
  FreePool(DevicePath);

在这里,我放了一个 __asm int 3; 这个内嵌的汇编语言,能起到一个断点的作用,程序运行到这里,会自然停下来,然后我们就可以通过观察局部变量知道它真实的样子了。

首先通过它在函数里面的定义,我们可以看到它是一个结构体指针,指针的意思相信大家都知道,指针即地址,意思是从这之后,挨个摆着的是device path.





个人UEFI签名证书,全称为Unified Extensible Firmware Interface(统一可扩展固件接口)签名证书,是一种用于验证和保护计算机主板上固件安全的数字签名。UEFI是现代计算机启动加载程序的标准,它取代了传统的BIOS,提供了更高级别的系统管理功能和兼容性。 这个证书的作用主要有以下几点: 1. **身份验证**:确保固件来自可信的来源,防止恶意修改或冒充制造商发布的更新。 2. **安全更新**:用户和系统管理员可以信任更新为来自证书持有者的官方内容,防止恶意软件通过替换固件进行攻击。 3. **系统稳定性**:确保固件的完整性,防止因错误或恶意篡改导致的系统崩溃或不稳定性。 要获取个人UEFI签名证书,通常你需要作为一家硬件开发商或开发者按照以下步骤操作: 1. **申请过程**:联系认证机构,如AuthenTrend、Thomson Reuters或者其他UEFI签名服务提供商,提交相关的资质信息和企业信息。 2. **满足标准**:证明你有能力和资源来创建和分发安全的固件,这可能包括安全开发流程和符合UEFI规范的证书管理系统。 3. **支付费用**:证书申请通常涉及费用,具体金额取决于服务提供商和证书类型。 4. **培训与指导**:接受必要的安全性和UEFI知识培训,确保正确使用和维护签名证书。 5. **获得证书**:通过审核后,你会收到个人UEFI签名证书,将其绑定到你的固件开发工具中使用。 如果你是个体开发者或者不直接参与到硬件制造过程中,你可能不需要亲自获取这种证书,而是依赖于设备制造商或第三方服务来处理这些细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值