From: acevest Date: Mon, 29 Dec 2025 09:08:02 +0000 (+0800) Subject: 添加读取IO-APIC的RCBA(Root Complex Base Address)的测试代码 X-Git-Url: http://repos.zhaoyanbai.com/Mou_128.png?a=commitdiff_plain;h=ebf2a271f041152f992cbfaa1667762a00d53610;p=kernel.git 添加读取IO-APIC的RCBA(Root Complex Base Address)的测试代码 --- 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 \