基于UEFI的BIOS怎么识别不同设备(SataHdd、SataCdrom、USB、BMC)
基于UEFI的BIOS怎么识别不同设备(SataHdd、SataCdrom、USB、BMC)
参考:UEFI_SPEC
第一种方法:
SATA设备根据EFI_ATA_DEVICE_TYPE类型来细分
ATAPI接口是SCSI和IDE总线的结合产物。该接口使用IDE接口和协议机型ATA和SCSI总线命令传输,允许使用ATAPI控制所连接的SCSI设备。
1、EFI_ATA_PASS_THRU_PROTOCOL
提供允许将ATA命令发送到附加到ATA控制器上的ATA设备的服务。基于包的命令只能通过扩展SCSI协议发送到ATAPI设备。当ATA_PASS_THRU向ATA公开一个接口,EXT_SCSI_PASS_THRU负责为同一ATA控制器上的ATAPI设备公开基于数据包的命令接口。
Status =gBS->LocateHandleBuffer (ByProtocol,&gEfiAtaPassThruProtocolGuid,NULL,&NumberHandles,&AtaPassHandles);
用LocateHandleBuffer 定位支持gEfiAtaPassThruProtocolGuid的句柄。
2、循环遍历获得的句柄,获得支持gEfiAtaPassThruProtocolGuid的接口AtaPassProtocol
for (Index = 0; Index < NumberHandles; Index++) {Status = gBS->HandleProtocol (AtaPassHandles[Index],&gEfiAtaPassThruProtocolGuid,(VOID **) &AtaPassProtocol);if (Status == EFI_SUCCESS) {Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassProtocol);Node = GetFirstNode (&Instance->DeviceList);while (!IsNull (&Instance->DeviceList, Node)) {ATADeviceInfo = ATA_ATAPI_DEVICE_INFO_FROM_THIS (Node);Node = GetNextNode (&Instance->DeviceList, Node);}
}
3、判断条件:区分SataHdd和SataCdrom:
SataHdd:ATADeviceInfo->Type == EfiIdeHarddisk
SataCdrom:ATADeviceInfo->Type == EfiIdeCdrom;
typedef enum {
EfiIdeCdrom, /* ATAPI CDROM /
EfiIdeHarddisk, / Hard Disk /
EfiPortMultiplier, / Port Multiplier */
EfiIdeUnknown
} EFI_ATA_DEVICE_TYPE;
EFI_ATA_DEVICE_TYPE对SATA的设备类型进行细分,Cdrom,和Harddisk都接的SATA口,使用ATA类型可以进一步划分。
第二种方法:分析设备路径类型
设备路径的区分通过EFI_DEVICE_PATH_PROTOCOL的Type和SubType的值进行区分
1、EFI_DEVICE_PATH_PROTOCOL.
设备路径用于定义指向设备的编程路径。设备路径的主要目的是允许一个应用程序,例如操作系统加载程序,来确定接口正在抽象的物理设备。
可用于任何设备句柄,以获取有关物理设备或逻辑设备的通用路径/位置信息。如果句柄在逻辑上没有映射到物理设备,则该句柄可能不一定支持设备路径协议。设备路径描述了该手柄所对应的设备的位置。设备路径的大小可以由组成设备路径的结构来确定。
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;
0x01 Hardware Device Path:硬盘设备路径。
0x02 ACPI Device Path. ACPI设备路径,
0x03 Messaging Device Path. SCSI设备路径:
0x04 Media Device Path. 硬盘上的分区路径
0x05 BIOS Boot Specification Device Path. 指向引导旧的操作系统的设备路径
0x7F End of Hardware Device Path. 硬件设备路径的结束。
2、主要几种设备的类型举例
需要更多类型,应查看UEFI SPEC
2.1、PCI Device Path
Mnemonic | ByteOffset | Byte Length | Description |
---|---|---|---|
type | 0 | 1 | Type 1 – Hardware Device Path |
Sub-Type | 1 | 1 | Sub-Type 1 – PCI |
Length | 2 | 2 | Length of this structure is 6 bytes |
2.2、BMC Device Path | |||
Mnemonic | ByteOffset | Byte Length | Description |
-------- | ----- | ----- | ----- |
type | 0 | 1 | Type 1 – Hardware Device Path |
Sub-Type | 1 | 1 | Sub-Type 6 – BMC |
Length | 2 | 2 | Length of this structure in bytes. Length is 13 bytes |
2.3、ATAPI Device Path | |||
Mnemonic | ByteOffset | Byte Length | Description |
-------- | ----- | ----- | ----- |
type | 0 | 1 | Type 3 – Messaging Device Path |
Sub-Type | 1 | 1 | Sub-Type 6 – Sub-Type 1 – ATAPI |
Length | 2 | 2 | Length of this structure in bytes. Length is 13 bytes |
2.4、SCSI Device Path | |||
Mnemonic | ByteOffset | Byte Length | Description |
-------- | ----- | ----- | ----- |
type | 0 | 1 | Type 3 – Messaging Device Path |
Sub-Type | 1 | 1 | Sub-Type 6 – Sub-Type 2– SCSI |
Length | 2 | 2 | Length of this structure in bytes. Length is 8 bytes |
2.5、USB Device Paths | |||
Mnemonic | ByteOffset | Byte Length | Description |
-------- | ----- | ----- | ----- |
type | 0 | 1 | Type 3 – Messaging Device Path |
Sub-Type | 1 | 1 | Sub-Type 6 – Sub-Type 5– USB |
Length | 2 | 2 | Length of this structure in bytes. Length is 6 bytes |
2.6、 MAC Address Device Path | |||
Mnemonic | ByteOffset | Byte Length | Description |
-------- | ----- | ----- | ----- |
type | 0 | 1 | Type 3 – Messaging Device Path |
Sub-Type | 1 | 1 | Sub-Type 11 – MAC Address for a network interface |
Length | 2 | 2 | Length of this structure in bytes. Length is 37 bytes |
3、判断ClassCode的值
Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiPciIoProtocolGuid,NULL,&HandleArrayCount,&HandleArray);if (EFI_ERROR(Status)) {return OCPPortNum;}for (Index2=0; Index2<HandleArrayCount; Index2++){Status = gBS->HandleProtocol(HandleArray[Index2],&gEfiPciIoProtocolGuid,(VOID **)&PciIo);Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint8,0x0B, //PCI_CLASSCODE_OFFSET1,&BaseClass);Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint8,0x0A, //PCI_CLASSCODE_OFFSET1,&SubClass);}if(BaseClass == 0x02){// 网卡}if((BaseClass == 0x01)&&((SubClass == 0x07)||(SubClass == 0x04)){// raid卡}
基于UEFI的BIOS怎么识别不同设备(SataHdd、SataCdrom、USB、BMC)相关推荐
- easyuefi只能在基于uefi启动的_电脑知识:5分钟教你深入了解BIOS+MBR和UEFI+GPT
现如今很多的朋友都会自己装电脑系统,隔三差五就重装系统,俗话说:没有重装系统解决不了的问题,如果有,就装两遍!!!问题是解决了,但是对其中的操作有没有更深刻的了解呢?比如装系统中涉及到的 Legacy ...
- easyuefi只能在基于uefi启动的_云计算学习体系-1.1-计算机硬件基础扩展知识BIOS/UEFI/MBR/GPT...
我们每天都在用电脑,很多人可能每天都要面对多次Windows的启动过程,可是您知道在Windows的启动过程背后,你真真了解过吗?上文中我们认识了计算机的基本硬件,其中讲到BIOS和UEFI,下次内容 ...
- 惠普服务器装系统无法识别u盘,惠普uefi bios无法识别u盘的解决方法
3.如何解决惠普电脑uefi识别不了u盘 2.进入bios后,切换到system configuration选项卡,在按"↓"键移动到boot options并按回车键,如图所示: ...
- 基于DSP/BIoS设备驱动模型的视频驱动程序开发
作者:天津科技大学 电子信息与自动化学院 严新忠,刘 喆 通过给外部设备编写驱动程序是一种有效的控制外设的方法.随着DSP的应用越来越广泛,DSP实时系统的日趋复杂及新技术的出现,DSP处理器所连接的 ...
- easyuefi只能在基于uefi启动的_如何以简单正确的姿势理解“UEFI”和“BIOS”?
在进行电脑重装的时候,我们常会听到UEFI和BIOS这两个词,例如怎么进入BIOS启动设置页面,电脑不支持UEFI启动等等,但是我们对其背后的含义却没有什么了解,实际上这些都是比较基础的知识,理解这些 ...
- easyuefi只能在基于uefi启动的_systemd时代的开机启动流程(UEFI+systemd)
本文内容预告: 开机启动流程图预览 按下电源和固件阶段 内核启动阶段 内核启动后,用户登录前 计算机启动流程可以分为几个大阶段: 内核加载前 本阶段和操作系统无关,Linux或Windows或其它系统 ...
- UEFI、BIOS、Secure Boot的关系和知识介绍
从Windows 8操作系统时代开始,安装操作系统的方法也有了很大的改变,Windows 8采用了Secure Boot引导启动的方式,而不是过去Win XP和Win 7的Legacy启动方式,从而导 ...
- 华硕主板固态硬盘不识别_华硕b360主板bios不识别m.2固态怎么办?
[文章导读]nvme m.2硬盘由于有更好的传输速度和性能越来越受到用户的欢迎,但是在安装中也会遇到一些问题,如有用户反馈华硕B360主板在安装了NVMe m.2固态硬盘之后BIOS中无法识别的问题, ...
- easyuefi只能在基于uefi启动的_UEFI模式有什么优点?安装系统首选UEFI启动,电脑系统速度更流畅...
legacy启动是什么?UEFI启动是什么?可能大部分朋友对这个概念都比较模糊,UEFI可以做什么呢?有什么具体的作用?似乎经常可以在BIOS设置里会见到它,毕竟从几年前开始越来越多的电脑都使用上了带 ...
最新文章
- 蓝桥杯第九届决赛-交换次数-java
- R语言ggplot2可视化绘制多条基本线图(Basic line plot)、使用gghighlight包突出高亮其中的某一条线图(highlight line plot)
- 使用Poco实现插件方式加载动态库
- java常用类解析十:Date类和Calendar类示例
- poj 1384 完全背包
- VTK:PolyData之AttachAttributes
- 按钮是什么意思_汽车里的Rear按键是什么意思?
- ACRush 楼天城回忆录
- ubuntu12.04samba服务器配置
- 在Visual Studio中利用NTVS创建Pomelo项目
- JAVA进阶教学之(foreach)
- android media apex_APEX英雄主播即将登陆时代广场?人气十强介绍!
- 【转】NB的specify
- nginx学习笔记 nginx 配置文件位置 常用命令
- 使用JSONP实现跨域通信
- python自动化办公手册之python操作PPT
- Gym 10102B 贪心
- [noip模拟赛]算算数
- MSP430F149;一、TIMEA
- 解决IE系列浏览器上传页面接收问题