From ebf2a271f041152f992cbfaa1667762a00d53610 Mon Sep 17 00:00:00 2001 From: acevest Date: Mon, 29 Dec 2025 17:08:02 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0=E8=AF=BB=E5=8F=96IO-APIC?= =?utf8?q?=E7=9A=84RCBA=EF=BC=88Root=20Complex=20Base=20Address=EF=BC=89?= =?utf8?q?=E7=9A=84=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/pci.c | 8 ++++++++ qemu.sh | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/pci.c b/drivers/pci.c index 1a5c10e..c9a727c 100644 --- a/drivers/pci.c +++ b/drivers/pci.c @@ -249,6 +249,14 @@ void setup_pci() { dump_pci_dev(); + + { + int cmd = PCI_CMD(0, 31, 0, 0xF0); + uint32_t rcba = pci_read_config_long(cmd); + printk("IO-APIC RCBA: %08x\n", rcba); // 如果读到0xFFFFFFFF其实就代表机器太老了 + } + + // while (1) // ; } diff --git a/qemu.sh b/qemu.sh index 456d476..611f292 100755 --- a/qemu.sh +++ b/qemu.sh @@ -17,6 +17,16 @@ echo "process $process_name is running." # 使用set -m来启用作业控制,以便在后台启动 QEMU 进程。 set -m + +# pc-i440fx-10.1 支持 IDE 但是不支持IO-APIC的RCBA,读到值是0xFFFFFFFF +# pc-q35-10.1 支持 IO-APIC的RCBA,读到的值是0xFED1C001,但是无法支持IDE +# 原因是: q35是现代Intel平台(2008年后),原生不支持传统IDE,只支持AHCI/SATA +# 所以现在的问题是,如果想开启第二颗CPU,来监视系统运行,就得开启 APIC +# 如果要支持 APIC 就得用 q35 但是它已经不支持 IDE 了,所以就得写AHCI读SATA的代码 +# 当然还有一个次级解决方案: +# 可以不用 q35 在默认的情况下(不写 -machine),是支持IDE的,也可以通过解析ACPI +# 得到IO APIC的地址,地址是0xFEC00000,然后用它来初始化IO-APIC。 + qemu-system-i386 \ -boot d \ -m 128 \ -- 2.47.0