首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理器如何知道程序的结束?

处理器如何知道程序的结束?
EN

Stack Overflow用户
提问于 2014-08-16 02:42:18
回答 3查看 3.1K关注 0票数 3

我想知道,处理器如何知道什么时候停止执行程序。或者更确切地说,何时停止“提取,解码执行”循环。

我想过不同的方法,但不确定哪一种是正确的,还是它们都是错误的。

也许在最后有一个特殊的指令,由汇编程序自动添加,让处理器知道这是结束。

当它到达无效内存时(但它如何识别)。

它循环并重新运行程序,但是它如何识别何时循环,或者它可能是由汇编程序自动添加的。

或者,也许它不会停止,它将永远运行下去。(但这不是效率低下吗?)

请指点。

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-16 07:23:57

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

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

在没有halt指令的cpu上,当所有线程都在等待时,操作系统进入一个空闲循环,只会分支到自己。

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

进一步阅读

wiki装载机wiki程序执行.在MSDOS情况下,程序使用INT软件序列返回到MSDOS,例如设置AH = 04Ch,然后执行int21H。对于其他操作系统,加载程序调用程序,程序完成后返回。

票数 2
EN

Stack Overflow用户

发布于 2014-08-25 09:42:40

与以前的一些相似之处,我将更详细地描述。应该区分两个主要的上下文: 1)直接在运行的硬件上具有监督权的代码(这包括OS);2)应用程序代码。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-10-08 15:39:16

要在8086或MIPS中结束您的代码,可以使用8086中的系统调用:hlt或MIPS中的int 20h:hlt的代码为10,您需要将其放在$v0或$2 (相同寄存器) li $v0, 10中,然后调用系统syscall

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25336465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档