做个开心的码农 发表于 2023-4-20 16:06:09

段地址(16位),偏移地址(32位)可以构成32位环境下的物理地址,对吗?

段地址(16位):偏移地址(32位)可以构成32位环境下的物理地址,对吗?若不对,请说出理由?

isdkz 发表于 2023-4-20 16:10:27

不完全正确。在32位环境下,使用段地址(16位)和偏移地址(32位)并不能直接构成物理地址。这是因为在x86架构中,实际上是通过“段基址+偏移地址”来计算线性地址(也称虚拟地址)的。然后,线性地址经过分页机制转换成物理地址。

在实模式下(即16位环境),段地址(16位)左移4位后与偏移地址(16位)相加,可以计算出20位的物理地址。但是在32位保护模式下,情况发生了变化。

在32位保护模式下,段地址不再是直接参与物理地址的计算。而是作为一个段选择子(segment selector),用于在全局描述符表(GDT)或局部描述符表(LDT)中查找相应的段描述符。段描述符包含了段基址、段限制和访问权限等信息。系统将段描述符中的段基址与偏移地址相加,得到线性地址。接下来,通过分页机制将线性地址映射到物理地址。

因此,在32位环境下,不能简单地通过“段地址(16位):偏移地址(32位)”构成物理地址。而需要考虑保护模式下的段选择子、段描述符和分页机制。

陶远航 发表于 2023-4-22 10:14:44

不对。

在32位的环境下,物理地址通常是由一个32位的地址值来表示的,其中高位的一部分表示段地址,低位的一部分表示偏移地址。但是,32位环境下使用的段地址仍然是16位,因此只能表示64KB的内存空间,这远远不足以满足现代计算机的内存需求。因此,在32位环境下,需要使用分页机制来扩展内存空间。

另外,虽然段地址和偏移地址可以组合成一个32位的地址值,但这并不一定构成一个合法的物理地址。实际上,操作系统会根据内存映射表来将逻辑地址转换为物理地址,以确保程序访问的内存区域是合法的并且受到保护。因此,要想访问一个特定的物理地址,需要了解操作系统的内存管理机制,并编写相应的系统级程序。

tjliuxiaodong 发表于 2023-4-22 23:11:28

不清楚
页: [1]
查看完整版本: 段地址(16位),偏移地址(32位)可以构成32位环境下的物理地址,对吗?