Assembly 如何使用早期BIOS调用?(后续行动)
这是一个后续,相同的ROM文件,相同的设置 多亏了Brendan,我知道在冷启动时,会进行所讨论的跳转,并且会跳过调用指令。但不久之后还有其他的内存写入。这是一个简短的列表,包含所有完整分支(55行)的完整内容可在以下位置找到:Assembly 如何使用早期BIOS调用?(后续行动),assembly,x86,reverse-engineering,bios,Assembly,X86,Reverse Engineering,Bios,这是一个后续,相同的ROM文件,相同的设置 多亏了Brendan,我知道在冷启动时,会进行所讨论的跳转,并且会跳过调用指令。但不久之后还有其他的内存写入。这是一个简短的列表,包含所有完整分支(55行)的完整内容可在以下位置找到: [开头与第一个问题相同] f000:e045输出0x70,al;CMOS控制器:禁用NMI,设置索引0xf f000:e047输出0xeb,al;这个端口可能没有被占用:只是一个延迟机制 f000:e049在铝中,0x71;读取0xf(CMOS关机状态) f000:e0
[开头与第一个问题相同]
f000:e045输出0x70,al;CMOS控制器:禁用NMI,设置索引0xf
f000:e047输出0xeb,al;这个端口可能没有被占用:只是一个延迟机制
f000:e049在铝中,0x71;读取0xf(CMOS关机状态)
f000:e04b输出0xeb,al;更多延迟
f000:e04d或al,al
f000:e04f jmp 0xf483
f000:f483 jne 0xf488
[假定身份≥ 0x0D(冷启动)–跳转:]
f000:f488 mov ax,0x40
f000:f48b移动设备,ax
f000:f48d cmp字es:[0x72],0x1234
f000:f494 je 0xf49b
[场景1:我们在0040:0072处找到单词0x1234:]
[一些进一步的测试,如果条件失败,总是跳到f000:f4c8;如果全部通过,则流线性地到达该地址]
[场景2:0040:0072不返回0x1234:]
f000:f496 jmp 0x3253
f000:3253 jmp 0xf499
f000:f499 jmp 0xf4c8
[所有案例现在都集中在这里]Coreboot人员告诉我,机器要么在启动时启动,要么在启动时设置“缓存为RAM”机制,其中CPU缓存用作RAM。这是通过禁用缓存写回而不禁用缓存来实现的。@fuz有趣!我将尝试在这方面做一些研究。奇怪的是,我没有看到任何可以初始化这个的东西,但也许它在某种程度上是隐式的。在这方面可能很有趣。MB使用了桥结构(北桥和南桥)。NB是Intel 82845GE(G)MCH(图形和内存控制器集线器),其职责是引导对以下之一的访问:内存、AGP(外部视频卡)、集成视频卡或ICH4(南桥)。由于它是一个预多通道、预超过4GiB的MCH,配置寄存器是有限的,默认情况下,DRB[0:3]
regs被配置为路由32MiB的RAM。但这还不够,尤其是DRAM定时默认值无效。所以我认为RAM还没有被访问,CRAM(缓存为RAM)也是如此,它必须是。。。。。。通过调整cr0
进行设置。在我看来,对BDA软重置标志(0040:0072
)的读取被简单地终止(由MCH或ICH4终止),并返回0xffff
。请记住:即使DRAM尚未初始化,也不禁止读取内存(当然,读取不会进入DRAM)。有趣、无关、事实:因为Haswell0xfffffff0
(别名为0xf000:fff0
)不再是引导入口点。引导是微代码,以达到适合和加载启动ACM在一个安全的环境(包括CRAM)。这是英特尔TXT(引导程序)的一部分。
[Beginning is the same as in the first question]
f000:e045 out 0x70, al ; CMOS controller: disable NMI, set index 0xf
f000:e047 out 0xeb, al ; this port is presumably unoccupied: just a delay mechanism
f000:e049 in al, 0x71 ; read 0xf (CMOS Shutdown Status)
f000:e04b out 0xeb, al ; more delay
f000:e04d or al, al
f000:e04f jmp 0xf483
f000:f483 jne 0xf488
[assuming status ≥ 0x0D (cold boot) – jump:]
f000:f488 mov ax, 0x40
f000:f48b mov es, ax
f000:f48d cmp word es:[0x72], 0x1234
f000:f494 je 0xf49b
[Scenario 1: we find word 0x1234 at 0040:0072:]
[some further tests, always jumping to f000:f4c8 if a condition fails; if all passes, the flow reaches that address linearly]
[Scenario 2: 0040:0072 does not return 0x1234:]
f000:f496 jmp 0x3253
f000:3253 jmp 0xf499
f000:f499 jmp 0xf4c8
[All cases now converge HERE] <<< This is the interesting bit
f000:f4c8 mov ax, 0x30
f000:f4cb mov ss, ax
f000:f4cd mov sp, 0x100
f000:f4d0 mov al, 0x8f
f000:f4d2 call 0xe415 ; Hi again, now I'm unconditional