【问题标题】:Segmentation fault in C, how operating system manages it? [closed]C中的分段错误,操作系统如何管理它? [关闭]
【发布时间】:2018-04-12 18:30:00
【问题描述】:

很明显,当我们访问我们不应该访问的内存时会发生分段错误 - 即我们没有访问权限。好的,我假设操作系统管理它。

我的问题是:操作系统如何决定将一块内存分配给一个进程? 并且进程无权访问内存?

【问题讨论】:

  • 你问的太好了!找一本名为“操作系统”之类的书,然后寻找一个名为“内存管理”之类的章节。
  • 了解任何操作系统课程中的虚拟内存
  • 操作系统的主要任务之一是控制对内存的访问。它为进程分配内存,并确保进程不会访问它们不应该访问的内存。这是通过控制内存管理硬件来完成的。程序处理虚拟内存。 O/S 将虚拟内存映射到物理内存,并拒绝滥用内存的尝试。

标签: c memory memory-management permissions operating-system


【解决方案1】:

我的问题是操作系统如何决定将一块内存分配给一个进程?并且进程无权访问内存?

如今,大多数处理器使用页表将进程中的逻辑地址转换为物理页框。逻辑地址分为指定页表、页表条目和偏移量的字段。

如果一个逻辑地址没有对应的页表或页表项,则该地址无效。如果它具有页表条目,则该条目可能被标记为无效。如果条目有效,则该页面可能只能从更安全的模式访问。

这就是处理器知道的方式。都在页表中。

【讨论】:

    【解决方案2】:

    在大多数现代操作系统 (OS) 中,物理内存不是由单个进程直接分配的。相反,虚拟内存层位于进程和物理内存之间,由操作系统的内存管理器维护。该虚拟内存层表示从虚拟地址空间到物理内存的映射,它用于提供一些安全性,以及每个进程拥有自己的内存的抽象。 (除非使用了一些多处理方案)

    当检查一个进程是否可以访问其虚拟内存的某个部分时,操作系统基本上会找出该进程提供的地址是否在该进程的虚拟内存空间中被认为是可访问的。 (请注意,地址进程甚至不必是物理内存上的真实地址)如果该地址在该进程的虚拟内存中不可访问,则抛出段冲突(SIGSEGV)。

    话虽如此,请记住,操作系统中的内存管理是一个漫长的对话,涉及许多细节和特定于操作系统的实现差异。我的回答只是一个通用的,在大多数情况下是正确的,要获得更多更详细的信息,您应该查看许多研究操作系统主题的书籍中的一本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2016-11-19
      • 1970-01-01
      • 2021-02-06
      • 2019-02-17
      • 1970-01-01
      • 2018-10-19
      • 2011-01-02
      相关资源
      最近更新 更多