❶ 通过虚拟地址计算物理地址 求过程
你打的太多了,有点乱,只说下地址转换问题:
1.虚拟地址:虚拟地址是以"段寄存器:偏移地址"形式存在的,例如--0542:24521360
2.线性地址:它是由分段部件把虚拟地址转化而来的.
3.物理地址:即真实存在的地址,由处理器的地址引脚寻找到的地址.
虚拟地址---->线性地址:
段寄存器是一个16位的寄存器,其中第0和1位控制着将要访问段的特权级,第2位说明是在gdt还是ldt寻找地址.高13位作为一个索引值,总共8192个索引.假设段寄存器-0000
0000
0000
1011(000b),那么我们可以知道rpl=3(特权级为3);ti=0,从gdt中选择段描述符;index=1,即将要索引的段描述符在gdt中的顺序号为1,由于一个段描述符占8个字节,所以其索引到的地址为"gdt的高32位+1*8".这也就是为什么gdt48位,留最低的16位作为限长的原因(8192*8=64k).
找到了段描述符,然后就是从段描述符中找出该段的位置了.段描述符是个8字节的内存空间,由于结构复杂,无法构图,省略段描述符的结构.我们只要知道在里面规定了该段的基址,限长,还有属性等等.找出基址后,再加上虚拟地址的偏址,就形成了32位的线性地址.由于偏址是32位的,所以该段独享4g的虚拟地址空间.
线性地址----->物理地址
该部分是由分页部件通过3级查找完成的.此时,我们把线性地址分为3段:0-11位(c)字节索引,12-21位(b)页表索引,22-31位(a)页目录索引.我们把页表描述符和页描述符通称为页表项,页表项占4个字节,总共占4kb大小.先以cr3为基址,以(a*4)为索引值,寻址页目录描述符.然后再以页目录地址的高20位地址为基址,以(b*4)为索引值,寻址页描述符.再以页描述符的高20位地址为基址,以c为偏移地址,相加得到物理地址.
从上可以看到页的大小是4kb,即一项任务cpu只调用该任务所占内存空间的4kb大小.有利于减少内存占用.
以上大体就是这样的,其中分页部件的转换相当复杂,不是三言两语就能说明白的.还有pentium之后,分页部件又采用了4mb的页面,线性地址采用2级寻址.才开启pae功能后,又形成了4级寻址.然后再结合后面的内存保护,i/o保护,任务保护及特权级的变换,形成了保护模式的大部分内容.
太复杂了,我也不是十分会.写的有些乱,但愿你能明白些.
❷ 逻辑地址如何转换成物理地址的
首先我们知道,逻辑地址=段地址:偏移地址
然后进行运算:段地址×16+偏移地址=物理地址(可以理解为段地址末尾补一个零)
举例:逻辑地址是1000H:1000H
那么物理地址为1000H×16+1000H=11000H
拓展知识:
逻辑地址和物理地址的区别是:
逻辑地址(LogicalAddress)是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
物理地址(PhysicalAddress)是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
❸ 线性地址转换为物理地址是硬件实现还是软件实现具体过程如何
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
❹ 简述计算机物理地址和逻辑地址的含义及其转换关系
逻辑地址: 机器语言指令,用于指定一个操作数或一条指令的地址
表示为[段标识符:段内偏移量]
偏移量:段开始的地方到实际地址之间的距离
线性地址:也称虚拟地址,32位,0x00000000—0xffffffff
物理地址:用于内存芯片级的单元寻址,与处理器和cpu连接的地址总线相对应(与实物内存相联系)
逻辑地址转换物理地址:
内存控制单元(MMU)通过分段单元把逻辑地址转换成线性地址;接着分页单元把线性地址转换成物理地址。
❺ 什么是线性地址和物理地址的区别是什么呢
386架构里,cpu可以处于实模式和保护模式。
实模式下,cpu指令访问的地址就是物理地址,形式为:段寄存器:偏移
在保护模式下,cpu可以使用分段机制和分页机制。
分段机制下使用的地址就是逻辑地址,形式为:段选择子:偏移
分页机制下使用的地址就是线性地址,形式为:0xXXXXXXXX
无论是逻辑地址还是线性地址,都要被cpu映射成物理地址。
保护模式下必须采用分段机制。在此基础上可采用分页机制。
逻辑地址被转化为线性地址,如果采用分页机制,则该线性地址通过分页机制被映射成物理地址。如果不采用分页机制,则该线性地址就是物理地址。
实模式下的物理地址只能访问1M以下空间,而保护模式下的物理地址可以访问所有32位空间。并且要注意,物理内存空间只是物理地址空间的一个部分而已。
另外还有一个”总线地址“的概念,是从总线设备的角度来说的。
在linux系统里,对cpu来说,物理内存的首地址是从线性地址的0xc0000000开始的。而对总线设备来说,物理内存的首地址可能是从总线地址0x00000000开始,也可能是从另外的总线地址开始,随系统而异。这也是为什么内核里经常有vir_to_phy
和vir_to_bus转换的缘故。
还有~~~
关于物理地址,线性地址和虚拟地址的区别,我只能凭我的理解简单说说,可能不准确。物理地址在什么时候都存在,但是在采用分页技术和虚拟内存技术后,你很难确定物理地址在那里,所以建议在实模式下采用物理地址和线性地址形式,这时候物理地址和线性地址其实是一致的。最常用的,比方说,计算机启动后的地址是0xfff0:0000,装载BIOS,然后转移到0x07C0:0000,所以总可以设置一个物理断点0x7C00,开始调试你的bootloader。
❻ 操作系统中地址转换可分为哪3中方式,比较这3中方式有什么不同
不知你这地址指的是IP地址还是存储器的地址
如果指的是网络的,那就是这样分:
NAT网络地址转换的3种实现方式:
1、静态NAT(一对一)
2、动态NAT(多对多)
3、端口多路复用PAT(多对一)
如是是操作系统的存储器管理,则是
(1)保护方式的地址转换:处理器内部的分段单元将逻辑地址转换为线性地址,再由分页单元将线性地址转换为物理地址,物理地址通过地址总线输出选择存储器芯片中的具体存储单元。
(2)实地址方式的地址转换:实地址方式采用实地址存储模型,注意其的主存空间只有1MB=220字节),仅使用地址总线的低20位,其物理地址范围为00000H~FFFFFH。
实地址存储模型也进行分段管理,但有两个限制:
•每个段最大为64KB •段只能开始于低4位地址全为0的物理地址处
实地址方式的段寄存器直接保存20位段基地址的高16位,段内的偏移地址也用16位表示。
这样将逻辑地址转换为物理地址的方法是:
将段寄存器中的数值左移二进制4位(十六进制一位),加上偏移地址就得到20位物理地址。
❼ 32位线性地址到物理地址的转换
线性地址高10位保存的是地址在页目录表中的索引,一个索引占四个字节,所以乘以四。
❽ 什么是线性地址,逻辑地址,虚拟地址,物理地址
逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。
线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。
物理地址(Physical Address) 是指出目前CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
虚拟内存(Virtual Memory)是指计算机呈现出要比实际拥有的内存大得多的内存量。因此他允许程式员编制并运行比实际系统拥有的内存大得多的程式。这使得许多大型项目也能够在具有有限内存资源的系统上实现。一个非常恰当的比喻是:你不必非常长的轨道就能让一列火车从上海开到北京。你只需要足够长的铁轨(比如说3公里)就能完成这个任务。采取的方法是把后面的铁轨即时铺到火车的前面,只要你的操作足够快并能满足需求,列车就能象在一条完整的轨道上运行。这也就是虚拟内存管理需要完成的任务。在Linux0.11内核中,给每个程式(进程)都划分了总容量为64MB的虚拟内存空间。因此程式的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为 虚拟地址。因为和虚拟内存空间的概念类似,逻辑地址也是和实际物理内存容量无关的。逻辑地址和物理地址的“差距”是0xC0000000,是由于虚拟地址->线性地址->物理地址映射正好差这个值。这个值是由操作系统指定的。机理 逻辑地址(或称为虚拟地址)到线性地址是由CPU的段机制自动转换的。如果没有开启分页管理,则线性地址就是物理地址。如果开启了分页管理,那么系统程式需要参和线性地址到物理地址的转换过程。具体是通过设置页目录表和页表项进行的。
❾ 80386cpu如何从线性地址得到物理地址
理解最简单的模型!任何复杂的设计方式、数据结构都是在这个基本的模型上改进的!
首先,80386可以工作在2种模式下,而这2种工作模式下的地址转换方式是不一样的。
地址的变换必须要有两个基本的条件:一是地址线,二是地址变换涉及的一些寄存器。首先386有32条地址线,也就是说原则上可以有2^32=4G的寻址空间;然后386还有如下寄存器组:
(1)EAX~EDX、ESP、EBP、ESI、EDI这样一组32位的通用寄存器,
(2)有32位的EIP指令指针寄存器,
(3)有CS、SS、DS、ES、FS、GS这样一组16位的段寄存器,并有各自相应的64位段描述符寄存器与之对应,但是段描述符寄存器是硬件自动设置的
(4)系统地址寄存器GDTR、IDTR,它们都是48位的
(5)CR0~CR3,控制寄存器;CR3有重要的作用
1、实模式
当CPU加电或是复位时,CPU就进入了实模式。
在实模式下,A20~A31总是低电平,所以此时386只有2^20=1M的寻址空间;16位的段寄存器左移4位以后,加上16位的偏移地址(高16位固定),这样就刚好得到了20位的物理地址!
这里需要注意两点:一是16位的段地址寄存器通过硬件机制传“传递给”相应的32位的段基址,然后段基址硬性的将20~31置0,并将16位地址左移4位;二是作为偏移地址的32位寄存器只用了低16位,高16位全部置0,然后相加即可得到相应的物理地址;
2、保护模式
在保护模式下,地址变换无非也就是查表、线性相加等方式——归根到底,地址的变换一定是通过硬件机制完成的。
首先,CPU内部会初始化一个很重要的48位系统地址寄存器GDTR/LDTR/IDTR,以全局描述符寄存器GDTR为例:
GDTR线性基地址段限属性
根据这个线性的基地址,硬件可以找到描述符表的位置;然后段寄存器——现在被称作段选择符的高13位作为这个描述符表的偏移地址,找到里面一个相应的描述符,并将这个描述符装载入描述符寄存器中,这样就得到了相应的段基址;
描述符寄存器中的32位的段基址和32位偏移地址相加,即可以得到一个32位的地址,这个地址称之为线性地址。接下来有两种情况:
(1)如果分页机制被禁止,这个地址就是物理地址了!
(2)采用分页机制。此时32位的线性地址分为3个部分,
(10位)页目录索引(10位)页表索引(12位)偏移地址
首先高10位的页目录索引部分和CR3寄存器(它存放着页目录地址)结合,找到相应的页表的地址;然后根据中间的10位的页表索引,找到相应的页的起始位置;然后,根据低12位的偏移地址,在这个页中就可以找到对应的地址了——而这就是物理地址!
❿ 80386微处理器逻辑地址到物理地址的转换过程
逻辑地址(logical address)
包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80x86着名的分段结构
中表现得尤为具体,它促使MSDOS
或windows程序员把程序分成若干段。每一个逻辑地址都由一个段
(segment)和偏移量(offset 或 displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距
离。
线性地址(linear address)(也称虚拟地址 virtual address)
是一个32位无符号整数,可以用来表示高达4GB的地址,也就是,高达4 294 967 296个存储器单元。
线性地址通常用16进制数字表示,值的范围从0x00000000 到 0xffffffff。
物理地址(physical address)
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理
地址由32位或36位无符号整数表示。
内存控制单元(MMU)通过一种称为分段单元(segmentation unit)的硬件电路把一个逻辑地址转换成线性
地址;接着,第二个称为分页单元(paging unit)的硬件电路把线性地址转换成一个物理地址