处理页错误陷阱后的指令指针值

2023-12-04

老实说,我真的对这个特定的虚拟内存相关概念感到困惑。

Q1) 当发生页错误时,处理器是否先完成当前指令的执行,然后将 IP 寄存器内容(下一条指令的地址)移入堆栈?或者,它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈?

Q2)如果第二种情况为真,那么它如何恢复被中止的指令,因为当它恢复时,堆栈包含指令指针值,该值只是下一条指令的地址。因此它永远不会恢复发生页错误的指令。

我的想法
我认为第二种情况听起来不对。当我阅读 Silbershatz 和 Galvin 的《操作系统原理》时,出现了困惑。他们写了

当发生页面错误时,我们必须引入所需的页面、正确的页表和重新启动指令.

但是指令指针总是指向下一条指令的地址,所以这意味着,根据这本书试图传达的内容,我们递减IP的值只是为了重新开始执行发生页面错误的指令?


在英特尔系统编程指南第 6.5 章中,它说

故障——故障是一种通常可以纠正的异常,一旦纠正,程序就可以 重新启动而不失去连续性。当报告故障时,处理器将机器状态恢复到 开始执行错误指令之前的状态。返回地址(保存的内容 错误处理程序的 CS 和 EIP 寄存器指向错误指令,而不是指令 按照故障指示进行操作。

页面错误被归类为错误(这并不奇怪),因此当页面错误发生时,您处于“发生之前”的状态 - 好吧不是真的,因为您处于错误处理程序中(因此 EIP 和 ESP肯定是不同的,CR2也包含地址),但是当你返回时,它将是发生之前的状态,只有处理程序所做的更改(所以,把页面放在那里,或者杀死进程)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理页错误陷阱后的指令指针值 的相关文章

  • 操作系统如何知道物理内存的实际大小?

    当计算机启动时加载操作系统时 操作系统如何知道硬件信息 是否有一些io指令或引导程序从BIOS获取信息 主板固件 也称为 BIOS ACPI 接口或 EFI 允许操作系统找出系统中 RAM 和 ROM 的物理映射 例如 这是启动 Linux
  • 计算页面大小和段大小

    在分页分段系统中 我们有32位的虚拟地址和12位的偏移量 11位的段和9位的页号 我们如何计算页面大小 最大段大小和最大段数 保留 12 位用于偏移量 因此页面大小为 2 12 4KB 9 位保留用于页号 因此每个段可以包含 2 9 512
  • 程序如何执行?操作系统在哪里发挥作用?

    程序从某种语言编译为 ASM gt 机器代码 直接可执行 当人们说这是平台相关时 意味着形成的二进制文件只能在具有相同指令集架构 如 x86 x86 64 的 CPU 上运行 正确 由于 ISA 的差异 它可能 错误地 可能 根本 不在其他
  • 使用信号量实现 N 进程屏障

    我目前正在为之前迭代的操作系统考试进行培训 我遇到了这个 实施 N 进程屏障 即 是 确保每个流程都完成 他们中的一群人在某个时刻等待着 点在其各自的执行中 对于 其他进程达到他们的 给定点 您有以下内容 可用操作 init sem val
  • 在除以零的中断处理程序中该怎么做?

    操作系统中断处理程序应该如何处理与编码错误相关的中断 例如 我尝试除以 0 来测试我的中断 但我的中断处理程序被调用 然而 由于 div 指令没有成功执行 EIP 不会更新到它之后的下一条指令以及从中断处理程序返回后iret 它又回到了错误
  • 如果存在则不能批量工作

    我正在尝试创建一个 bat 文件来创建一个简单的文本文件 我的问题是 Windows XP 主文件夹是C Documents and Settings而 vista 及以上C Users 我正在运行这个 无论我为路径名输入什么 我总是得到i
  • 从 PHP exec() 函数读取 git Push 的输出

    我正在为我的框架的命令行工具编写部署命令 它使用git来部署 我有一行这样做 exec git push remote branch branch shell output status 我想要里面的推送输出 shell output 但它
  • 如何从 silverlight 应用程序检测操作系统?

    我有一个 Silverlight3 应用程序 旨在在 Windows 和 Mac OS 环境上运行 我想在运行时知道我的应用程序是在 Windows 还是 Mac 上运行 这样我就可以根据用户在他们选择的操作系统中习惯的方式进行一些调整 例
  • FIFO 页面替换策略是否有可能优于 LRU?

    作为操作系统作业的一部分 我被要求比较给定页面访问序列的先进先出和最近最少使用的页面替换策略产生的页面错误数量 令人困惑的是 FIFO 产生的页面错误似乎比 LRU 少 这可能吗 还是我犯了一个错误 是的 FIFO 有可能击败 LRU 我能
  • “操作系统”和“命令外壳”之间有什么区别?

    操作系统 和 命令外壳 之间有什么区别 shell 和操作系统是不同的 让我解释 操作系统是由 BIOS 或 EFI 启动的程序 操作系统控制硬件的非常低级的方面 并向软件提供 API 来使用它们 操作系统通常是内核和一堆应用程序的集合 操
  • 当操作系统只是进程之一时,抢占式多任务处理如何工作?

    我现在正在阅读有关先发制人的多任务处理的材料 但我忘记了一件事 所有材料都暗示 操作系统以某种方式从 外部 中断了CPU上正在运行的进程 从而导致了上下文切换等 然而 我无法想象当操作系统的内核只是 CPU 上的另一个进程时 这将如何工作
  • 如何使用javascript检查客户端系统中是否安装了特定软件?

    是否可以使用Javascript检测客户端系统是否安装了特定的Windows应用程序 我开发了一个网站 该网站必须检测仅由我们开发的应用程序 但我想让你知道 网站名称和 Windows 应用程序名称是不同的 我的意思是考虑我的网络应用程序名
  • 自旋锁与信号量

    信号量和自旋锁之间的基本区别是什么 我们什么时候会使用信号量而不是自旋锁 自旋锁和信号量主要有四个不同点 1 它们是什么 A spinlock是锁的一种可能实现 即通过忙等待 旋转 实现的锁 信号量是锁的概括 或者 相反 锁是信号量的特例
  • 如何通过WMI确定操作系统平台?

    我试图弄清楚 WMI 中是否有一个位置可以返回可在 所有 版本的 Windows 上工作的操作系统架构 即 32 位或 64 位 当我发现以下内容时 我以为我已经弄清楚了我的Win2k8系统 Win32 OperatingSystem OS
  • Python 中可用和已使用的系统内存? [复制]

    这个问题在这里已经有答案了 如何从 Python 获取可用和当前使用的内存 它需要是跨平台的 并且至少可以在 Windows Mac OS X 和 Linux 上运行 我想向我的应用程序中的用户报告没有足够的可用内存来继续 你应该看看psu
  • gcc -lpthread 不工作

    我的系统中安装了 ubuntu 11 我有一个使用 pthread 库的 C 程序 我收到错误Undefined reference to sem wait 即使我已经用标志编译了 lpthread 例如 gcc lpthread prog
  • 设置了 LARGEADDRESSAWARE 标志的应用程序获得的虚拟内存较少

    我有一个 32 位应用程序 由一个 EXE 和多个 DLL 组成 EXE 是用 LARGEADDRESSAWARE标志设置 所以我预计在 64 位操作系统上我应该获得 4 GB 的用户地址空间 但在某些 64 位 Win 7 系统上 我只能
  • 自旋锁在单处理器单核架构中有用吗?

    我对自旋锁的功能感到困惑 自旋锁用于阻止进程重新调度 然而 在只有一个核心的机器上 使用自旋锁有用吗 防止上下文切换 您的观察结果很好 在单处理器系统上 旋转等待资源是没有意义的 因为您最好尽早切换线程 互斥体和信号量正是这样做的 在多处理
  • 将 Objective-C 代码转换为 C++ 以检测 OS X 上的用户空闲时间

    我正在开发 Qt C 应用程序 我需要简单的函数来在 Mac OS X 上以秒为单位检索用户空闲时间 我发现这个代码用于检测用户空闲时间 include
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove

随机推荐

  • 为什么 PlusClient.loadPeople 失败并出现 HTTP 403 错误?

    我将旧的 Google Plus 又名 Google Play 服务 API 集成到我的应用程序中 现在我正在尝试更新内容以使用 V2 API 其中包括访问某个人圈子中的人员列表等 表面上 我应该做的唯一更改是更新我用于身份验证的 OAut
  • 如何获取完整的关注者列表

    使用最新版本的推文尖锐库对于 twitter api 我试图获取特定用户的所有关注者 但我只能用这种方法获得最后 100 个关注者 IEnumerable
  • 一种样式选择器,用于指定特定类中的悬停、活动

    我正在尝试找出如何为以下内容编写样式 我只想为 menu 内的锚标记设置 a hover 和 a active 样式 而不是 menu switch 下面的代码似乎有效 但是我可以将它们合并为一种样式吗 Apply the followin
  • 在Python IDLE中,“打印”变量和仅写入变量有什么区别?

    在 IDLE 解释器中 我使用 dpkt 执行以下操作 for ts buf in pcap eth dpkt ethernet Ethernet buf 现在 当我尝试查看 eth 的内容时 我可以打印它 或者只写变量名 当我做 prin
  • lm() 中的 poly():原始与正交之间的差异

    I have library ISLR attach Wage Polynomial Regression and Step Functions fit lm wage poly age 4 data Wage coef summary f
  • LPCWSTR 代表什么以及应该如何处理?

    首先 它到底是什么 我猜它是一个指针 LPC表示长指针常量 但是 W 是什么意思 是指向字符串的特定指针还是指向特定字符串的指针 例如我想关闭一个名为 TestWindow 的窗口 HWND g hTest LPCWSTR a a Test
  • 在严格模式下获取未知环境中全局对象的引用

    获得句柄的推荐方法是什么全局对象在 ES5 严格模式下在未知的宿主环境中 ECMAScript 没有提供引用我所知道的全局对象的内置方法 如果是的话 这就是我正在寻找的答案 In a 已知环境 全局对象通常具有自引用属性 由于全局对象是VO
  • 将一个数组插入到另一个数组的每第 n 个元素中

    我有 2 个数组 a b c d e f g h i 我需要在第一个数组的每第二个 或第 n 个 元素之后插入第二个数组的元素 结果是 a b g c d h e f i 我有一个简单的方法可以做到这一点吗 您始终可以使用自定义Enumer
  • Django - 仅在 AppConfig.ready() 中创建一个类实例一次

    我需要在应用程序启动 runserver 上创建一个类实例 假设后端请求会话 并且我不想在运行其他管理命令后重写此会话 我怎样才能实现这个目标 我尝试了几种方法 但我不确定为什么这样的方法不起作用 app apps py class MyC
  • Python:从机模式下向mplayer发送命令

    在从属模式下运行 mplayer 时 我尝试通过管道向 mplayer 发送命令 如下所示 import subprocess time start mplayer song mysong mp3 cmd mplayer slave qui
  • 从 Singleton 接收 pyqtSignal

    python中有一个单例类 from PyQt5 QtCore import QObject pyqtSignal import logging class Singleton QObject instance None def new c
  • 如何在 Objective-C 中创建和使用队列?

    我想在我的 Objective C 程序中使用队列数据结构 在 C 中我会使用 STL 队列 Objective C 中等效的数据结构是什么 如何推送 弹出项目 Ben 的版本是堆栈而不是队列 所以我对其进行了一些调整 NSMutableA
  • Selenium:打开扩展的弹出窗口

    我正在尝试使用 Selenium 为我的扩展编写 E2E 测试 对于我的测试 我需要打开扩展程序的弹出页面 就好像用户单击扩展程序的徽标 位于浏览器的右下角 一样 我已经成功地使用扩展程序初始化了 ChromeDriver 方法是 Chro
  • 用于集成 Microsoft 单元测试框架 (VS2017) 的 CMake

    与我之前的问题类似 但专门针对 Microsoft 单元测试框架 Visual Studio 2017集成了C 单元测试 MS单元测试 google测试等 如何创建一个 CMakeLists txt 文件来创建这样一个项目 该项目将使用集成
  • 简单 AOP 示例中的 UnsupportedPointcutPrimitiveException

    我尝试运行一个简单的 aop 示例this地点 我有 spring aop 和aspectj aspectjweaver jars Aspect public class StringAspect Pointcut call String
  • iOS:只调用一个方法一次

    您好 我想知道如何在应用程序生命周期中仅调用一次方法 我的应用程序应该从服务器下载一些文件 而我只需要执行一次 我的意思是每次安装一次 这是我的方法 Download some images from server and save it
  • Eclipse Struts 2 Hibernate JPA 配置

    我正在使用 Eclipse 构建一个 Web 应用程序 我想在其中使用框架 Struts 2 和 Hibernate 这次我没有使用 Maven 只是因为我想知道如果我不使用 Maven 如何让它工作 Version 支柱2 5 休眠5 2
  • SignalR 和 OpenId 连接

    我有一个使用的服务器ASP NET Core Web Api and OpenIddict作为授权框架 现在我添加了一个SignalR主机并想为其添加授权 From 不同来源我找到SignalR JS 客户端 希望您在查询字符串中或通过 c
  • 更新 DOM 时相对定位的元素不会移动(IE6 和 IE7)

    我有一个带有几个字段集的表单 一个字段集具有用户设置的时间偏好表 用户可以添加和删除时间偏好 当他们添加一行时 表行会使用 jQuery 动态插入到 DOM 中append 问题在于 在 IE6 和 IE7 中 添加新的表格行时 页面上任何
  • 处理页错误陷阱后的指令指针值

    老实说 我真的对这个特定的虚拟内存相关概念感到困惑 Q1 当发生页错误时 处理器是否先完成当前指令的执行 然后将 IP 寄存器内容 下一条指令的地址 移入堆栈 或者 它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈 Q2 如果第二种