首页 > 编程知识 正文

物理逻辑结构,逻辑和物理的区别

时间:2023-05-06 12:29:09 阅读:155707 作者:4791

,首先必须提到的历史是多年前,当人们还在使用DOS或更旧的操作系统时,计算机的内存还非常小,一般是以k为单位计算的。 相应地,当时的程序规模也不大,虽然存储器容量小,但可以容纳当时的程序。 但是随着图形界面的兴起和用户需求的增长,APP应用的规模也随之膨胀,最终问题出现在了程序员面前。 那就是APP应用程序太大,内存无法容纳。 通常,解决方案是将程序拆分为称为overlay的碎片。 覆盖块0首先执行,结束时他调用另一个覆盖块。 覆盖块的更换由操作系统进行,但首先程序员必须先分割程序。 这是一项费时费力的工作,相当无聊。 人们必须找到更好的方法从根本上解决这个问题。 不久,人们找到了一个方法。 这就是虚拟存储装置(virtual memory )。 虚拟存储器的基本思想是程序、数据、栈的总大小可以超过物理存储器的大小,操作系统将当前使用的部分保留在存储器中,将其他未使用的部分保存在磁盘中。 例如,对于16MB的程序和内存只有4MB的机器,操作系统可以通过选择来决定在每个时间点内存中保留哪些4M的内容,并根据需要在内存和磁盘之间交换程序片段。 这样,这个16M的程序就可以在只有4M内存的机器上运行。 这个16M的程序在执行前程序员不需要分割。

二.物理地址、虚拟地址(线性地址)、逻辑地址

无论何时,计算机中都存在程序可以生成的地址集合,称为地址范围。 该范围的大小取决于CPU的位数。 例如,32位CPU的地址范围为0至0x ffffffff (4g ),64位CPU的地址范围为0至0x fffffffffff (4t )。 这个范围是我们程序可以生成的地址范围。 将该地址与虚拟地址空间和虚拟地址对应的是物理地址空间和物理地址,往往我们系统所拥有的物理地址空间只是虚拟地址空间的子集。 这里用最简单的例子直观地说明这两者,对于内存为256M的32bit x86主机来说,其虚拟地址空间范围为0~0xfffffff(4g ),物理地址空间范围为0x00000000~0x0ffffff

这里有虚拟内存的概念。 虚拟内存(virtual memory )是整个内存(请勿在计算机上插入其对号)的抽象说明。 他对于物理存储器,可以直接理解为“不真实”、“假的”存储器。 例如,用0x08000000存储器地址,他关于物理地址上的大的排列中的0x08000000 - 1的地址要素; 因为所有现代操作系统都提供了内存管理抽象,即虚拟内存(virtual memory )。 进程使用虚拟内存中的地址,由操作系统辅助相关硬件,将他“转换”为真正的物理地址。 这一“转变”是所有问题讨论的关键。

有了这样的抽象,一个程序就可以使用比实际物理地址大得多的地址空间(拆东墙,补西墙,银行也这样做了),多个进程也可以使用同一个地址。 不足为奇。 因为转换后的物理地址不一样。

物理地址,从CPU地址总线发送来的地址由硬件电路控制。 目前,这些硬件是可编程的。 其具体含义。 大部分物理地址保留在内存条中的内存中,但也经常映射到其他内存(显卡内存、BIOS等)。 在不使用虚拟内存的机器上,虚拟地址直接发送到内存总线,读写具有相同地址的物理存储器,而使用虚拟存储器时,虚拟地址不是直接发送到内存地址总线,而是内存管理单元mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

http://www.Sina.com/(linear address )也称为http://www.Sina.com/(virtual address ),是从逻辑地址到物理地址转换之间的中间层。 段部件的逻辑地址为段内的偏移地址,加上基地址后为线性地址。 是一个32位无符号整数,最多可用于表示4GB的地址,即最多4294967296个内存单元。 线性地址通常用十六进制表示,取值范围从0x00000000到0xfffffff )程序代码可以生成逻辑地址,通过逻辑地址转换生成线性地址。 如果启用了分页机制,则可以进一步转换线性地址以生成物理地址。 如果未启用寻呼机制,则线性地址直接为物理地址。

线性地址在具有地址转换功能的计算机上,访华命令所赋予的地址(操作数)称为逻辑地址,也称为相对地址。 也就是说,在机器语言指令中,用于指定操作数或指令的地址。 经过地址方式的计算或转换,得到内部存储器中的实际有效地址即物理地址。 逻辑地址由段标识符:的段内偏移两部分组成。 段标识符由称为段选择器的16位字段组成。 前13位是索引号,后3位包含硬件详细信息。

CPU将一个逻辑地址转换为物理地址需要两个步骤。 首先,给出一个逻辑地址。 (实际上是段内偏移。 这个需要理解。 CPU http://www.Sina.com /这样进行两次转换,确实非常麻烦,没有必要

要的,因为直接可以把线性地址抽像给进程。之所以这样冗余,Intel完全是为了兼容而已(Intel为了兼容,将远古时代的段式内存管理方式保留了下来,x86体系的处理器刚开始时只有20根地址线,寻址寄存器是16位。我们知道16位的寄存器可以访问64K的地址空间,如果程序要想访问大于64K的内存,就需要把内存分段,每段64K,用段地址+偏移量的方式来访问,这样使20根地址线全用上,最大的寻址空间就可以到1M字节,这在当时已经是非常大的内存空间了。)。

       现代的多用户多进程操作系统,需要MMU, 才能达到每个用户进程都拥有自己独立的地址空间的目标。使用MMU, 操作系统划分出一段地址区域, 在这块地址区域中, 每个进程看到的内容都不一定一样。例如MICROSOFT WINDOWS操作系统将地址范围4M-2G划分为用户地址空间,进程A在地址0X400000(4M)映射了可执行文件,进程B同样在地址0X400000(4M)映射了可执行文件,如果A进程读地址0X400000, 读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0X400000时,则读到的是B的可执行文件映射到RAM的内容。这就是MMU在当中进行地址转换所起的作用。

 

三、分页机制:页和页帧

大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页桢。  

 

参考的文章如下:

http://forum.ubuntu.org.cn/viewtopic.php?t=276918

http://bbs.chinaunix.NET/thread-2083672-1-1.html


Add something:

在保护模式中,它们的含义是:
虚拟地址--(分段)-> 逻辑地址--(分页)-> 物理地址
虚拟地址、逻辑地址只是保护模式对不同环境下的地址的一种称呼而已


程序员只能使用虚拟地址,但Windows系统自动为应用程序进程的CS、DS、SS、ES对应描述符的段基址设为0(FS指向线程描述块,GS没用到)
这样对于Windows环境下的应用程序而言,虚拟地址与逻辑地址是等同的,只需要考虑分页影响就行

注意虚拟内存管理与虚拟地址的含义不同
保护模式下虚拟地址主要是为了段权限审查,保护系统段不被应用程序破坏
虚拟内存管理有自己的一套术语,其利用“虚拟地址”实现比主存大得多的虚拟内存空间,那是利用保护模式的分页功能实现的,即保护模式下的逻辑地址

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。