【问题标题】:Operating System Trap: What causes addressing errors to occur?操作系统陷阱:发生寻址错误的原因是什么?
【发布时间】:2018-10-21 11:16:36
【问题描述】:

为特定进程分配逻辑内存空间后,通过使用基址寄存器限制寄存器来强制保护该空间。为了防止访问为进程分配的内存空间之外的内存,CPU 硬件将每个请求的内存地址与这些寄存器进行比较。如果以下两个条件之一成立,则会发生操作系统陷阱:

  1. 目标地址小于基址寄存器
  2. 目标地址大于等于限制寄存器

这个逻辑可以在下面的图7.2中直观地观察到。

上面解释了它们是如何发生的,例如

任何以用户模式执行的程序访问操作系统内存或其他用户内存的尝试都会导致操作系统陷入陷阱。

但是,当请求的地址实际上超出程序分配的内存空间时,有哪些示例?会导致这种情况?

[图片和引用来源:操作系统要点,第 2 版。 - 亚伯拉罕·西尔伯沙茨]

【问题讨论】:

  • 您的问题或文本中未提及 DMA。
  • 你的问题确实不清楚。
  • 是的,DMA 上的维基页面解释了类似的事情。它只在内部内核相关,而不是在用户空间。
  • 我认为您的问题不清楚。它没有提到用户空间与内核空间,后者是 DMA 的核心。图片仅对用户空间有意义(根据定义,内核代码不能陷入操作系统,因为它实现操作系统抽象)。 DMA 仅在内核模式下发生,而用户模式看不到它。内核无法捕获到操作系统监视器,因为它操作系统监视器
  • 再一次,在内核内部捕获到操作系统监视器(操作系统内核的另一个名称)没有任何意义。只有在用户模式下才有意义

标签: memory operating-system cpu-registers hardware-traps


【解决方案1】:

实际上,当前的硬件(例如 x86-64 PC、ARM 平板电脑……)不再使用基址和限制寄存器(但 i286 使用了),但有一个 MMU

了解MMUpagingsegmentation faultvirtual memoryvirtual address spaceOperating System: Three Easy Pieces(可免费下载)

但是,当请求的地址实际上超出程序分配的内存空间时,有哪些示例?

user space 中的任何类型的segmentation fault,尤其是取消引用NULL 指针(或某些“未初始化”指针变量,其中包含地址空间之外的随机位模式)。此类错误在 C 程序(在用户空间)中很常见。举个简单的例子:

int *ptr = NULL;
/// some long code or execution which does not change the `ptr` value
*ptr = 34; // SEGMENTATION FAULT 

内核代码应该是可信的,并且不会出现任何分段错误(通过假设)。内核代码行为不端和取消引用无效地址会导致计算机崩溃。

(实际上,像 Linux 这样的大内核有一些代码可能“部分”处理内核的一些部分中的分段错误,例如一些驱动程序;但一般的想法是内核代码应该是可信且无错误)。

顺便说一句,你的问题没有提到DMA(但你的 cmets 有)。在实践中,DMA由内核管理(例如物理磁盘 I/O),内核在配置和启动它之前确保整个块地址都是有效的(并调入)。因此,实际上 DMA 中的错误地址永远不会发生(取决于硬件 DMA 可以使用物理地址还是虚拟地址)。更一般地说,kernel 有望避免诸如分段错误或其他类型的错误地址之类的错误:user space 可能有错误地址(发生这种情况时内核会产生分段错误,而在 Unix 上会给出一些SIGSEGVsignal到应用程序),但内核空间应该是只使用良好地址的受信任代码。

【讨论】:

  • 在某些硬件上,DMA 只使用物理内存,甚至不知道基址和限制寄存器。在每台计算机上,DMA 是一个非常低级的操作,只有内核应该知道和处理。应用程序和用户模式看不到 DMA
  • 错了。它不是关于主内存,而是关于虚拟内存。你仍然感到困惑。
  • 所以基本上必须编写显式尝试访问超出范围的内存的代码?
  • 让我们continue this discussion in chat。请加入那个聊天,我们需要互动讨论。你还是一头雾水。
  • 这不是答案。很难想象一本当今使用的操作系统书籍会涵盖基本寄存器和限制寄存器,而不仅仅是历史性的一步。
猜你喜欢
  • 1970-01-01
  • 2014-08-14
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多