我想与 AMD Ryzen 嵌入式平台上的嵌入式 Linux 的 BIOS 进行一些交互。
我认为主要的工具是flashrom
可以读/写闪存芯片。
dd
如果内存中芯片的地址已知的话,也应该可以使用类似的方法将数据写入闪存ROM ?
这是查找系统 BIOS 的正确方法吗:
root@device:~/bios# grep ROM /proc/iomem
000c0000-000cd3ff : Video ROM
000f0000-000fffff : System ROM
如果我使用工具查找 ROM,flashrom
我会得到以下信息:
root@device:~/bios# flashrom -p internal --flash-name
flashrom v1.2 on Linux 5.4.199 (x86_64)
flashrom is free software, get the source code at https://flashrom.org
Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
Found chipset "AMD FP4".
Enabling flash write... OK.
Found Winbond flash chip "W25Q64.W" (8192 kB, SPI) mapped at physical address 0x00000000ff800000.
vendor="Winbond" name="W25Q64.W"
所以iomem
说芯片是在000f0000-000fffff
并且flashrom
说他芯片是在0x00000000ff800000
哪一个是正确的,或者更好的是,为什么它们不相同?
答案1
哪一个是正确的,或者更好的是,为什么它们不相同?
它们是不同的,因为它们是不同的东西。两者都不是“正确的”。
输出的flashrom
是物理闪存IC的地址。
iomem 报告内存的某些部分映射到内存空间中的位置;这可能是闪存 IC 上某处的某些内存(甚至可能是您通过 查询的内存flashrom -p internal
,但更可能是在早期硬件初始化期间复制或映射到 RAM 的某些部分的内存。
您必须认识到,“BIOS”、“视频 ROM”……是 IBM PC 概念,本质上根本不适用于当今硬件的工作方式。因此,如果存在的话,完全模仿。
因此,当您说“与 AMD Ryzen 上的嵌入式 Linux BIOS 交互”时,您实际上是在说“我想与一个已有 38 年历史的 API 进行对话,该 API 以某种方式由我正在使用的处理器上运行的固件进行模拟” ;在这种情况下,要确定谁在模拟什么并不是那么容易,而且表面上简单的事情,比如“有视频 ROM,这是一个包含字体的芯片,以及视频 BIOS 的程序”,这显然不是图形硬件的工作原理。 BIOS 也是如此——初始化主板和 CPU 的不是某些 IBM PC-BIOS 派生的软件,而是主板和 CPU 的固件,包括 UEFI 程序和 Linux。 BIOS 接口实际上只是固件可选提供的一些附加 API。