【问题标题】:x86 - kernel - programs, cleaning and memory overwritex86 - 内核 - 程序、清理和内存覆盖
【发布时间】:2016-02-28 11:35:35
【问题描述】:

我不确定。以linux为例;当程序退出时,内核负责清理进程。

如何确保物理内存不会从进程 A 覆盖到进程 B(不同的虚拟内存(页条目)导致相同的物理分配)?

如何预防?

【问题讨论】:

  • 操作系统与 CPU 协作处理从虚拟内存到物理内存的映射。通过简单地将不同的虚拟页面同时映射到相同的物理内存,物理内存永远不会被覆盖。

标签: memory-management x86 operating-system kernel


【解决方案1】:

Linux 使用here 描述的工具将页面分配给进程并从进程中释放页面。
(搜索内核源代码以获取更多详细信息。)

这意味着,内核将有关已使用页面的信息保存在某些数据结构中(例如,可能是位图),并且只有未使用的页面才可用于新进程。
这可以防止错误地将正在使用的页面分配给新进程。超出此范围的任何行为都将是错误和严重的安全漏洞。

【讨论】:

  • cad,因此内核维护一个空闲内存列表,在 malloc 或等效项上对其进行更改,并将此内存放回空闲或等效项的列表中,准备好由另一个进程再次分配。因此,我们在读取非归零内存时可以找到哪些垃圾值?我明白了吗?
  • @AmyLindsen 部分。 malloc 的实现是由实现定义的,所以它可能被实现为进程最初分配的区域。在这种情况下,C 运行时自行管理堆。关于垃圾值 - 不完全是。如果有人在堆上存储了密码怎么办?你可以读它。阅读this了解更多信息。
  • @AmyLindsen That 也是一本好书。请注意接受的答案中的“尽管 AFAIK no malloc 确实使用该方法将内存段返回给内核”;这正是我所说的。
  • @Amy:当malloc 需要从操作系统获取新内存时,它已经被清零了。如果 Linux(内核)在映射到调用 sbrkmmap(MAP_ANONYMOUS) 的进程之前没有将内存归零,那么它会将来自另一个用户或内核本身的数据泄漏到用户进程中。在您拥有free()d 一些内存之后,您只能从malloc() 获得“垃圾”填充的内存。 calloc() 的良好实现应该利用这一点,并从操作系统中获取零页面以进行大量分配,并避免自己编写它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多