与 C 中的指针和虚拟内存混淆

confusion with pointers and virtual memory in C

我觉得我的问题很简单,但我找不到答案。 根据我对虚拟内存的理解:

every process receives a contiguous address space which is mapped to physical memory.

所以,我在我的程序中编写的代码应该能够访问分配给它的虚拟内存中的任何位置,所以我在 C 中编写了以下代码,它抛出了 "access violation exception".[=12= 类型的异常]

如果有人向我解释原因,我将不胜感激。

代码如下:

int* a = 1; // pointer to 1st block of memory
*a = 5; // set the content of pointer to 5, but throws exception

整个地址space没有映射到物理内存,只有一部分。您不能使用未映射的地址。

通常地址space的某些部分是为操作系统保留的。地址的一部分 space 可能映射到文件,其他部分映射到硬件设备。拥有 "virtual" 内存系统的整个想法是,您可以使用单个地址 space 来引用多个事物,这也意味着并非所有虚拟地址始终都是 "valid"。

每个进程都会收到一个连续的逻辑地址space。不是连续的虚拟地址 space。

逻辑页面映射到物理页面框架。

逻辑映射是使用 PAGE TABLE 完成的,包含从本地页面到页面框架的映射。

但是,页面 table 可能没有映射到每个逻辑页面的页面框架。

发生这种情况的原因有两个。首先,操作系统可能不会(通常不会)创建跨越整个地址 space 的页面 table 条目。系统参数或进程配额可能会限制逻辑地址的大小space。某些系统还会将地址范围保留为不可用。

其次,必须有人做逻辑页的映射。这是一个两步过程。 (1) 某人(通常是加载程序)必须将逻辑页面标记为有效。 (2) 操作系统必须将逻辑页映射到物理页。这是在进程访问没有映射的有效逻辑页面时完成的,从而导致页面错误。 (即虚拟内存——有效逻辑页到页框的动态重新映射)。

页面 table 条目可以具有三种状态:

  1. 无效
  2. 有效并映射到映射页面框架
  3. 它有效但没有映射到物理页面框架。 (同样,如果在此状态下访问页面 table 条目,它会触发 PAGE FAULT,导致操作系统创建到有效页面框架的映射。)

在运行时间内,应用程序可以调用系统服务使逻辑页在逻辑地址space中有效。

作为捕获杂散指针的安全检查,大多数系统(通常由链接器指示)根本不映射第一页(但是,应用程序通常可以通过系统调用映射页面)。你的:

 int *a = 1 ;

将 "a" 的地址设置为第一页中的位置,该位置始终无效。

你的

*a = 5 ;

使处理器(内存翻译单元)访问第一页的页面 table 条目。在那里,处理器发现此页面 table 条目被标记为无效(即,没有可能的映射)。这会导致访问冲突。