Memory management 我该如何理解;用户程序从未看到真正的物理地址;?

Memory management 我该如何理解;用户程序从未看到真正的物理地址;?,memory-management,operating-system,Memory Management,Operating System,我正在阅读Avi Silberschatz的操作系统概念,在第8章Main Memroy中,它是这样的: 用户程序从未看到真实的物理地址。该程序可以创建指向位置346的指针,将其存储在内存中,对其进行操作并进行比较 其他地址均为346号。只有当它被用作内存时 地址(可能在间接加载或存储中)相对于基址寄存器重新定位 及 最终位置 在进行引用之前,不会确定引用的内存地址 在我的理解中,当存储lacation 346的指针用作内存地址时,它将被重新定位到物理地址。作者所说的用户程序在这里看不到真实的物

我正在阅读Avi Silberschatz的操作系统概念,在第8章Main Memroy中,它是这样的:

用户程序从未看到真实的物理地址。该程序可以创建指向位置346的指针,将其存储在内存中,对其进行操作并进行比较 其他地址均为346号。只有当它被用作内存时 地址(可能在间接加载或存储中)相对于基址寄存器重新定位

最终位置 在进行引用之前,不会确定引用的内存地址

在我的理解中,当存储lacation 346的指针用作内存地址时,它将被重新定位到物理地址。作者所说的用户程序在这里看不到真实的物理地址是什么意思

作者是什么意思,用户程序永远看不到真实的 这里的物理地址

简短回答:-您的程序使用所谓的逻辑地址。要将这些逻辑地址映射到物理地址,有一种称为MMU的东西。你不能直接使用物理地址(除非你是低级野兽)

长答案:-

术语

物理地址:-内存单元看到的实际地址

逻辑地址:-程序看到的地址,但不能直接用于访问内存,必须执行转换以将其更改为实际地址。你可能会问为什么我们需要这些逻辑地址。(继续读)

假设你有一台内存为4Gib的计算机,作为一名程序员,你并不觉得需要操作系统,而是根据需要编写程序。您编写的每个程序都可以使用整个4GiB内存,它们直接使用物理地址(如果您说读取x,则您直接从内存读取x位置)。一切都很顺利,直到有一天你的朋友来了(他没有电脑),说你的程序不需要整个4 GiB,所以你能让我和你的程序一起运行我的程序吗。你同意并加载他的程序,突然一切都崩溃了

发生了什么事?

两个程序都可以看到物理地址,它们使用相同的物理地址存储一些数据,这会导致数据损坏和系统崩溃。具体来说,你们的两个程序都说了写x之类的话,因为x是物理地址,所以它们都有效地写到了相同的物理位置

如何修复它?

让我们介绍一个中间人,叫他MMU。MMU将进程的逻辑地址空间映射到物理地址空间,并确保好友程序的逻辑地址不会映射到同一物理区域。所以现在当你说写到位置x时,MMU会把x转换成物理地址(你不知道这个物理地址是什么),同时如果你朋友的程序说写到位置x,MMU会把它映射到其他物理地址。您的程序仍然可以看到相当于4Gib的地址空间,但现在程序使用的地址不是物理地址,而是逻辑地址。从您的角度来看,内存访问的过程仍然是一样的。你还是说读x。但现在MMU将这个x映射到某个物理位置,该位置位于您的物理地址空间中,并且与您朋友的地址空间不冲突

这是MMU的最基本示例。此MMU存储每个进程的重新定位地址。在我们的示例中,假设您的程序的重新定位地址为0,而您的朋友程序的重新定位地址为2000。所以当你说write to 100时,它被转换为write to(0+100)。但对于你的朋友来说,它被翻译成写信给(2000+100)

通过使用MMU和不让程序看到物理内存,您成功地在系统中引入了安全性(没有两个进程可以使用相同的物理位置,因此不能损坏彼此的数据)

我正在阅读Avi Silberschatz的操作系统概念,在第8章Main Memroy中,它是这样的:

这是你的第一个问题。再找一本书

在高层,现在大多数处理器使用逻辑地址转换。每个进程都可以看到地址的线性范围。这个地址范围通常被分成512B到1MB(有些高达GB)的页面。在大多数处理器中,页面大小是固定的,但在其他处理器中,页面大小可以是可变的。对于本次讨论,我将坚持使用固定的页面大小

物理内存被划分为与系统上的页面大小相同的页面帧

当一个进程访问一个地址时,处理器将地址分成一个页码,并将一个偏移量分成该页(因为页表的大小是二的幂,这只是位提取)。然后,处理器将页面转换为页面框架

此转换是使用页面表完成的。操作系统必须为每个进程维护定义页面和页面框架之间映射的页面表。对于所有进程,至少有一个地址范围具有相同的映射。对于大多数页面,映射往往是唯一的。而且,许多页面根本没有映射。在没有映射的情况下访问页面会导致某种内存故障

此转换完全由操作系统和处理器在幕后完成。大多数进程完全忽略页面翻译。在大多数系统上,进程无法确定它使用的物理页帧

在执行期间,页面到页面框架的映射可能会更改

这就是为什么

用户程序从未看到真实的物理地址

你的例子中剩下的胡言乱语显然是关于指针的。在大多数处理器中(英特尔忽略了许多乱码),地址只是整数
 MOVE #0x1234, R0 ; R0 points to the start of the array
 MOVE #5, R1  
 MUL #4, R1  ; R1 is the offset to the 5th element of the array.
 ADD R1, R0  ; R0 now points to the 5th element.
MOV (R0), R1