逻辑地址如何转换成物理地址热门两篇
逻辑地址和物理地址是什么?逻辑地址如何转换成物理地址?看到很多人都在问这个问题,小编为大家分享了逻辑地址如何转换成物理地址的方法,下面大家跟着读文网小编一起来了解一下吧。
硬盘逻辑地址转换成物理地址
在对硬盘进行故障维护或者进行相关软件开发时,不仅需要将硬盘的物理地址转换成逻辑地址,有时还需要知道逻辑地址转换为物理地址的方法。
根据计算机中符号的常用法则,我们用“div”表示除法运算,用“mod”表示取余数运算,其他参数如C、H、S依然表示硬盘当前的柱面、磁头和扇区号,C1、H1、S1、NS和NH含义也和上面一致。在已知硬盘逻辑地址即逻辑扇区号LS的情况下,求硬盘对应的物理地址的柱面号C、磁头号H和扇区号S的方法如下:
C=((Ls div NS)div NH)+ C1
H=((Ls div NS)mod NH)+ H1
S=(Ls mod NH)+ S1
实例:设硬盘的磁头号为4,每磁道17个扇区,其中逻辑硬盘D的第一个扇区在硬盘的柱面120、磁头1、扇区1上,求逻辑D盘上逻辑扇区为2757编号对应的物理地址是多少?
分析:根据上面的已知条件,我们可知C1=120, H1=1,S1=1,NS=17,NH=4,Ls=2757,则将这些数据代入上面的公式可得:
C=((2757 div 17)div 4)+120=160
H=((2757 div 17)mod 4)+1=3
S=(2757 mod 17)+1=4
即逻辑扇区号Ls为2757的硬盘对应的物理地址为柱面号是160、磁头号是3和扇区号为4。
看过“ 逻辑地址如何转换成物理地址”
逻辑地址转换成物理地址
CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。
物理地址(physical address)
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。
虚拟内存(virtual memory)
这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;
之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问题讨论的关键。
有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。
——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是call A,而是call 0x0811111111 ,也就是说,函数A的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。
逻辑地址(logical address)
Intel为了兼容,将远古时代的段式内存管理方式保留了下来。逻辑地址指的是机器语言指令中,用来指定一个操作数或者是一条指令的地址。以上例,我们说的连接器为A分配的0x08111111这个地址就是逻辑地址。
——不过不好意思,这样说,好像又违背了Intel中段式管理中,对逻辑地址要求,“一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量],也就是说,上例中那个0x08111111,应该表示为[A的代码段标识符: 0x08111111],这样,才完整一些”
线性地址(linear address)或也叫虚拟地址(virtual address)
跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。
在早期的硬盘中,由于每个磁道的扇区数相等,外磁道的记录密度远低于内磁道,因此造成很多磁盘空间的浪费。为了解决这一问题,人们改用等密度结构,即外圈磁道的扇区比内圈磁道多。此种结构的硬盘不再具有实际的3D参数,寻址方式也改为以扇区为单位的线性寻址,这种寻址模式便是LBA(Logic Block Address, 逻辑块地址)。在这种模式下,硬盘的物理地址与逻辑地址的转换问题有一定必要性和复杂性,本文对此进行讨论,希望对感兴趣的读者有所帮助。
2 转换过程
所谓逻辑扇区是物理扇区的一组连续数字的编号,操作系统采用的一种扇区编号方式,其编号是从0开始到某个最大值方式排列,并连成一条线。使用逻辑扇区主要有以下两个优点:第一,逻辑扇区的概念使硬盘的读写操作脱离了柱面、磁头和扇区的硬件参数;第二,在硬盘中每一定数目的扇区组成了数据文件的最小单位—— 簇,在对一个具体的簇进行读写操作时,操作系统划分一个一维的逻辑扇区号要比使用三维物理扇区号简单的多,如果一个簇的扇区跨越在两个盘片,则使用“柱面、磁头和扇区”的表示方法就更加复杂了。那么硬盘的物理地址和逻辑地址是如何转换的呢?下面具体介绍其相互转换方法。
2.1 硬盘物理地址转换为逻辑地址
首先我们先来了解一下从C/H/S到LBA线性地址的转换规则。为了与使用C/H/S寻址的老软件兼容,于是在硬盘控制器内部安装了一个地址翻译器,它负责将C/H/S参数翻译成LBA地址。
同时,由于系统在写入数据时是按照从柱面到柱面的方式,当上一个柱面写满数据后才移动磁头到下一个柱面,而且是从柱面的第一个磁头的第一个扇区开始写入,从而使磁盘性能最优。那么在对物理扇区进行线性编址时,也是按照这种方式进行。即把第一柱面(0柱)第一磁头(0面)的第一扇区(1扇区)编为逻辑“0”扇区,把第一柱面(0柱)第一磁头(0面)的第二扇区(2扇区)编为逻辑“1”扇区,直至第一柱面(0柱)第一磁头(0面)的第63扇区(63扇区)编为逻辑“62”扇区,然后将磁头转到第一柱面(0柱)第二磁头(1面)的第一扇区(1扇区),接着上面其对应的逻辑编号为第“63”扇区,0柱面所有扇区编号完毕后才转到1柱面的0磁头1扇区,依次向下进行,直到将所有的扇区都编上号。我们需要注意的是,物理扇区C/H/S中的扇区编号是从“1”至“63”,而逻辑扇区LBA方式下扇区是从“0”开始编号,所有扇区编号按顺序进行。
在此转换过程中,我们必须要知道的物理量有:
C1—起始扇区的柱面号
H1—起始扇区的磁头号
S1—起始扇区的扇区号
NS—每磁道的扇区数
NH—硬盘每柱面磁道数
C、H、S表示硬盘当前的柱面号、磁头号和扇区号,则计算柱面C、磁头H、扇区S对应的相对逻辑扇区号RS的公式为:
逻辑扇区RS=NH×NS×(C-C1)+NS×(H-H1)+(S-S1),为验证此公式,下面我们来举个例子。
实例:已知有一个4磁头(硬盘每柱面的磁道数为4),每磁道有17个扇区的硬盘,其中有一个逻辑硬盘D:,它的第一个扇区在硬盘的柱面号为120,磁头号为1,扇区号为1的位置,则计算柱面号为160,磁头号为3,扇区号为6的逻辑扇区号RS是多少?
分析:
根据前面的说明,已知条件有:C1=120, H1=1, S1=1, NS=17, NH=4,C=160,H=3,S=6,则代入上面公式可得到逻辑扇区号RS=4×17×(160-120)+17×(3-1)+(6-1)=2759,即硬盘柱面号为160,磁头号为3,扇区号为6的逻辑扇区号为2759.