首页 文章

操作系统陷阱:导致寻址错误的原因是什么?

提问于
浏览
-3

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

  • 目标地址小于基址寄存器 .

  • 目标地址大于或等于限制寄存器 .

可以在下面的 Figure 7.2 中直观地观察到该逻辑 .

Figure 7.2

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

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

But what are some examples of when the requested address would actually be outside of the program's assigned memory space? 这会导致什么?

[图片和报价来源:Operating System Essentials,2nd Ed . - 亚伯拉罕Silberschatz]

1 回答

  • 1

    在实践中,当前的硬件(例如x86-64 PC,ARM平板电脑......)不再使用基本和限制寄存器(但是i286确实),但是有一个MMU .

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

    但是什么时候请求的地址实际上超出了程序分配的内存空间?

    user space中的任何类型segmentation fault,特别是取消引用 NULL 指针(或某些"uninitialized"指针变量,其中包含地址空间之外的随机位模式) . 这些错误在C程序(用户空间)中很常见 . 有关简化示例:

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

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

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

    顺便说一下,你的问题没有提到DMA(但你的评论是这样做的) . 实际上, DMA is managed only by the kernel (例如,用于物理磁盘I / O)在配置和启动之前确保整个块地址有效(并且被分页) . 所以在实践中,DMA中的错误地址永远不会发生(取决于硬件DMA可以使用物理或虚拟地址) . 更一般地说,kernel应该避免像分段错误或其他类型的错误地址之类的错误:user space可能有错误的地址(内核在发生这种情况时会产生分段错误,而在Unix上会给应用程序提供一些 SIGSEGV signal),但内核空间应该是只使用好地址的可信代码 .

相关问题