Nom*_*424 4 ram x86 assembly operating-system memory-address
我正在尝试阅读英特尔软件开发人员手册以了解操作系统的工作原理,这四个寻址术语让我感到困惑。以上是我的理解,如有不对请指正。
线性地址:对于一个孤立的程序来说,似乎是一长串内存,从地址 0 开始。该程序的所有段都将从其线性地址开始寻址。它可能在内存或磁盘中。
物理地址:出现在 ram 或主存储器引脚中的地址。
逻辑地址:磁盘和内存中交换内存的组合。所有程序的所有线性内存都将保留在逻辑地址空间中。它只能由内核模式使用。从逻辑地址到物理地址的转换是由内部硬件完成的。
虚拟地址:虚拟地址与线性地址相同。它只会被操作系统中的用户模式使用。操作系统将从逻辑地址映射虚拟地址。
线性地址空间表示可以在系统上形成的所有地址。线性地址空间中任何字节的地址称为线性地址。今天的系统有大约 46 位的内存总线宽度,这对应于大约 64 TiB 的线性地址空间。英特尔仅在其扁平内存模型中使用该术语。
处理器在其总线上寻址的内存称为物理内存。每个字节都分配了一个唯一的地址,称为物理地址。需要注意的是,除了内存,内存映射的I/O设备也连接到这条总线上,可以寻址。该内存区域也不必是连续的,这里的内存控制器将物理地址分配给各个内存条和设备。
分页现在添加了虚拟地址空间:每个程序都被分配了自己的线性地址空间。这个地址空间中的一些地址是有效的,其他的则不是。有效地址指的是可能在物理内存中的数据,但也指硬盘上的外包数据(交换文件)。转换由 MMU(内存管理单元)与 TLB(转换查找缓冲区)或操作系统在硬件中完成。也有可能这些数据根本不存在,只有在访问时才生成,但这在这里太过分了。让我们注意这些是虚拟地址。
逻辑地址是英特尔在分段内存模型中使用的一个术语:内存被分成多个段。为了寻址段中的字节,使用逻辑地址。这包括一个段选择器和一个偏移量。使用段选择器将逻辑地址转换为虚拟地址:选择器包含段的开头及其大小。如果偏移量大于段的大小,则地址无效。将段的开头添加到偏移量将为您提供虚拟地址。这种分段内存模型在 64 位模式中基本上被废除了。
概括
Logical Addresses -> Virtual Addresses -> Physikal Addresses
Run Code Online (Sandbox Code Playgroud)
虚拟地址和物理地址是线性地址,反之则不然。
参考: