Operating system 计算机系统中指针的大小是如何确定的?通过虚拟地址还是物理地址?

Operating system 计算机系统中指针的大小是如何确定的?通过虚拟地址还是物理地址?,operating-system,cpu-architecture,systems-programming,virtual-address-space,Operating System,Cpu Architecture,Systems Programming,Virtual Address Space,我明天有一个关于虚拟内存地址转换的考试,我对这个话题很困惑。我知道CPU将生成一个虚拟地址,然后访问一个物理地址。因此,如果我们有一个具有32位虚拟地址和64位物理地址的系统,那么我猜用户级进程的指针将是8字节。 我的逻辑是因为虚拟地址被转换为物理地址,所以这个数字总是来自物理地址 虚拟地址对用户级进程可见。他们不应该看到实际地址。因此,如果虚拟地址是32位的,那么用户级进程中的指针也是32位的,即4个字节 然后,系统/内核需要以某种方式进行转换。它将知道虚拟地址,并且必须将其转换为物理地址,因

我明天有一个关于虚拟内存地址转换的考试,我对这个话题很困惑。我知道CPU将生成一个虚拟地址,然后访问一个物理地址。因此,如果我们有一个具有32位虚拟地址和64位物理地址的系统,那么我猜用户级进程的指针将是8字节。
我的逻辑是因为虚拟地址被转换为物理地址,所以这个数字总是来自物理地址

虚拟地址对用户级进程可见。他们不应该看到实际地址。因此,如果虚拟地址是32位的,那么用户级进程中的指针也是32位的,即4个字节

然后,系统/内核需要以某种方式进行转换。它将知道虚拟地址,并且必须将其转换为物理地址,因此它最终将拥有一个物理指针,64位=8字节。但同样,这个地址/指针仅供“内部使用”


但实际上,您将拥有相同大小的虚拟地址和物理地址,与CPU的字大小及其体系结构(x86与x86_64)相匹配。虚拟到物理的转换通常需要发生在页面错误中,当用户级进程试图访问未加载的内存时,就会发生页面错误。要首先访问它,它需要(例如)取消引用指向该地址的指针,这将通过特定CPU体系结构的内存访问指令完成,这是通过字大小的地址完成的。

虚拟地址对用户级进程可见。他们不应该看到实际地址。因此,如果虚拟地址是32位的,那么用户级进程中的指针也是32位的,即4个字节

然后,系统/内核需要以某种方式进行转换。它将知道虚拟地址,并且必须将其转换为物理地址,因此它最终将拥有一个物理指针,64位=8字节。但同样,这个地址/指针仅供“内部使用”


但实际上,您将拥有相同大小的虚拟地址和物理地址,与CPU的字大小及其体系结构(x86与x86_64)相匹配。虚拟到物理的转换通常需要发生在页面错误中,当用户级进程试图访问未加载的内存时,就会发生页面错误。要首先访问它,它需要(例如)取消引用指向该地址的指针,这将通过特定CPU体系结构的内存访问指令完成,这是通过字大小的地址完成的。

程序员将只看到虚拟地址。物理地址空间对程序员和用户来说是不透明的。因此,指针的大小取决于虚拟地址的大小。在给定的特定情况下,系统可以使用的最大内存量由虚拟地址空间决定。这就是为什么64位硬件上的32位操作系统的最大内存限制为4 Gig。但是,在64位虚拟地址的情况下,即使我们没有足够的RAM,我们也可以将一些页面卸载到辅助存储中,从而产生一种错觉,即我们有更多可用的RAM。在这种情况下,页面位于辅助存储器中,出现页面错误,页面被传输到RAM


编辑:正如Peter在评论中所说,虚拟地址限制会影响进程可以消耗的最大内存

程序员只能看到虚拟地址。物理地址空间对程序员和用户来说是不透明的。因此,指针的大小取决于虚拟地址的大小。在给定的特定情况下,系统可以使用的最大内存量由虚拟地址空间决定。这就是为什么64位硬件上的32位操作系统的最大内存限制为4 Gig。但是,在64位虚拟地址的情况下,即使我们没有足够的RAM,我们也可以将一些页面卸载到辅助存储中,从而产生一种错觉,即我们有更多可用的RAM。在这种情况下,页面位于辅助存储器中,出现页面错误,页面被传输到RAM


编辑:正如Peter在评论中所说,虚拟地址限制会影响进程可以消耗的最大内存

否,用户空间进程仅使用虚拟地址(在您的示例中为32位)。

他们“看到”的内存是他们自己的私有虚拟地址空间。(他们可以进行系统调用,如
mmap
munmap
,以请求该地址空间中的页面由文件或匿名RAM(如C
malloc
)支持),但他们不知道这些页面在物理内存中的位置

操作系统甚至可以通过调出一些页面来交换空间/页面文件来“伪造”,如果进程接触到这样的页面,则通过执行I/O将其带回,然后唤醒进程以重新运行页面出错的加载或存储指令来处理页面错误


硬件在每次内存访问时将虚拟地址转换为物理地址。为了加快速度,TLB缓存最近使用的翻译。在TLB未命中时,硬件执行“页面漫游”,读取页面表以找到正确的虚拟页面->物理页面翻译

操作系统管理页面表,选择任何物理页面作为虚拟页面的“备份”


物理地址比虚拟地址宽? 在多任务操作系统下,可以运行多个进程。每个都有自己的32位(4GiB)虚拟地址空间。

物理地址空间的大小限制了您可以在一台机器中放入的RAM总量,并且可能与任何单个进程一次可以使用的RAM总量不同。更改页表比从磁盘读取要快,所以即使不能一次映射所有页表,内核仍然可以使用