gpt4 book ai didi

c++ - 访问未分配的页面

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:02 24 4
gpt4 key购买 nike

在虚拟内存的概念中,只有当对应的页在虚拟空间中被使用时,才会分配物理页框。

我想知道这种分配是什么时候发生的。

我尝试引用一些随机选择的地址,但大多数时候,它会给我一个段错误。我想大多数页面都被标记为未使用,仅仅读取页面不足以强制操作系统为我分配一个物理页面框架。 (我用 GDB 试过这个)

最佳答案

您所描述的访问冲突是逻辑页面无效的结果;不是他们没有被访问过的事实。在虚拟内存中创建真实页面需要几个分配步骤。

要理解这一点,需要拆分逻辑内存翻译和虚拟内存的概念。

一个内存管理单元提供了一个连续的逻辑地址空间。在该地址空间内,页面可能会或可能不会映射到物理页框。虽然地址空间可能是连续的,但有效页面的范围通常是不连续的。

内存管理单元使用页表将逻辑地址转换为物理地址。

处理器通常使用多个页表或嵌套页表(一个表引用另一个页表,另一个表引用另一个页表来标识页框)。在前一种情况下,页表的长度可能小于整个地址范围。后者也可能如此,但此外,页表引用嵌套表(可能有空条目)。

这个页表结构是用进程创建的。拥有页表 ENTRY 是拥有映射的先决条件。在具有嵌套页表的系统上,可以通过添加条目来调整页表的大小。表的大小通常受系统参数或进程配额的限制。 (忽略 Unix 克隆、具有持久 shell 的系统和系统表)在进程启动时,页表条目不引用任何内容。

程序加载器进行页面映射的初始设置。这会设置页表,以便程序(由 LINKER 定义)在页表中具有有效地址。

在大多数情况下,实际的页框只有在被访问后才会映射到页面。但是,您不会在您的应用程序中看到它。如果页表指示页面有效并且您引用没有物理框架的页面,则会触发页面错误。然后操作系统将创建页面框架映射并重新启动您的应用程序。 (虚拟内存)

您的应用程序可以在运行时映射其他页面。 New 和 Malloc 会在幕后为您做这件事,但您也可以直接做。当您创建此类映射时,您正在更改页表,以便它表示逻辑页有效。然后,您通常必须引用操作系统的页面以将逻辑页面映射到物理页面框架。

(假设您没有尝试编写或执行)简而言之,您描述的是由于没有有效的页表条目而导致逻辑内存转换失败对于您尝试访问的页面。

关于c++ - 访问未分配的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com