2

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

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

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

4

8 回答 8

3

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

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

于 2012-10-09T17:56:00.807 回答
2

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

于 2012-10-09T17:58:08.480 回答
1

实际上,您的程序被分配了虚拟内存,这就是您使用的。操作系统为您提供了一部分 RAM,您无法访问其他进程的内存(除非它是共享内存,请查找它)。

于 2012-10-09T17:55:42.427 回答
1

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

于 2012-10-09T17:55:58.293 回答
0

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

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

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

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

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

于 2012-10-09T19:29:34.510 回答
0

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

于 2012-10-09T18:34:36.440 回答
0

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

在当前上下文中,对处理器 MMU 或内存管理单元的最低要求是将可访问内存限制在只能在超级用户模式下(与用户模式相反)在处理器寄存器中设置 范围

于 2012-10-09T17:56:42.723 回答
0

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

于 2012-10-09T17:56:48.287 回答