operating-system - 内存访问安全实现问题
问题描述
我了解如果程序需要访问某些受保护的指令,则需要使用系统调用接口。IO 设备访问就是一个例子。生成一个中断,将模式设置为内核模式等。
我的问题是:如何阻止程序访问超出其进程边界的内存。例如访问超出其长度的访问数组或只是任意访问 ta 随机内存地址。
我理解的方式,只有操作系统有能力检查程序是否在其范围内访问内存。并且为了能够使用操作系统,需要中断。这是否意味着数组/变量内存分配必须是系统调用。我对此表示怀疑。
另一种选择是内存控制器或处理器有能力确保程序不会访问超出其范围的内存。
在这方面的任何澄清将不胜感激。
解决方案
另一种选择是内存控制器或处理器有能力确保程序不会访问超出其范围的内存。
这就是它的工作原理。现代操作系统在具有内存保护的 CPU 上运行。您可以在任何 Arch/OS 书籍中找到详细信息,但最基本的想法是操作系统设置页表,告诉 CPU 程序可以访问虚拟内存中的哪些地址,以及它们如何映射到物理内存。然后它只需要确保只有正确分配给进程的内存才包含在该映射中。
当程序运行时,在访问内存的每条指令上,CPU 都会根据页表(或缓存在 CPU 中称为 TLB 的特殊内存中的副本)检查地址。如果页表没有显示允许的访问,CPU 将不会执行它,而是会陷入操作系统,它可以决定做什么(例如终止进程)。
推荐阅读
- browser - Storybook 和主应用程序之间的字体看起来不同
- kubernetes - kubectl --token=$TOKEN 不以令牌的权限运行
- netlogo - 通过时间(刻度)绘制列表的元素
- php - PHP PDO ODBC 连接到普遍的数据库
- maven - Spark Hive 仓库连接器依赖问题
- flutter - 试图从小部件树外部监听提供者公开的值
- node.js - 在非交互式 shell 中使用 exec 的别名
- reactjs - 如何突出显示当前月份?
- python-3.x - 如何在 Python 3 中生成随机 IPv6 子网
- c# - c# WPF 选择组合框名称