【问题标题】:Who guarantees memory safety, and how?谁保证内存安全,如何保证?
【发布时间】:2013-11-06 08:21:58
【问题描述】:

我现在在大学里已经用 x86 汇编和 C 编程了一段时间了,在这一天,我无法理解一件事:谁阻止我开发一个将值写入 0x0 或其他地址的程序从它们的地址值来看,这似乎对我正在运行的系统很“重要”?

谁保证,首先,我能够做到这一点(我能够做到这一点,对吗?),其次,没有其他进程在实际使用 0x0 或任何其他地址的情况下出现异常行为?

这是如何管理的?

【问题讨论】:

  • 您无法写入受保护的地址。部分内存受内核保护。看到这个:en.wikipedia.org/wiki/Kernel_(computing)
  • 那么,我是否必须保护我的程序的地址空间不受其他进程的影响?此外,将数据写入硬编码地址(例如 0x151515)是否有意义呢?如果其中一些地址可能受到保护,我作为程序员如何知道要写入哪个地址?

标签: memory computer-science allocation


【解决方案1】:

类 unix 系统上的两个不同进程将没有共享内存地址空间。 “用户空间”(进程可以读取和写入,完全放弃)和“内核空间”之间也存在差异,进程很可能既不能读取也不能写入,但可以调用函数(取决于硬件架构上的确切系统调用约定,这可以使用调用门、中断或可能的其他机制来完成)。

两个进程,A 和 B,可能会尝试同时写入其本地地址空间中的地址 0x800000,其中一个写入最终写入(物理)内存位置 0x100,另一个写入(物理)内存位置 0x3000,具体取决于关于内核如何决定将虚拟地址空间映射到物理地址空间的确切方式。

然而,有些系统并非如此。

【讨论】:

  • 非常感谢!你的回答对我帮助很大! :)
【解决方案2】:

您不能写入受保护的地址。部分内存受内核保护,保护很容易,因为每个请求都必须经过内核。见这篇文章: http://en.wikipedia.org/wiki/Kernel_(computing)

【讨论】:

  • 更准确地说,内核安排MMU来保护内存。这就是为什么即使 CPU 运行任意汇编代码而没有任何明显的内核干预,内存也会受到保护。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多