【问题标题】:What is the real use of logical addresses?逻辑地址的真正用途是什么?
【发布时间】:2020-05-07 10:36:47
【问题描述】:

这就是我对逻辑地址的理解:

使用逻辑地址是为了不破坏物理内存上的数据。通过使用逻辑地址,进程将无法直接访问物理内存,从而确保它不能将数据存储在已经访问过的物理内存位置,从而保护数据完整性。 我怀疑是否真的有必要使用逻辑地址。物理内存上数据的完整性可以通过使用不允许进程访问或修改已被其他进程访问的内存位置的算法等来保持。

【问题讨论】:

  • 欢迎来到堆栈溢出。 (将两个空格附加到您想要在之后中断的行。)您在 内存保护地址转换 是独立的。

标签: operating-system computer-science memory-address


【解决方案1】:

“物理内存上数据的完整性可以通过使用不允许进程访问或修改已被其他进程访问的内存位置的算法等来保持。”

简短回答:不可能设计出一种有效的算法来匹配与逻辑地址相同的性能水平。

这个算法的问题是你将如何拦截每个进程的内存访问?如果不拦截内存访问,就不可能检查一个进程是否有权限访问某个内存区域。如果我们真的要实现这个算法,有一些方法可以在不使用现代 cpu 上的 MMU(内存管理单元)提供的逻辑地址的情况下拦截内存访问(假设你有一个没有 MMU 的 cpu)。但是,这些方法不会像使用 MMU 那样有效。如果你的 cpu 有 MMU,虽然逻辑地址转换是不可避免的,你可以设置一个一对一的物理内存。

在没有 MMU 的情况下拦截内存访问的一种方法是在程序中的每个内存访问指令之前插入内核陷阱指令。由于我们不能信任用户级程序,因此不能将此类工作委托给编译器。因此,您可以编写一个操作系统,在将程序加载到内存之前完成这项工作。该操作系统将扫描您程序的二进制文件,并在每次访问内存之前插入内核陷阱指令。通过这样做,内核可以检查是否应该授予内存访问权限。但是,这种方法会大大降低系统的性能,因为每次内存访问,无论是否合法,都会陷入内核。并且陷入内核涉及需要大量 CPU 周期的上下文切换。

我们可以做得更好吗?那么在我们将程序加载到内存之前对程序的内存访问进行静态分析,这样我们只在非法内存访问之前插入陷阱呢?但是,进程没有预定义的执行顺序。假设您有程序 A 和 B。它们都试图访问相同的内存区域。那么我们的静态分析应该由谁来获得呢?我们可以随机分配给其中之一。假设我们分配给 B。那么我们怎么知道 B 什么时候可以使用这个内存,以便我们可以分配给 A 以便它可以继续?假设 B 使用该区域来保存一个全局变量,该变量在其生命周期中被多次访问。我们是否要等到 B 完成后再将这个区域交给 A?如果B永远不会结束怎么办?

此外,在动态内存分配的情况下,不可能对内存访问进行静态分析。如果程序 A 或 B 尝试分配大小取决于用户输入的内存区域,那么操作系统或我们的静态分析工具无法提前知道该区域的位置或大小。因此根本无法进行分析。

因此,我们必须回退到每次内存访问的陷阱,并确定访问在运行时是否合法。听起来很熟悉?这是MMU或逻辑地址的功能。但是,对于逻辑地址,当且仅当发生非法访问而不是每次内存访问时才会发生陷阱。

【讨论】:

    【解决方案2】:

    操作系统将其模拟为程序,就好像它们正在使用物理内存一样。为了数据完整性,需要额外的层(逻辑地址)。您可以将逻辑地址类比为操作系统的地址语言,因为如果没有此映射,操作系统将无法理解任何程序允许的“实际”地址是什么。为了消除这种歧义,需要逻辑地址映射,以便操作系统知道什么逻辑地址映射到什么物理地址以及该物理地址位置是否允许该程序。它在逻辑地址而不是物理内存上执行“完整性检查”,因为您可以通过更改逻辑地址并进行操作来检查完整性,但您不能在物理内存上真正做同样的事情,因为它会影响使用内存的已经运行的进程.

    另外我想提一下,基址寄存器和限制寄存器是通过执行特权指令加载的,而特权指令是在内核模式下执行的,只有操作系统才能访问内核模式,因此 CPU 不能直接访问寄存器。我希望我能帮上一点忙:)

    【讨论】:

      【解决方案3】:

      有些事情你需要了解。

      首先,CPU 无法直接访问物理内存。为了计算物理地址,CPU 需要一个逻辑地址。然后使用逻辑地址计算物理地址。所以这是逻辑地址访问物理内存的基本需求。如果没有逻辑地址,您将无法访问它。这种转换是必要的。假设如果有一个系统不遵循虚拟/逻辑地址,那么该系统将非常容易受到黑客或入侵者的攻击,因为他们可以直接访问物理内存并操纵任何位置的有用数据。

      第二件事,当一个进程运行时,CPU 会生成逻辑地址,以便将该进程加载到主存中。现在这个逻辑地址的目的是内存管理。与进程的实际大小相比,寄存器的大小非常小。所以我们需要重新定位内存以获得最佳效率。 MMU(内存管理单元)在这里发挥作用。 MMU 使用逻辑地址计算物理内存。所以逻辑地址是由进程生成的,MMU根据这个逻辑地址访问物理地址。

      这个例子会很清楚。

      如果数据存储在地址 50,基址寄存器保存值 50,偏移量保存 0。现在,MMU 将其移动到地址 100,这也将反映在逻辑地址中。偏移量变为 100-50=50。因此,现在如果需要通过逻辑地址检索数据,它会转到基地址 50,然后查看偏移量,即 50,它会转到地址 100 并访问数据。逻辑地址保存它被移动的数据的记录。无论数据更改了多少地址位置,它都会反映在逻辑地址中,因此这个逻辑地址可以访问该数据,无论它现在拥有什么物理地址。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 2015-06-25
        • 2020-08-07
        • 2017-05-23
        • 2020-02-02
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多