【问题标题】:C accessing memory locationC访问内存位置
【发布时间】:2012-10-09 17:54:00
【问题描述】:

我的意思是物理内存,RAM。

在C语言中你可以访问任何内存地址,那么操作系统如何阻止你的程序改变不在你程序内存空间中的内存地址呢?

它是否为每个程序设置了特定的内存地址作为开始和结束,如果是,它如何知道需要多少。

【问题讨论】:

  • 请搜索“虚拟内存”一词,这是一个相当广泛的主题,并且取决于一堆东西(主要是 CPU、操作系统)。
  • 好的,请不要投反对票,因为我对这一切都不太了解。
  • 不,在 C 中你可以访问任何内存地址。一个指针只有当它是一个对象的地址时才有效。
  • @Apeee 好吧,只是一个注释(不打算投反对票)——仅仅因为你对此不太了解,并不意味着投反对票是无效的。 :) 否则,任何问题都不会被否决。
  • 我认为@KerrekSB 正在谈论 c 标准(我不确定它是否适用)。实际上,问题不在于语言。

标签: c memory


【解决方案1】:

您的操作系统内核与内存管理 (MMU) 硬件紧密合作,当硬件和操作系统都支持这一点时,您将无法访问您被禁止访问的内存。

一般来说,这也意味着您访问的地址不是物理地址而是虚拟地址,硬件会执行适当的转换以执行访问。

【讨论】:

  • 是的......我想有人试图让竞争安静下来:)
  • 是这样想的,但我希望只有一个没有被否决的答案:)
【解决方案2】:

这就是所谓的内存保护。它可以使用不同的方法来实现。我建议您从有关此主题的 Wikipedia 文章开始 — http://en.wikipedia.org/wiki/Memory_protection

【讨论】:

    【解决方案3】:

    实际上,您的程序被分配了虚拟内存,而这正是您使用的。操作系统给了你一部分内存,你不能访问其他进程的内存(除非是共享内存,查一下)。

    【讨论】:

      【解决方案4】:

      这取决于架构,在某些情况下甚至无法防止程序崩溃系统,但通常平台会提供一些方法来保护内存和不同进程的单独地址空间。

      【讨论】:

        【解决方案5】:

        这与 CPU 本身提供的称为“分页”的东西有关。在旧操作系统中,您有“实模式”,您可以在其中直接访问内存地址。相比之下,分页为您提供“虚拟内存”,因此您访问的不是原始内存本身,而是在您的程序看来是整个内存映射。

        【讨论】:

          【解决方案6】:

          操作系统执行“内存管理”,通常与 TLB(Translation Lookaside Buffers)和虚拟内存结合,将任何地址转换为 页面,操作系统可以在当前标记为可读或可执行处理上下文。

          在当前上下文中,处理器 MMU 或内存管理单元的最低要求是将可访问内存限制在一个只能在 supervisor 模式(相对于 用户模式)。

          【讨论】:

            【解决方案7】:

            逻辑地址由CPU生成,由内存映射单元映射到物理地址。与物理地址空间不同,逻辑地址不受内存大小的限制,您只需使用逻辑地址空间即可。地址绑定由 MMU 完成。所以你永远不会直接处理物理地址。

            【讨论】:

              【解决方案8】:

              大多数计算机(以及自 386 以来的所有 PC)都有称为内存管理单元(或 MMU)的东西。它的工作是将程序使用的本地地址翻译为从实际内存中获取实际字节所需的物理地址。对 MMU 进行编程是操作系统的工作。

              因此,程序可以加载到内存的任何区域,并且在执行时从该程序的角度来看,可以是任何其他地址。通常会发现所有程序的代码(本地)出现在同一个地址,并且它们的数据总是(本地)出现在同一个地址,即使它们在物理上位于不同的位置。每次访问内存时,MMU 都会透明地从本地地址空间转换到物理地址空间。

              如果程序试图访问尚未映射到其本地地址空间的内存地址,硬件会产生异常并通常被标记为“分段违规”,然后强制终止程序。这可以防止访问其他进程的内存。

              但不一定是这样!在具有“虚拟内存”且当前对 RAM 的资源需求超过物理内存量的系统上,一些页面(只是普通大小的内存块,通常在 4-8kB 的数量级上)可以写出到磁盘并给出作为试图分配和使用新内存的程序的 RAM。稍后,当拥有该页面的任何程序需要该页面时,内存访问会导致异常,并且操作系统会换出其他一些内存页面并从磁盘重新加载所需的页面。发生这种情况时,“页面错误”的程序会延迟,否则什么也不会注意到。

              MMU/OS 还可以执行许多其他技巧,例如在进程之间共享内存、使磁盘文件看起来可直接访问内存、将某些页面设置为“NX”以使其无法访问被视为可执行代码,使用逻辑内存空间的任意部分,而不管物理内存使用多少以及在哪个地址,等等。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-12-03
                • 1970-01-01
                • 2021-10-16
                • 1970-01-01
                • 1970-01-01
                • 2017-05-12
                • 2011-09-27
                • 1970-01-01
                相关资源
                最近更新 更多