我对有关虚拟内存的一些主题感到困惑。所以,我将逐点列出它们并提出问题。在回答时,如果您还列出一些我可以消除疑问的来源,我会更喜欢。我将参考 linux elf 可执行文件进行讨论。
我听说在 32 位系统中每个进程都有 4gb 的地址空间。当我检查我的一个可执行可重定位文件的 objdump 时,我看到它的限制从 00000000 到 ffffffff。它还包含内核空间。这是文件的地址空间。这就是我们说的虚拟内存吗?如果是,那么我已经读过虚拟内存机制允许运行非常大的进程,并且进程大小不受主内存大小的限制(我们可以在按需分页时将所需的页面带到主内存)。那么如果虚拟内存只有4gb,是不是限制程序的最大大小为4gb呢?此外,我检查了另一个文件的 objdump,它具有相同的地址(即 00000000 到 ffffffff)。那么这是什么意思?这是否意味着我们的文件是某种可重定位文件,将再次添加起始地址(尽管这看起来很荒谬,因为它已经是一个可执行的可重定位目标文件)。
我读过在已实现分段的内存中,cpu 产生虚拟(逻辑)地址。这个地址包含三个部分——段,段内的偏移量。此外,这里讨论的部分是代码、数据、堆栈等。
在进程地址空间中,这些段从特定位置开始定位。那么,cpu的虚拟地址的内容是什么?生成的虚拟地址范围是否从 00000000 到 ffffffff?如果是,那么是在虚拟地址访问内容的过程,如下:-
The segment part is looked up in the segment descriptor table to find the segment's starting address in linear address space. Then the offset is indexed within the segment and the resulting address is the linear address. Then, we look up the page table and map the address to physical address. If the page is not currently in the main memory, it is brought.
这再次出现了这样一个事实,即任何时候都没有进程可以完全位于主内存中,因为这样整个内存将只被一个进程占用(因为进程的地址空间本身就是 4gb)。
此外,如果所有进程的地址空间从 00000000 到 ffffffff,并且主内存中一次可以存在多个进程,那么所有进程都应该有自己的段描述符表,该表返回线性地址空间中的段地址
- 我读到操作系统在启动时被加载到主内存中。那么该操作系统与特定进程的内核空间中的内核代码有什么区别?此外,是否所有进程在其内核空间中都有自己的内核代码副本?