逻辑地址、线性地址、物理地址以及虚拟存储器

http://blog.csdn.net/mrbuffoon/article/details/48947267

Note:本文是基于80×86微处理器进行原理总结。

在内存地址上,我们要区分逻辑地址、线性地址以及物理地址这三个概念。
逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址。每一个逻辑地址都由一个段选择符和段偏移量组成。
线性地址:也称为虚拟地址,也不是一个真实的地址,他是对应了硬件页式内存转换前地址。
物理地址:就是物理内存中的真正地址。

内存控制单元(MMU)通过分段单元的硬件电路把一个逻辑地址转换为线性地址,接着,分页单元的硬件电路把线性地址转换为物理地址。

逻辑地址->线性地址:
逻辑地址中有段选择符和段偏移量两部分,首先通过段选择符可以得到一个线性段基址,然后加上段偏移量就能得到线性地址。这样,逻辑地址转换为线性地址。
线性地址->物理地址:
抽象出来看,线性地址可以目录、页表、偏移量三部分字段,通过页目录表和页表这两种转换表,可以将线性地址转换为物理地址。线性地址中的目录字段指明所要访问的内存处于页目录表中的哪一个页目录表项,由页目录表项中的内容可以知道要访问的内存在哪一个页表中;线性地址中的页表字段指明了所要访问的内存处于已经查到的页表中的哪一个页表项,由页表项中的内容可以知道要访问的内存在哪一页中;线性地址中的偏移量字段指明了所要访问的内存处于已经查到的页中的具体偏移位置,这个位置上就记录着对应的真正的物理地址。这样,线性地址就转换为了物理地址。

虚拟存储器:
现在机器都会有虚拟存储器这种机制,主要是用来解决机器实际内存不足的问题。计算机系统的内存主要由半导体存储器组成,由于工艺和成本的原因,内存的容量受到限制。然而,计算机系统软件和应用软件的功能不断增强,程序规模迅速扩大,要求内存的容量越大越好,这就产生了矛盾。为了给大的程序提供方便,使它们摆脱内存容量的限制,可以由操作系统把内存和辅存这两级存储系统管理起来,实现自动覆盖。也就是说,一个大作业在执行时,其一部分地址空间在内存,另一部分在辅存,当所访问的信息不在内存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入内存。从效果上来看,好像为用户提供了一个存储容量比实际内存大得多的存储器,用户无需考虑所编程序在内存中是否放得下或放在什么位置等问题。我们称这种存储器为虚拟存储器。
程序运行时,CPU以逻辑地址来访问内存,由辅助硬件找出逻辑地址和物理地址之间的对应关系,并判断这个逻辑地址对应的物理地址内容是否已装入内存。如果已在内存中,则CPU可直接访问内存的实际物理单元;如果不在内存中,则把包含这个字的一个存储块从外存调入内存后再由CPU访问。如果内存已满,则由替换算法从内存中将暂不运行的一块调回外存,再从外存调入新的一块到内存。

时间: 2024-10-12 05:43:37

逻辑地址、线性地址、物理地址以及虚拟存储器的相关文章

Linux下逻辑地址-线性地址-物理地址图解(转)

一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令: mov    0x80495b0, %eax 这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的基地址,才能构成线性地址.也就是说 0x80495b0 是当前任务的DS数据段内的偏移. 在x86保护模式下,段的信息(段基线性

虚拟地址 线性地址 物理地址 傻傻分不清楚?

Virtual address  Linear address  Physic address 先说说逻辑地址: 我们时常会看到一种地址的表述方式--segment:offset,比如0x0:0x7c2d 这里的地址表述方式是逻辑地址方式,在没有开启分段机制之前,物理地址的寻址通过这种方式. 注意,这种寻址方式非常短暂,一般boot.S里面一旦开启分段了,就不会有这种寻址方式了. 相关的,segment:offset的组织形式,历史上都是称作virtual address,虚拟地址.真正的物理地

逻辑地址 线性地址 转

http://blog.csdn.net/erazy0/article/details/6457626 一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序,用gcc编译,再反汇编后会看到以下指令: mov    0x80495b0, %eax 这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的基地址,才能构成线性地址.

[转帖]Linux下逻辑地址、线性地址、物理地址详细总结

Linux下逻辑地址.线性地址.物理地址详细总结 https://www.cnblogs.com/alantu2018/p/9002441.html 总结的挺好的 现在应该是段页式管理 使用MMU和TLB 实现 线性地址 逻辑地址 和物理地址的映射. 一.逻辑地址转线性地址    机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序,用gcc编译,再反编译后会看到以下指令:

linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 逻辑地址(Logical Address) 包含在机器语言指令中用来指定一个操作数或一条指令的地址(有点深奥).这种寻址方式在80x86著名的分段结构中表现得尤为具体,它促使windows程序员把程序分成若干段.每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离. 线性地址(

操作系统 内存地址(逻辑地址、线性地址、物理地址)概念

逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分.例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干.只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换):逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段.数据段如果完全一样).应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是

X86下逻辑地址、线性地址、虚拟地址和物理地址的理解

参考:http://bbs.chinaunix.net/thread-2083672-1-1.html 本贴涉及的硬件平台是X86,如果是其它平台,不保证能一一对号入座,但是举一反三,我想是完全可行的. 一.概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应. --这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,

linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换

linux内存管理---虚拟地址.逻辑地址.线性地址.物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址. 这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给进程.之所以这样冗余

逻辑地址、线性地址和物理地址的关系

http://blog.csdn.net/prike/article/details/52722934 物理内存:数据寻址用:mmu联系: 虚拟地址:cpu传给mmu的:给程序员使用: 逻辑地址:cpu指令使用:符合可执行文件的格式. 二.物理地址.虚拟地址(线性地址).逻辑地址 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围.这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围