无操作系统情况下如何获取硬件信息?操作系统如何识别硬件?
无OS场景下硬件信息获取方式及操作系统硬件探测原理
所有硬件信息本质上都存在于硬件的寄存器或者固件的固定内存映射地址里,不管有没有操作系统,只要能拿到对应地址的读写权限,就能拿到信息。
无操作系统场景下的非CPU硬件信息获取方式
- 基础固件级信息:直接读取BIOS/UEFI保留在内存中的各类系统表即可。比如SMBIOS表存了主板型号、内存槽位、外设基础参数,直接解析
0xF0000段附近的SMBIOS头部就能遍历所有条目;x86实模式下也可以直接调用INT 15hBIOS中断获取内存映射、显卡分辨率这类基础信息。 - PCI/PCIe设备信息:所有PCIe设备的配置空间都可以通过IO端口直接访问,x86架构下向
0xCF8端口写入要查询的总线、设备、功能编号,再从0xCFC端口就能读出对应设备的厂商ID、设备ID、BAR空间地址等参数,遍历所有总线编号就能枚举所有显卡、网卡、存储控制器这类PCIe外设。 - 存储/内存专项信息:要拿硬盘参数直接向SATA/NVMe控制器的映射寄存器发标准ATA/NVMe指令即可,要拿内存的频率、时序参数直接通过SMBus控制器读内存SPD芯片的I2C数据就行,这些操作都没有操作系统依赖。
操作系统获取硬件信息的原理
操作系统的硬件探测和裸机操作没有本质区别,只是做了分层封装:
- 内核启动早期还没加载任何驱动的时候,就会用和裸机完全相同的端口读写逻辑枚举所有系统总线,扫描所有外设,把获取到的硬件信息统一存在内核的设备管理结构体中。
- 内核会把这些信息通过标准化接口暴露给上层:Linux下是
/sys、/proc这类虚拟文件系统,Windows下是WMI接口,我们平时用的lspci、设备管理器这类工具本质都是读这些内核提前缓存好的信息,不需要自己直接操作硬件。 - 如果要查询没有被内核默认采集的硬件参数,对应的驱动也会直接和硬件寄存器交互拿数据,再返回给上层调用。
内容的提问来源于stack exchange,提问作者Percival Hsu
相关产品推荐
相关产品推荐

