]> Zhao Yanbai Git Server - kernel.git/commitdiff
添加读取IO-APIC的RCBA(Root Complex Base Address)的测试代码 test/apic
authoracevest <zhaoyanbai@126.com>
Mon, 29 Dec 2025 09:08:02 +0000 (17:08 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 29 Dec 2025 09:08:02 +0000 (17:08 +0800)
drivers/pci.c
qemu.sh

index 1a5c10e05e097f627fdc13da1caa3da9623379f1..c9a727c1a32c38bc4e8969b52204750390f6c470 100644 (file)
@@ -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 456d4761e5c13eea7879e42e5bc1a1b1b86d4a74..611f292069bc0a9714f283433ce46b1f2419ad5b 100755 (executable)
--- 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 \