C中的分段错误,操作系统如何管理它?

时间:2017-10-31 14:33:53

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

话虽如此,请记住,操作系统中的内存管理是一个长期的对话,其中包含许多细节和特定于操作系统的实现差异。我的答案只是一个在大多数情况下都是正确的通用答案,而且对于更详细的信息,您应该查看许多可用于研究操作系统主题的书籍。

答案 1 :(得分:0)

  

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

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

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

这就是处理器所知道的。这一切都在页面表中。