是否可以挂钩x86 CPU复位向量? (386 +,因为在较低的那些它是微不足道的)如果是这样,怎么可能这样做?如果没有,为什么Linux(我已经看过一个发行版)在文本模式下,在与syslog相同的终端中,在我按下重置按钮的那一刻显示了很多文本?
我想在我未来的操作系统中挂钩,如果可能的话......(比如在实际重置之前使RESET触发器类似于Windows的BSOD并转储内存),
答案 0 :(得分:3)
您不能直接挂钩复位向量。它被硬连线到CPU中以开始在地址0xFFFFFFF0
处执行指令。你可以做的是利用在80286 BIOS上实现的旧技巧,允许CPU从保护模式返回。
80286是第一个实现保护模式的CPU,而英特尔的设计人员认为,一旦CPU从实模式切换到保护模式,就没有理由切换回来。一旦启用保护模式,80286可以回到实模式的唯一方法是重置。
然而,IBM希望使80286支持的额外内存高于实模式程序可用的1M实模式寻址限制。为此,他们实现了两个功能,第一个是可以指示键盘控制器重置CPU。第二个是重置后BIOS会在内存中寻找特殊模式。如果它找到它,那么它将跳过它的正常初始化和启动任务并跳转到内存中给出的地址。通过结合这两个功能,BIOS能够提供实模式服务,使用保护模式访问1M以上的内存。以后的BIOS实现更好的方法来执行这些任务。例如,重置处理器的更快方法是导致三重故障,未记录的LOADALL
指令可用于访问1M以上的内存,而无需切换到保护模式。 '386消除了对任何技巧的需要,英特尔意识到他们的错误并允许处理器从保护模式切换到实模式而无需重置。
然而,现代BIOS实现仍支持跳过初始化,如果在重置后内存中存在特殊模式,因为许多应用程序都使用它。值得注意的是,80286 CPU上的Windows使用它来支持运行MS-DOS应用程序。也许您的Linux机器正在使用此功能,但您的重置按钮实际上可能不是您机器上的重置按钮。
如果您想在自己的代码中利用此功能,请在0040h:0067h
中重置后将所需的实模式地址置于BIOS中调用,存储16位幻数4321h
在0040h:0072h
中,然后重置处理器。显然要求键盘控制器进行复位在现代系统上无法可靠地工作。如果它重置的不仅仅是CPU并且还会导致内存被删除,它也无法使用重置按钮。
答案 1 :(得分:1)
任何x86 CPU的复位向量都是相同的;它始终是FFFF:FFF0
的16位实模式,几乎总是一个ROM地址。
此外,您提到的重置按钮是硬件重置,即您无法在软件中执行任何操作来阻止它。它可能会在重置硬件之前触发某种ACPI或中断事件,只是为操作系统提供一个简短的时刻来执行某些操作(无论是将关键数据刷新到磁盘还是其他方式)。