出处: http://bbs.chinaunix.net/viewthread.php?tid=1020332
作者: qiuhan
时间: 2007.10.13
我们并没有实际去研读物理bios的代码,而是查看了bochs中的bios虚拟实现,主要出于如下
考虑:
1 对于物理机的 bios 需要特殊的硬件进行调试,我们没有
2 对于不同的系统构架,bios 很可能不同,我们偏重于功能性的研读 bios,对于理解 os 的
实现来说,
已经足够了;而且,这也会是理解物理 bios 的一个很好的起点。
另外,我们更多的是关注 bios 中对 PCI 和 ACPI 的实现,对于 POST 流程,我们只说了一个大
概。
下面我们就开始介绍一些基础知识:
the layout and contents of the first Meg of memory[1][2]:
0x0 - 0x3ff: 256 个 bios 中断向量
0x400 - 0x4ff: 255B BDA(BIOS Data Area) 保存 bios 检测的结果,如:
0x40E: LPT4 I/O base address 或者 EBDA(Extended Bios Data Area)
如果存在 EBDA,其值为 0x9FC0,查找 RSDP 的一种方法就是从 EBDA 查找
(AcpiTbFindRsdp)
0x410: Equipment Word
0x472: Soft reset flag 系统启动时会在该地址写入 1234h 告诉 bios 下次跳过内存检
测
参见 i386/i386/locore.s
0x475: Number of hard disk drives(参见 boot0)
0x500 - 0x9Fbff: dos, etc
0x9FC00 - 0x9feff: EBDA(Extended Bios Data Area) 768B
0x9ff00 -- 0x9ffff: boot device tables 256B
0xA0000 - 0xAffff: Graphics Video memory (EGA and above)
0xB0000 - 0xBffff: Graphics area for EGA and up
0xC0000 - 0xCffff: additional ROM-BIOS & video memory
0xD0000 - 0xDffff: ROM cartridges
0xE0000 - 0xEffff: ROM cartridges
0xF0000 - 0xFDfff: IBM PC ROM BASIC
0xFE000 - 0xFFFEF: ORIGINAL IBM PC ROM BIOS
0xfe05b : POST Entry Point
0xFFFF0 - 0xFFFF4: Power-up Entry Point(RESET JUMP)
0xffff5 : ASCII Date ROM was built - 8 characters in MM/DD/YY
0xffffe : System Model ID
bios 的作用不仅仅只是 POST,在 os 启动之后还会为 os 提供支持,做幕后英雄。以 BSD 为
例:
1 pci_routing_table_structure: "$PIR" pci_pir_open 调用 bios_sigsearch 在 0xe0000-0x100000 之
间查找"$PIR"(或者"_PIR")。