微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可执行堆栈如何在 x86 保护模式下工作?

如何解决可执行堆栈如何在 x86 保护模式下工作?

AMD64 开发人员手册第 2 卷(系统编程)的第 4.7.2 节描述了旧模式中的代码段描述符:

代码段建立处理器操作模式和执行权限级别。这些段通常只包含指令并且是只执行的,或者是执行和只读的。 软件无法写入其选择器引用代码段描述符的段。

如果代码段是唯一的可执行段,并且无法写入,那么 32 位系统上的可执行堆栈是如何工作的?

解决方法

代码段是可执行的(但不可写)。堆栈段必须是可读/可写的(不可执行)。

每个段都有一个基地址和一个限制。软件提供 offset/s 到 segment/s(例如,指令指针是到 cs 段描述的区域的偏移量,堆栈指针是到 ss 段描述的区域的偏移量); CPU 检查偏移量是否在段的限制范围内,然后将段的基地址与偏移量相加以确定(线性)地址。

如果代码段和堆栈段引用同一个内存(例如具有相同的基地址和限制);然后可以执行(使用代码段)和读/写(使用堆栈段)相同的内存。

请注意,大多数操作系统不/不使用分段(它们将所有段基地址设置为零,将所有段限制设置为“最大”,使其表现得像没有段一样); “所有段都指向同一个内存”是很常见的。为了保护,大多数操作系统只使用分页。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。