|  | 
| 我目前没有编译环境。我就说说究竟应该怎么做吧。具体的修改,让 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 或其它朋友给出具体的指令。
 | 
 |