Skip to the content.

从 qemu 的角度分析 Option ROM

https://en.wikipedia.org/wiki/Option_ROM

pci_update_mappings pci febe0000 vga.rom
pci_update_mappings pci feb80000 e1000.rom
pci_add_option_rom /home/maritns3/core/kvmqemu/build/pc-bios/vgabios-stdvga.bin
ram_block_add vga.rom

vga 的源代码应该是在 : https://github.com/qemu/vgabios

直通 megaraid 来测试

如果直通了 megaraid 卡之后,观察参数:

Scan for option roms
Running option rom at ca00:0003
pmm call arg1=1
pmm call arg1=0
pmm call arg1=1
pmm call arg1=0
Running option rom at cb00:0003
pmm call arg1=0
pmm call arg1=0
pmm call arg1=2
pmm call arg1=2
Searching bootorder for: /pci@i0cf8/*@6
Searching bootorder for: /pci@i0cf8/*@8
Searching bootorder for: /rom@genroms/kvmvapic.bin

Press ESC for boot menu.

Searching bootorder for: HALT
drive 0x000e9570: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=734003200
drive 0x000e9520: PCHS=0/0/0 translation=lba LCHS=1024/255/63 s=20971520
Running option rom at cb00:00cc
Running option rom at d380:0003
Space available for UMB: d6000-e9000, f4da0-f5160
Returned 16613376 bytes of ZoneHigh
e820 map has 8 items:
  0: 0000000000000000 - 000000000009ec00 = 1 RAM
  1: 000000000009ec00 - 00000000000a0000 = 2 RESERVED
  2: 00000000000f0000 - 0000000000100000 = 2 RESERVED
  3: 0000000000100000 - 00000000bffd8000 = 1 RAM
  4: 00000000bffd8000 - 00000000c0000000 = 2 RESERVED
  5: 00000000feffc000 - 00000000ff000000 = 2 RESERVED
  6: 00000000fffc0000 - 0000000100000000 = 2 RESERVED
  7: 0000000100000000 - 0000000240000000 = 1 RAM
enter handle_19:
  NULL
Booting from Hard Disk...
Booting from 0000:7c00

如果没有直通 megaraid 卡:

Scan for option roms
Running option rom at ca00:0003
pmm call arg1=1
pmm call arg1=0
pmm call arg1=1
pmm call arg1=0
Searching bootorder for: /pci@i0cf8/*@6
Searching bootorder for: /rom@genroms/kvmvapic.bin

Press ESC for boot menu.

Searching bootorder for: HALT
drive 0x000e9570: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=734003200
drive 0x000e9520: PCHS=0/0/0 translation=lba LCHS=1024/255/63 s=20971520
Running option rom at cb00:0003
Space available for UMB: cd800-e9000, f4da0-f5170
Returned 16613376 bytes of ZoneHigh
e820 map has 8 items:
  0: 0000000000000000 - 000000000009fc00 = 1 RAM
  1: 000000000009fc00 - 00000000000a0000 = 2 RESERVED
  2: 00000000000f0000 - 0000000000100000 = 2 RESERVED
  3: 0000000000100000 - 00000000bffd8000 = 1 RAM
  4: 00000000bffd8000 - 00000000c0000000 = 2 RESERVED
  5: 00000000feffc000 - 00000000ff000000 = 2 RESERVED
  6: 00000000fffc0000 - 0000000100000000 = 2 RESERVED
  7: 0000000100000000 - 0000000240000000 = 1 RAM
enter handle_19:
  NULL
Booting from Hard Disk...
Booting from 0000:7c00

对比可以看到,megaraid 的 option rom 显然被执行了,而且似乎 virtio-blk 加载启动也是会有 option rom 的

开机过程为

在 linux 中观测 option rom 的方法

🤒  ls -l /sys/bus/pci/devices/*/rom
.rw------- 131k root  2 Nov 20:08 /sys/bus/pci/devices/0000:00:02.0/rom
.rw------- 524k root  2 Nov 20:08 /sys/bus/pci/devices/0000:01:00.0/rom
.rw------- 131k root  2 Nov 20:08 /sys/bus/pci/devices/0000:02:00.0/rom

参考 http://etherboot.org/wiki/romdumping

0000:04:00.0 看看 megaraid 卡的操作:

echo 1 | sudo tee /sys/bus/pci/devices/0000:04:00.0/rom
sudo cp /sys/bus/pci/devices/0000:04:00.0/rom hba.rom
file hba.rom

可以看到

gpu.rom: BIOS (ia32) ROM Ext. (96*512) jmp 0x1e60; at 0x70 PNP storage controller, length 36866*16, CRC 0x7, at 0xf0 "BROADCOM Inc. ", at 0xff "(Bus Dev )PCI RAID Adapter", IPL, bootable, cacheable, shadowable, boot vector offset 0xcc; at 0x1c PCI Broadcom device=0x10e2 storage controller, revision 3, code revision 0x3, 3rd reserved 0x6000

由于,这个卡就只能在 BIOS (ia32) ROM Ext 使用 x86 CPU 来执行才可以

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。