❶ 简述计算机物理地址和逻辑地址的含义及其转换关系
逻辑地址: 机器语言指令,用于指定一个操作数或一条指令的地址
表示为[段标识符:段内偏移量]
偏移量:段开始的地方到实际地址之间的距离
线性地址:也称虚拟地址,32位,0x00000000—0xffffffff
物理地址:用于内存芯片级的单元寻址,与处理器和cpu连接的地址总线相对应(与实物内存相联系)
逻辑地址转换物理地址:
内存控制单元(MMU)通过分段单元把逻辑地址转换成线性地址;接着分页单元把线性地址转换成物理地址。
❷ 虚拟地址、逻辑地址、线性地址、物理地址
虚拟地址到物理地址的转化是体系结构相关的,一般由分段和分页两种方式。以X86CPU为例,分段和分页都是支持的。内存管理单元负责从虚拟地址到物理地址的转化。逻辑地址是段标识+段内偏移的形式。MMU通过查询段表,可以将逻辑地址转化为线性地址。无分页机制时,线性地址就是物理地址,有分页时,MMU还需要查询页表来将线性地址转化为物理地址:逻辑地址(段表)->线性地址(页表)->物理地址。
映射是一种多对一的关系,即不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映射到同一个物理地址上。而且,同一个线性地址在换页之后,可能被装载到另一个物理地址上,所以这种多对一的映射关系会随时间发生变化。
❸ 线性地址转换为物理地址是硬件实现还是软件实现具体过程如何
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
❹ 逻辑地址如何转换成物理地址的
首先我们知道,逻辑地址=段地址:偏移地址
然后进行运算:段地址×16+偏移地址=物理地址(可以理解为段地址末尾补一个零)
举例:逻辑地址是1000H:1000H
那么物理地址为1000H×16+1000H=11000H
拓展知识:
逻辑地址和物理地址的区别是:
逻辑地址(LogicalAddress)是指由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
物理地址(PhysicalAddress)是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。
❺ 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)的硬件电路把线性地址转换成一个物理地址
❻ 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位的偏移地址,在这个页中就可以找到对应的地址了——而这就是物理地址!
❼ 什么是线性地址和物理地址的区别是什么呢
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。
❽ 逻辑地址怎么转化为物理地址
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。
程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。他是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。
线性地址:
一个逻辑地址由两部份组成,段标识符和段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。这就是“段描述符(segment descriptor)”,段描述符具体地址描述了一个段(对于“段”这个字眼的理解:我们可以理解为把虚拟内存分为一个一个的段。
比如一个存储器有1024个字节,可以把它分成4段,每段有256个字节)。这样,很多个段描述符,就组了一个数组,叫“段描述符表”。
❾ 32位线性地址到物理地址的转换
线性地址高10位保存的是地址在页目录表中的索引,一个索引占四个字节,所以乘以四。