OS 如何在分页方案中捕获非法内存引用?
How OS catches illegal memory references at paging scheme?
我试图了解 OS 如何在使用分页的系统中捕获所有非法内存访问。 (32 位,x86,启用分页)。
更具体地说,假设我有一个只有 1 页大小的小应用程序。考虑到 MS OS 占用了 'virtual memory address space' 的上半部分,而我的小 EXE 只占用了 VMAS 下半部分的 4k,那么:
1) 当我的代码试图写入我自己的 Exe 之外的内存位置时,OS 如何意识到有一个 'illegal memory reference/access' 正在进行4k? (显然,该指针不是从 'malloc' 或类似调用中获得的)。
2) 如何为那个小 Exe 管理页表? OS 是否必须使用 'Non-Present' 属性集并拥有 'System' 来定义所有 1 M 页面条目(-1 页面条目)? (创建 'process' 时)。
欢迎大家提出建议或意见。
编辑:
为了清楚起见,答案(从所有慷慨的贡献中编译而来)是:
为了捕获对未分配内存的非法引用,的VMAS App 应标记为 User & Non-Present 和 rest 的 VMAS 应标记为 Kernel & Non-Present。
(当然,allocated内存是带User属性的. 请注意 User & Non-Present 在第一个 运行! 之前位于 'process creation'。之后它会改变到 用户和当前).
这样 硬件 监视器将捕获 App 边界之外的任何访问!!!
页面错误处理程序将 假定 非法访问,因为没有 User代码被允许访问(read/write)一个内核页面。
[VMAS=虚拟内存地址Space]
How OS realizes that there is an 'illegal memory reference/access' going on when my code tries to write to a memory location outside from my own Exe's 4k? (Obviously, that pointer wasn't obtained from a 'malloc' or similar call).
出现页面错误并执行页面错误处理程序。在无效内存访问的情况下,它终止程序。在访问交换内存的情况下,它会将内存内容从磁盘重新恢复到主内存中,让程序继续。
How are Page Tables managed for that tiny Exe? Does OS have to define all 1 M Page Entries (-1 Page Entry) with a 'Non-Present' attribute set and 'System' owned? (When that 'process' is created).
在 x86 上,有两级页面结构:页面目录和页面 tables。假设您的程序适合单个页面,OS 将初始化一个页面目录,该目录仅包含一个指向页面 table 的有效条目,并且仅包含一个指向包含所需内存的页面的有效条目。
1) How OS realizes that there is an 'illegal memory reference/access' going on when my code tries to write to a memory location outside from my own Exe's 4k? (Obviously, that pointer wasn't obtained from a 'malloc' or similar call).
必须发生一系列事件。处理器将 (a) 被访问的逻辑页面作为输入; (b) 访问类型; (c) 确定访问是否有效的处理器模式。
- 页面是否有 table 条目?如果不是 => 访问冲突
- 页面 table 条目标记为有效吗?
这里的处理是系统特定的,取决于页面 tables 是否可以区分无效页面 table 条目和未映射到页面框架的有效条目。在前一种情况下 => 访问冲突。在后一种情况下,它会触发页面错误,OS 必须确定是触发访问冲突还是加载页面。
- 页面 table 是否允许当前处理器模式的访问类型?如果不是 => 访问冲突。
如果硬件触发访问冲突异常,它会切换到内核模式并调用 OS 的访问冲突处理程序。
2) How are Page Tables managed for that tiny Exe? Does OS have to define all 1 M Page Entries (-1 Page Entry) with a 'Non-Present' attribute set and 'System' owned? (When that 'process' is created).
操作系统提供将内存映射到进程地址的系统服务space。一般是程序加载器读取EXE文件中的指令,调用页面映射系统服务来设置应用程序的初始状态。
何时发生取决于操作系统。在太监国度,进程是其父进程的克隆。程序的 运行ning 发生在 exec___ 系统调用中。一些操作系统有一个后台命令处理器,允许多个应用程序在一个进程中按顺序 运行。
从那里开始,由应用程序管理映射到其地址 space 的页面。这是通过调用系统服务来完成的。例如 "malloc" 调用将导致应用程序使用系统服务来映射页面。
应用程序的初始状态很可能存在无效用户地址的漏洞。事实上,有效地址范围在逻辑地址 space.
内不太可能是连续的
每个页面都具有以下属性:Present 和 Read/Write。
访问不存在的页面或写入只读页面,会生成称为 页面错误 的特权事件。此事件采用 CPU 执行 OS 设置的特定例程的形式。
因此 OS 被告知事件和所做的尝试。
用于实现分页的结构是分层的:页面被分组到目录中,目录被分组到更高的目录中。通常有四个级别。
就像在文件系统中一样,只需要创建到达特定页面所需的目录。
权威的信息来源是 Intel manuals,特别是第三卷。
此回答有意使用了简化字。
我试图了解 OS 如何在使用分页的系统中捕获所有非法内存访问。 (32 位,x86,启用分页)。
更具体地说,假设我有一个只有 1 页大小的小应用程序。考虑到 MS OS 占用了 'virtual memory address space' 的上半部分,而我的小 EXE 只占用了 VMAS 下半部分的 4k,那么:
1) 当我的代码试图写入我自己的 Exe 之外的内存位置时,OS 如何意识到有一个 'illegal memory reference/access' 正在进行4k? (显然,该指针不是从 'malloc' 或类似调用中获得的)。
2) 如何为那个小 Exe 管理页表? OS 是否必须使用 'Non-Present' 属性集并拥有 'System' 来定义所有 1 M 页面条目(-1 页面条目)? (创建 'process' 时)。
欢迎大家提出建议或意见。
编辑: 为了清楚起见,答案(从所有慷慨的贡献中编译而来)是:
为了捕获对未分配内存的非法引用,的VMAS App 应标记为 User & Non-Present 和 rest 的 VMAS 应标记为 Kernel & Non-Present。 (当然,allocated内存是带User属性的. 请注意 User & Non-Present 在第一个 运行! 之前位于 'process creation'。之后它会改变到 用户和当前).
这样 硬件 监视器将捕获 App 边界之外的任何访问!!! 页面错误处理程序将 假定 非法访问,因为没有 User代码被允许访问(read/write)一个内核页面。
[VMAS=虚拟内存地址Space]
How OS realizes that there is an 'illegal memory reference/access' going on when my code tries to write to a memory location outside from my own Exe's 4k? (Obviously, that pointer wasn't obtained from a 'malloc' or similar call).
出现页面错误并执行页面错误处理程序。在无效内存访问的情况下,它终止程序。在访问交换内存的情况下,它会将内存内容从磁盘重新恢复到主内存中,让程序继续。
How are Page Tables managed for that tiny Exe? Does OS have to define all 1 M Page Entries (-1 Page Entry) with a 'Non-Present' attribute set and 'System' owned? (When that 'process' is created).
在 x86 上,有两级页面结构:页面目录和页面 tables。假设您的程序适合单个页面,OS 将初始化一个页面目录,该目录仅包含一个指向页面 table 的有效条目,并且仅包含一个指向包含所需内存的页面的有效条目。
1) How OS realizes that there is an 'illegal memory reference/access' going on when my code tries to write to a memory location outside from my own Exe's 4k? (Obviously, that pointer wasn't obtained from a 'malloc' or similar call).
必须发生一系列事件。处理器将 (a) 被访问的逻辑页面作为输入; (b) 访问类型; (c) 确定访问是否有效的处理器模式。
- 页面是否有 table 条目?如果不是 => 访问冲突
- 页面 table 条目标记为有效吗? 这里的处理是系统特定的,取决于页面 tables 是否可以区分无效页面 table 条目和未映射到页面框架的有效条目。在前一种情况下 => 访问冲突。在后一种情况下,它会触发页面错误,OS 必须确定是触发访问冲突还是加载页面。
- 页面 table 是否允许当前处理器模式的访问类型?如果不是 => 访问冲突。
如果硬件触发访问冲突异常,它会切换到内核模式并调用 OS 的访问冲突处理程序。
2) How are Page Tables managed for that tiny Exe? Does OS have to define all 1 M Page Entries (-1 Page Entry) with a 'Non-Present' attribute set and 'System' owned? (When that 'process' is created).
操作系统提供将内存映射到进程地址的系统服务space。一般是程序加载器读取EXE文件中的指令,调用页面映射系统服务来设置应用程序的初始状态。
何时发生取决于操作系统。在太监国度,进程是其父进程的克隆。程序的 运行ning 发生在 exec___ 系统调用中。一些操作系统有一个后台命令处理器,允许多个应用程序在一个进程中按顺序 运行。
从那里开始,由应用程序管理映射到其地址 space 的页面。这是通过调用系统服务来完成的。例如 "malloc" 调用将导致应用程序使用系统服务来映射页面。
应用程序的初始状态很可能存在无效用户地址的漏洞。事实上,有效地址范围在逻辑地址 space.
内不太可能是连续的每个页面都具有以下属性:Present 和 Read/Write。
访问不存在的页面或写入只读页面,会生成称为 页面错误 的特权事件。此事件采用 CPU 执行 OS 设置的特定例程的形式。 因此 OS 被告知事件和所做的尝试。用于实现分页的结构是分层的:页面被分组到目录中,目录被分组到更高的目录中。通常有四个级别。
就像在文件系统中一样,只需要创建到达特定页面所需的目录。
权威的信息来源是 Intel manuals,特别是第三卷。
此回答有意使用了简化字。