【问题标题】:How does processors know the end of program?处理器如何知道程序的结束?
【发布时间】:2014-08-16 02:42:18
【问题描述】:

我想知道,处理器如何知道何时停止执行程序。或者更确切地说,何时停止“获取、解码执行”循环。
我想过不同的方法,但不确定哪一种是正确的,或者它们是否都错了。
1- 也许最后有一条特殊指令由汇编程序自动添加,让处理器知道这是结束。
2- 当它到达无效内存时(但它是如何识别的)。
3- 它循环并重新运行程序,但它又是如何识别何时循环的,或者它可能是由汇编程序自动添加的。
4- 或者它根本不会停止,它会一直运行下去。 (但是那个功率不是低效吗?

请指教。
如果答案可能因处理器而异,让我们以 MIPS 和 x86 为例。

谢谢。

【问题讨论】:

  • MIPS 怎么样?我似乎找不到类似的指令。我找到了“break”,但它说它是为了调试。
  • hsc
  • 通常程序不会停止处理器。他们告诉操作系统他们已经完成了,以便操作系统可以运行下一个程序。

标签: assembly x86 mips processor


【解决方案1】:

这取决于操作系统和处理器。

对于带有暂停指令的处理器(如 X86),当所有进程和线程都处于等待状态(无事可做)时,操作系统可能会执行暂停指令,该指令将暂停 CPU 并等待中断。如果下一个中断没有导致任何线程的状态切换为可运行,那么操作系统将返回到停止指令。

在没有暂停指令的 CPU 上,当所有线程都在等待时,操作系统会进入一个空闲循环,该循环只是分支到自身。

回到最初的问题,运行程序的基本顺序是为程序进行内存空间的初始分配,加载程序,然后调用程序。程序最终应该从调用返回给操作系统,操作系统将释放分配给运行程序的内存。操作系统也可以在初始分配阶段创建一个虚拟地址空间。

进一步阅读

wiki loaderwiki program execution。在 MSDOS 的情况下,程序使用 INT 软件序列返回到 MSDOS,例如设置 AH = 04Ch,然后执行 INT 21H。对于其他操作系统,加载程序会调用程序,并在完成时返回。

【讨论】:

  • wiki loaderwiki program execution。在 MSDOS 的情况下,程序使用 INT 软件序列返回到 MSDOS,例如设置 AH = 04Ch,然后执行 INT 21H。对于其他操作系统,加载程序会调用程序,并在完成时返回。
  • 对于没有暂停指令的cpu,当操作系统进入自身跳转时会发生什么? OS如何摆脱这样的跳转指令并终止程序?
  • @Sooora - 如果是紧跳转到自身,那么中断例程将不得不更改上下文(保存 | 更改寄存器并跳转到另一个地址)。
  • 谢谢。您的意思是 CPU 一直处于跳转到自身的循环中,直到出现中断,对吧?
  • @Sooora - 它可能会停留在跳转到自循环或暂停指令中,直到出现中断,但这是为任务切换完成的。最初的问题是询问程序如何终止,这是通过一些特殊调用或特殊指令完成的,具体取决于系统。
【解决方案2】:

与之前的回复有一些相似之处,我将更详细地描述。应区分两个主要上下文:1) 直接在正在运行的硬件(包括操作系统)上具有超级用户权限的代码和 2) 应用程序代码。

对于第二种情况 - 应用程序代码 - 应用程序应执行通常名为“exit”的系统调用,通知主管(内核)应用程序已完成。此电话的详细信息各不相同;例如rcgldr 所描述的 MS-DOS AH=4Ch/int21h 就是这样的“退出”;在现代 Linux 中,它是 exit_group 系统调用;等等。当只看到 main() 时,您可能会错过 main() 是由特定于系统的应用程序包装器调用的事实,该包装器执行此 exit() 调用。如果应用程序没有显式退出,它将一直执行,直到发生致命错误。得到这个 exit() 请求,主管会破坏进程并切换到另一个进程。

对于主管本身,如果它停止执行,这是非常特定于平台的。对于 x86,最初不关机的主要方法是围绕HLT 指令循环(因为后者可以在中断时自发地继续)。使用相同的 HLT 直到大约。 Pentium4 和 Athlon 停止处理器,直到没有工作时出现中断;由于这些处理器,需要额外的措施来停止芯片组级别的活动,因此停止方法变得更加复杂。现代x86平台根据ACPI内部语言描述如何使系统临时停止,包括多系统端口编程。所有真实架构都存在类似的停止直到外部事件到来的指令。可以有多个级别的停止;例如一些嵌入式的有“小停止”,它只会减慢处理器的速度,而“大停止”会完全停止处理器,但需要数十微秒的时间让时钟 PLL 稳定下来。无论如何,在这种停止之后,主管会尝试继续正常工作,直到重新启动/断电/等。正在到达。

多处理器(多核)配置有自己的特点,因此最初只启动一个处理器上的一个内核。然后,使用处理器间中断 (IPI) 或类似物来启动或停止另一个内核和处理器。停止操作系统工作通常包括停止除最后一个之外的所有处理器和内核。

【讨论】:

    【解决方案3】:

    要结束您的 8086 或 MIPS,您可以使用系统调用 在 8086 中: hltint 20h 在 MIPS 中: hlt 的代码是 10 你需要把它放在 $v0 或 $2 (同一个寄存器) li $v0, 10 然后调用系统 syscall

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2020-04-02
      • 2017-10-17
      • 2011-06-07
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2014-09-20
      相关资源
      最近更新 更多