x86 - 可执行堆栈如何在 x86 保护模式下工作?
问题描述
AMD64 开发人员手册第 2 卷(系统编程)的第 4.7.2 节描述了传统模式下的代码段描述符状态:
代码段建立处理器操作模式和执行特权级别。这些段通常只包含指令并且是只执行的,或者是执行和只读的。软件不能写入选择器引用代码段描述符的段。
如果代码段是唯一的可执行段,并且它们不能被写入,那么 32 位系统上的可执行堆栈是如何工作的?
解决方案
代码段是可执行的(但不可写)。堆栈段必须是读/写的(并且不可执行)。
每个段都有一个基地址和一个限制。软件提供到segment/s的偏移量(例如指令指针是到段描述的区域的cs
偏移量,堆栈指针是到ss
段描述的区域的偏移量);CPU 检查偏移量是否在段的限制内,然后将段的基地址添加到偏移量以确定(线性)地址。
如果代码段和堆栈段引用相同的内存(例如具有相同的基地址和限制);然后可以执行相同的内存(使用代码段)和读/写(使用堆栈段)。
请注意,大多数操作系统不/不使用分段(它们将所有段基地址设置为零,所有段限制为“max”,因此它的行为就像没有段一样);并且“所有段引用同一内存”很常见。为了保护,大多数操作系统只使用分页。
推荐阅读
- javascript - 动态分配的对象属性未在页面加载时呈现
- list - Symfony & Easyadmin:如何在同一页面上显示多个实体列表
- javascript - 在页面调整大小之前不会显示剑道图
- delphi - 如何在过程参数('嵌套')中传递参数?
- mongodb - 使用两个集合的 MongoDB 查询
- angular - 无法检测来自条形码或键盘的输入。角 2+
- google-sheets - 根据 Google 表格中的时间表数据计算员工的工作时间和休息时间
- asp.net-core - 尝试将数据发布到 Asp.net 核心 Web api 时在 Angular 8 中出现 CORS 错误?
- docker - Docker Swarm 堆栈部署特定服务
- angular - 有没有办法将 Docker 环境传递给 Angular 应用程序?