繁体   English   中英

如何完全暂停处理器?

[英]How to completely suspend the processor?

我正在为基于x86的PC编写一个小型引导程序。 问题是执行这些指令后,CPU仍会处于活动状态:

sti
hlt

sti应该为下一条指令禁用中断
HLT应该完全暂停处理器

由于它们一起使用,我以为它们会“冻结”计算机。 但是,当我组装它并将其作为软盘映像安装在VirtualBox中时,我的CPU跳到了100%。

我究竟做错了什么?

我想补充一下有关“ cli”的评论,因为我在过去被这两次咬伤了。 “ cli”指令不会阻止所有中断,而只会阻止可屏蔽的中断。 可以想象,由于不可屏蔽中断(NMI),系统仍可能被唤醒。

正如评论中的一项指出,计算机已准备就绪,我希望系统中没有其他线程/进程/任务可以运行(否则NMI可能会导致重新计划)。 对于这种情况,您描述的NMI可能性不大。 但是,根据您对出错情况的偏执程度,您可能希望添加一个循环来防止这种可能性。

sysSuspend:
    cli
    hlt
    jmp sysSuspend

我认为您对这两个命令有些困惑。

sti命令启用中断,而cli命令禁用中断。

暂停状态类似于空闲循环,因此它不会挂起处理器。

以下是一些可能对您有所帮助的链接:有关STI / CLI命令的信息: http : //en.wikipedia.org/wiki/STI_%28x86_instruction%29

有关x86指令的信息: http : //en.wikipedia.org/wiki/X86_instruction_listings从此处可以找到指向hlt命令的链接,该链接可能会有所帮助。

如果暂停处理器,如果禁用中断,又如何唤醒它呢?

这个问题可以重新表述为更正确的问题:如何完全暂停控制流? 实际上,此任务可以分为两个子任务:

  1. 暂停当前​​(同步)控制流。

    • 简单的繁忙循环(100%CPU使用率,大功耗,高热效应)。

    • 基于暂停的循环(省电模式C1,大多数CPU逻辑不通电)。

  2. 防止控制流的异步切换。

    • IDT中的存根中断处理程序。

    • 全局中断控制器(PIC或IO APIC)上的中断屏蔽。

    • 在本地中断控制器(Local APIC)上屏蔽中断。

    • 屏蔽CPU核心逻辑上的中断。

无论如何,您必须了解NMI并做好准备,因为没有机制可以使您禁用它们。

理想的解决方案:

    mov  EDX, NMI_INT_HANDLER_STUB; // address of installed handler
    mov  ECX, 0x02                ; // id of the NMI handler in IDT 
    call InstallHandlerInIDT      ; 
    cli                           ; // mask all maskable interrupts on CPU core
SUSPEND:
    hlt                           ; // turn CPU into HALT state (power saving mode C1)
    jmp SUSPEND                   ; // try again if NMI had happened

NMI_INT_HANDLER_STUB:
    iretd                         ; // Complete handling immediatelly and return back.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM