PC寄存器可以指向不同于文本段的存储区吗?

问题描述

关于PC寄存器,我有两个问题:

  1. 如果PC的PC寄存器指向不在进程的文本段中的存储单元,CPU会掉线吗?如果是这样,进程是刚刚终止还是机器已经死机?

  2. 当cpu执行进程时,它将通过递增PC来保持对指令的迭代。假设PC指向最后一条指令。 CPU如何知道进程已完成,因此不会递增PC?

对于第二个问题,我认为可以通过查看堆栈中的帧数来完成。如果我们在最后一帧调用返回,则该过程通常已完成。但这实际上是做什么的吗?

解决方法

在情况1中,当程序计数器指向无效地址时,处理器会引发异常,因为MMU将指示故障。然后,操作系统通常会终止该过程,例如与SIGSEGV。您可以通过执行((void (*) (void)) (0xDEADBEEF)) ();(用任何无效地址代替)在C中轻松地尝试此操作。如果这么简单的内存错误可能会使计算机崩溃,那将是一个巨大的安全问题!

如果这种无效访问发生在内核空间中,则取决于内核是否在MMU中将该位置配置为不可访问。如果是,则CPU将再次引起异常,作为响应,内核可以例如。打印错误信息。如果否,则行为在很大程度上取决于CPU和所涉及的地址;可能会有一些严重的故障异常使系统崩溃,或者什么也没有发生。

案例2永远不会发生。当C中的main()函数返回时,C运行时库将执行exit syscall,此后OS将终止该进程。如果使用汇编语言编写代码,则在程序退出时必须手动调用该syscall。请注意,在main()函数之后,内存中可能还有其他函数,当然应该在返回main()之后不执行它们。程序文本段中的最后一条指令需要是对某种有效指令的某种跳转/返回/调用。如果它是一条诸如add之类的“普通”指令,则CPU将在此之后尝试执行无效的存储位置,在这种情况下,将应用1(程序终止/崩溃)。当然,在C程序中,所有代码都是按函数组织的,每个函数都以返回/跳转指令结尾,因此C程序的文本段中的最后一条指令确实是。>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...