Linux 多页边界和 cpu 段

标签 linux operating-system

我很困惑 Linux 怎么能有这么多段,而且它仍然可以进行边界检查。据我所知,现代 CPU 有几个段数据寄存器(代码、数据等)。

但是 Linux 有自己的多个段:Stack、BSS、heap、code、globals 等等(尤其是当堆很大并且由很多段组成时)。并非每个 CPU 都有足够的寄存器来跟踪所有这些段。

如果我没记错的话,Linux 将每个段存储在一个单独的页面中,那么它如何能够防止其中一个页面越界读取或写入?

我唯一可能的解释是 Linux:

  1. 对每次写入执行一些手动检查
  2. 将所有页面放在一起,以便可以用几个寄存器跟踪它们

最佳答案

随着 64 位 Intel 的出现,硬件段的概念本应在 1970 年代消亡。

But Linux has multiple segments of its own: Stack, BSS, heap, code, globals, and many more (especially if the heap is large and composed of many segments).

这些是教学概念,与链接器实现之外的现实关系不大——但有关操作系统的坏书一直在使用这些概念。

栈就是内存。堆只是内存。操作系统不知道内存是否被用于堆栈,无论它是否被用于堆。操作系统只是将内存分配给具有不同属性(例如,读/写、只读、读/执行)的进程。进程如何处理该内存是它自己的事。

关于Linux 多页边界和 cpu 段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52251195/

相关文章:

linux - 在 Linux 上接收所有多播 ICMPv6 数据包

linux - 是否可以将 `script` 通过管道传输到例如 `xz` 以进行即时压缩而不是文件或设备?

linux - 如果他们的 etime 大于 X 时间量,我如何终止特定进程?

Linux 日期对象在指定小时/分钟/秒时表现不同

c - n-pipeline 最终产生 EOF

operating-system - 在就绪队列只有一个进程且使用循环调度的系统中是否发生上下文切换?

memory-management - 确定给定地址的页码和偏移量

memory - 字的大小和寻址

linux - 时间片是同步的还是异步的,为什么?

linux - Perl 比较