2012-10-09 70 views
2

我的意思是物理内存,RAM。C访问内存位置

在C语言中,你可以访问任何内存地址,所以如何在操作系统则阻止改变内存地址是不是在你的程序的内存空间,你的计划吗?

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

+2

请搜索“虚拟内存”这个术语,它是一个相当广泛的主题,取决于一堆东西(主要是CPU,OS)。 – Mat

+1

好的,请不要低估,因为我对这一切都不太了解。 – Apeee

+0

不,在C中,您可以*不*访问任何内存地址。一个指针只有在它是一个对象的地址时才有效。 –

回答

1

实际上,你的程序分配为虚拟内存,这就是你的工作。操作系统给你一部分内存,你不能访问其他进程的内存(除非它是共享内存,查找它)。

1

这取决于系统的架构,在某些它甚至不是可以防止程序崩溃的系统,但通常该平台提供了一些手段来保护内存和不同工艺的独立的地址空间。

3

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

一般来说,这也意味着你访问的地址不是物理地址而是虚拟地址和硬件,以便执行访问进行适当的翻译。

+1

downvote的任何理由? – mah

+0

哦,你呢? :) –

+0

是啊...我想有人试图安静的竞争:) – mah

0

操作系统做“存储器管理”常常与TLB的(转换后备缓冲区)和虚拟内存,其中任何地址转换为页,其操作系统可以标记在当前进程上下文可读或可执行文件。

的最低要求为一个处理器MMU或存储器管理单元在当前上下文限制accessable存储器到可以在处理器的寄存器中管理程序模式只设置(相对于用户模式)的范围内。

0

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

2

这就是所谓的内存保护。它可以使用不同的方法来实现。我建议你开始对这一主题的维基百科文章 - 由这是由内存映射单元映射到物理地址的CPU产生http://en.wikipedia.org/wiki/Memory_protection

0

的逻辑地址。与物理地址空间不同,逻辑地址不受内存大小的限制,您只需使用逻辑地址空间即可。地址绑定由MMU完成。所以你从不直接处理物理地址。

0

大多数计算机(以及386以来的所有计算机)都有一些称为内存管理单元(或MMU)的东西。这是翻译程序使用本地地址到物理地址需要从真实的内存中获取真正的字节。编写MMU是操作系统的工作。由于这个原因,程序可以加载到内存的任何区域,并从执行时该程序的角度出现,成为任何其他地址。通常发现所有程序的代码都出现在本地,并且它们的数据总是出现在同一个地址,并且它们的数据总是出现在同一个地址上,即使它们在物理上位于不同的位置。每次访问内存时,MMU都会从本地地址空间透明地转换为物理地址空间。

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

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

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