C访问内存位置

时间:2012-10-09 17:54:01

标签: c memory

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

在C中你可以访问任何内存地址,那么操作系统如何阻止程序更改程序内存空间中没有的内存地址?

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

8 个答案:

答案 0 :(得分:3)

当硬件和操作系统都支持此操作时,您的操作系统内核与内存管理(MMU)硬件紧密配合,使您无法访问您不允许访问的内存。

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

答案 1 :(得分:2)

这就是所谓的内存保护。它可以使用不同的方法实现。我建议你从关于这个主题的维基百科文章开始 - http://en.wikipedia.org/wiki/Memory_protection

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

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

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

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

相关问题