|
我目前没有编译环境。我就说说究竟应该怎么做吧。具体的修改,让 chenall 或 yaya 去做。
我们在这里有个控制字节:
- . = EXT_C(main) + 0x5
- /* control byte: pxe, DUCE, tune
- * bit 0 = 1: disable pxe
- * bit 1 = 1: disable keyboard intervention in boot process
- * bit 2 = 1: disable the "unconditional command-line entrance" feature
- * bit 3 = 1: disable geometry tune
- * bit 4 = 1: disable startup cdrom drive look-up.
- */
- .byte 0
复制代码
这个控制字节在内存中的地址是 0x8205——这一点,chenall 和 yaya 都熟悉,就不解释了。
这个控制字节目前用到了 5 个位(位0 至 位4),还有 3 个位没有使用。我们这次就用位5 来控制吧。
因此,把注释改成这样:
- . = EXT_C(main) + 0x5
- /* control byte: pxe, DUCE, tune
- * bit 0 = 1: disable pxe
- * bit 1 = 1: disable keyboard intervention in boot process
- * bit 2 = 1: disable the "unconditional command-line entrance" feature
- * bit 3 = 1: disable geometry tune
- * bit 4 = 1: disable startup cdrom drive look-up.
- * bit 5 = 1: enable HLT instruction for checkkey idle loop.
- */
- .byte 0
复制代码
注释只是让人看的,光是改注释是不起作用的。因此,还要改代码。只需把该文件中的三条注释掉的 hlt 指令恢复出来,并改成 “有条件执行” 即可。
三条被注释的 hlt 指令都是类似于这样:
把它们都改成
当然要写一个 conditional_hlt 的函数,如下:
- conditional_hlt:
- // DS should already be 0, but ...
- pushw $0
- popw %ds // just in case DS changed by buggy BIOS
- testb $0x20, 0x8205 // Enable HLT?
- jz 1f // No. Skip the HLT instruction.
- hlt // Yes. Execute the HLT instruction.
- 1:
- ret // on return, DS=0
复制代码
至于说这个函数放在哪里呢?可以考虑放在这里:
- .code16
- hard_stop:
- sti
- //hlt <------ 这条被注释的指令,要改成 “call conditional_hlt”
- jmp hard_stop
- 【此处插入 conditional_hlt 函数的代码】
- .code32
复制代码
注意,一定要放在 .code16 编译指令的下面,不可以放在 .code32 编译指令的下面;因为这是 16 位的实模式代码。
好了,代码就修改完成了。
下面说说用户如何使用。
在上述修改完成后,重新编译,发布新版。用户下载新版后,参照以下说明来使用这一功能。
用户在任何时候,只要把内存地址 0x8205 处的一个字节 "OR" 上 0x20, 就达到了 “启用 HLT 指令” 的目的了,也就等于说是恢复旧版的 “cpu 空闲等待” 的功能了。
具体如何使用,可参考 chenall 的 calc 命令的说明。这里的 “OR” 就是逻辑运算符的一种,另外一种逻辑运算符是 “AND”。可以在百度上找到这些资料。
很抱歉,我此刻记不得 calc 命令的用法了。请 chenall 或其它朋友给出具体的指令。 |
|