物理地址和逻辑地址

浅谈物理地址、虚拟地址和逻辑地址 从最根本的角度来看,地址只分为两类:物理地址、虚拟地址。  1、物理地址 CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬 阅读详情
物理地址和逻辑地址

  物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。

  逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

 

  2、连续内存分配方案:

  内存必须容纳操作系统和各种用户进程,因此必须尽可能有效得分配内存,在分配内存过程中,通常需要将多个进程放入内存中,前面提到过,我们需要每个进程的空间相互独立,而且我们必须保护每个进程的内存空间的独立性,如果不同的进程间需要通信,可以按照我们前面提到的通信方法进行通信,但是在此时,我们考虑内存空间独立性的实现。这就涉及到内存分配:

  我们将整个内存区域多个固定大小的分区,每个分区容纳一个进程,当一个分区空闲时,可以将内存调入内存,等待执行,这是最简单的内存分配方案,但是这种方案存在很多问题,我们并不知道每个进程需要多大的空间,如果空间过小,那么我们的进程就存不下,如果进程都很小,但是我们分区很大的话,那么会造成很大程度的浪费,这些在每个分区未被利用的空间,我们称之为碎片。

  3、分页内存管理方案

  (1) 分页的最大作用就在于:使得进程的物理地址空间可以是非连续的。

  物理内存被划分为一小块一小块,每块被称为帧(Frame)。分配内存时,帧是分配时的最小单位,最少也要给一帧。在逻辑内存中,与帧对应的概念就是页(Page)。

  逻辑地址的表示方式是:前部分是页码后部分是页偏移。

  例如,已知逻辑空间地址为2^m个字节(也就是说逻辑地址的长度是m位),已知页大小是2^n字节。那么一共可以有2^(m-n)个页。因此页码部分会占m-n位,之后的n位,用来存储页偏移。

  举个例子, 页大小为4B,而逻辑内存为32B(8页),逻辑地址0的页号为0,页号0对应帧5,因此逻辑地址映射为物理地址5*4+0=20。逻辑地址3映射物理地址5*4+3=23。逻辑地址13(4*3+1,页号为3,偏移为1,因此帧号为2),映射到物理地址9。

  采用分页技术不会产生外部碎片(内存都被划分为帧),但可能产生内部碎片(帧已经是最小单元,因此帧内部可能有空间没有用到),按概率计算下来,每个进程平均可有半个帧大小的内部碎片。

  (2) 页表的硬件实现

  上一小节中写到页表是逻辑地址转化到物理地址的关键所在。那么页表如何存储?

  每个操作系统都有自己的方法来保存页表。绝大多数都会为每个进程分配一个页表。现在由于页表都比较大,所以放在内存中(以往是放在一组专用寄存器里),其指针存在进程控制块(PCB)里,当进程被调度程序选中投入运行时,系统将其页表指针从进程控制块中取出并送入用户寄存器中。随后可以根据此首地址访问页表。

  页表的存储方式是TLB(Translation look-aside buffer, 转换表缓冲区)+内存。TLB实际上是一组硬件缓冲所关联的快速内存。若没有TLB,操作系统需要两次内存访问来完成逻辑地址到物理地址的转换,访问页表算一次,在页表中查找算一次。TBL中存储页表中的一小部分条目,条目以键值对方式存储。

  (3) 页表的数据结构

  1)层次化分页

  现有的笔记本电脑,内存地址空间一般为2^32字节以上。对于具有32位逻辑地址空间的计算机系统,如果系统的页大小为4KB(2^12B),那么页表可以拥有2^(32-12)个,也就是一百多万个条目,假设每个条目占有4B,那每个进程都需要4MB的物理地址空间来存放页表本身。而且,页表本身需要分配在连续内存中。

为此,Hierarchical Paging(层次化分页)被提出,实际上就是将页号分为两部分,第一部分作为索引,第二部分作为页号的偏移。

  以一个4kb页大小的32位系统为例。一个逻辑地址被分为20位的页码和12位的页偏移。因为要对页表进行再分页,所以该页号可分为10位的页码和10位的页偏移。这样一个逻辑地址就表示如下形式:

 

地址转换过程如下:

 

  地址由外向内转换,因此此方法也被称为forward-mapped page table(向前映射表)。

  2)Hashed Page Tables 哈希页表

  处理超过32位地址空间的常用方法是使用hashed page table(哈希页表),并以虚拟页码作为哈希值。哈希页表的每一条目都包括一个链表的元素,这些元素哈希成同一位置。每个元素有三个域:虚拟页码,所映射的帧号,指向链表中下一个元素的指针。

  个人看来,哈希页表的地址转换方式,实际上是Chaining(链接)方式,也就是一种哈希函数的溢出处理方式(另一种溢出处理方式叫做Open Addressing,开放寻址),具体过程如下:

  逻辑地址需要大于32bit的地址空间来表示,但是操作系统仍只有32bit来表示地址。此时人们便想到虚拟页地址,虚拟地址可以在32bit表示范围之内,然后利用哈希函数完成逻辑地址到虚拟地址的映射,由于虚拟地址更少,哈希函数会出现溢出,这里使用Chaining来解决溢出。

  逻辑地址中的页号(下图中的p)经过哈希函数的计算,算出虚拟地址中的页号,根据虚拟页号可以在哈希表中查找,用p与链表中的每一个元素的第一个域相比较。如果匹配,那么相应的帧号就用来形成物理地址。如果不匹配,就对链表中的下一个节点进行比较,以寻找一个匹配的页号。为什么要存在下一个元素的指针呢??就是因为哈希函数用开放地址法处理碰撞。

  3)反向页表

  在分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中通常允许一个进程的逻辑地址空间非常大,因此就有很多页表项,从而占用很多的内存空间。为了减少页表占用的内存空间而引入了反向页表(Inverted Page Table)。一般页表的表项是按页号进行排序,页表项中的内容是物理块号。而反向页表是为每一个物理块设置一个页表项并将按物理块号排序,其中的内容则是页号及其隶属进程的标志符。

 

  在利用反向页表进行地址变换时,是用进程标志符和页号去检索反向页表;若检索完整个页表都未找到与之匹配的页表项,表明此页此时尚未调入内存,对于具有请求调页功能的存储器系统应产生请求调页中断,若无此功能则表示地址出错;如果检索到与之匹配的表项,则该表项的序号i便是该页所在的物理块号,将该块号与页内地址一起构成物理地址。

  虽然反向页表可以有效地减少页表占用的内存,然而该表中却只包含已经调入内存的页面,并未包含那些未调入内存的各个进程的页面,因而必须为每个进程建立一个外部页表(External Page Table),该页表与传统页表一样,当所访问的页面在内存时并不访问这些页表,只是当不在主存时才使用这些页表。该页表中包含了页面在外存的物理位置,通过该页表可将所需要的页面调入内存。

 

  4、分段内存管理方案

  采用分页内存管理有一个不可避免的问题:用户视角的内存和实际内存的分离。设想一段main函数代码,里面包含Sqrt函数的调用。按照编写者的理解,这段代码运行时,操作系统应该分配内存给:符号表(编译时使用),栈(存放局部变量与函数参数值),Sqrt代码段,主函数代码段等。这样,编写者就可以方便地指出:"函数sqrt内存模块的第五条指令",来定位一个元素。而实际上,由于采用分页的管理方式,所有的一切都只是散落在物理内存中的各个帧上,并不是以编写者的理解来划分模块。

  分段的内存管理方式可以支持这种思路。逻辑地址空间由一组段组成。每个段都有名字和长度。地址指定了段名称和段内偏移。因此用户通过两个量来指定地址:段名称和偏移。段是编号的,通过段号而非段名称来引用。因此逻辑地址由有序对构成:

 <segment-number,offset>(<段号s, 段内偏移d>)

段偏移d因该在0和段界限之间,如果合法,那么就与基地址相加而得到所需字节在物理内存中的地址。因此段表是一组基地址和界限寄存器对。

 

  例如下图,有5个段,编号0~4,例如段2为400B开始于位置4300,对段2第53字节的引用映射成位置4300+53=4353。而段0字节1222的引用则会触发地址错误,因为该段的仅为1000B长(界限为1000)。

  本文部分内容参考http://blog.youkuaiyun.com/u010953266/article/details/42774117和http://blog.youkuaiyun.com/cn_wk/article/details/52736466

从零开始:手把手教你规划与部署华为FusionCompute虚拟化平台(含网络规划避坑指南) 本文详细介绍了华为FusionCompute虚拟化平台的规划与部署流程,特别针对网络规划中的常见问题提供了避坑指南。从硬件软件清单检查、网络平面配置到VRM部署方案选择,帮助用户高效完成部署并优化性能,适用于云计算环境中的虚拟化平台搭建。 阅读详情

相关推荐

Windows10完美驱动Apple Studio Display全攻略:从雷电转接到亮度调节(附N卡兼容列表)

本文详细介绍了在Windows10系统下如何完美驱动Apple Studio Display显示器,包括雷电接口转接方案、BootCamp驱动安装及NVIDIA显卡兼容性测试。特别推荐GTX 1660 Super等显卡,提供5K@60Hz稳定输出,并分享色彩管理及日常使用技巧,帮助用户充分发挥这款苹果显示器的性能。

weixin_29284657的博客 1089

【自考】逻辑地址与物理地址

前言:       最近在准备《操作系统概论》的考试,其中有一个知识点比较重要,考题中也多次出现,让我们好好总结一下~  一、逻辑地址       逻辑地址(LogicalAddress)是指由程序产生的与段相关的偏移地址部分。页式存储器的逻辑地址由两部分组成:页号和页内地址。其格式为:页号页内地址       地址结构确定了主存储器的分块的大小,也就决定了页面的大小。       地址总长度位数...

心似烟火 2万+

【WILEY】从Revision到Online:逐层拆解投稿状态更新与关键文件提交实战

本文详细解析了学术论文从返修到在线发表的全过程,重点拆解了投稿系统状态更新背后的含义与应对策略。文章提供了返修稿与回复信的准备技巧、关键补充文件(如图文摘要)的提交要点,并分享了校对校样与处理出版协议的实战经验,帮助作者高效、专业地完成发表流程。

weixin_29209805的博客 713

逻辑地址和物理地址

逻辑地址(Logical Address)和物理地址(Physical Address)是计算机内存管理中的两个重要概念。逻辑地址:是指程序在运行过程中使用的地址,也称为虚拟地址(Virtual Address)。它是由CPU生成的,用于访问内存中的数据。逻辑地址的大小和位数取决于处理器的架构和操作系统的设计,通常是一个定长的二进制数值。在执行指令时,CPU通过将逻辑地址转化为物理地址来获取数据。物理地址:是指内存中实际的地址,也称为实地址(Real Address)。

qq_45450889的博客 1万+

Mysql授权允许远程访问

前言 Mysql授权允许远程登录后,linux中安装的mysql可以与Navicat for Mysql(可视化)等连接,在可视化软件下管理数据库。 注意:不能使用临时密码 设置密码命令: alter user 'root'@'localhost' identified by '这里是你的密码'; 授权允许远程访问 一、授权命令: grant all privileges on *.* to '...

🏆 前端领域优质创作者 3万+

CMOS图像传感器——工作原理

CMOS图像传感器的曝光与读出

沧海一升的博客 9459

逻辑地址与物理地址

源于牛客网七月场的一道题, 第一步:求逻辑地址的页号 = 3000/1024=2 (整除) 第二步:求页内偏移量 = 3000 % 1024 =952 (取余) 第三步:根据逻辑地址的页号查出物理地址的页框号/帧号: 如图所示,逻辑地址的第2页对应物理地址的第1块。 第五步:求出物理地址 = 1*1024 + 952 = 1976 ...

123木头人! 3214

【计算机视觉 | 目标检测】目标检测常用数据集及其介绍(十一)

【计算机视觉 | 目标检测】目标检测常用数据集及其介绍(十一)

wzk4869的博客 738

《操作系统》期末考试卷3

《操作系统》期末考试卷3

菜鸟-宇的个人博客 2392

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

【2DWT:2维离散小波变换(附Pytorch代码)】

图像信号具有非平稳特性,无法使用一种确定的数学模型来描述,而小波变换的多分辨率分析特性很好地解决了这个问题。小波变化的多分辨率特性使其既可以高效描述图像的平坦区域(低频信息、全局信息),也可以有效处理图像信号的局部突变(高频信息,即图像的边缘轮廓等部分)。小波变换在空域和频域同时具有良好的局部性,使其可以很好地聚焦到图像的任意细节。

NorthSmile的博客 1万+

逻辑地址和物理地址的相互转换

文章目录逻辑地址和物理地址的相互转换🐳基础概念🐳逻辑地址转换成物理地址🐳物理地址转换成逻辑地址 逻辑地址和物理地址的相互转换 注:本文只适用于做题,想更详细了解调度算法相关的知识可以参考这篇文章😄 👉操作系统学习笔记第四章存储管理 🐳基础概念 逻辑地址(Logical Address):在计算机体系结构中是指应用程序角度看到的内存单元(memory cell)、存储单元(storage element)、网络主机(network host)的地址,又叫相对地址。 是在网络层及以上使用的

热爱编程、热爱生活、热爱探索 5万+

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色。

非科班Java出身GISer的博客 400

操作系统中逻辑地址和物理地址的区别

击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达!本文是关于操作系统中逻辑地址和物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址。物理地址是内存的...

Bruce.yang的嵌入式之旅 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈逻辑地址和物理地址

在程序运行时由中央处理单元生成的内容的地址称为逻辑地址。该地址也称为虚拟地址。当我们谈论逻辑地址时,我们指的是CPU分配给每个进程的地址,一个进程在内存中所处的实际地址与进程认为它所处的地址是不一样的。 每当 CPU 运行一个进程时,它都会为该进程分配一个特定的内存。此分配的内存空间位于 CPU 为进程生成逻辑地址。 在生成逻辑地址时,CPU 生成一个地址,程序将基地址与 CPU 生成的地址相加得到 逻辑地址 = 基地址 + CPU 生成地址 物理地址是进程及其内容放置在主内存或硬盘中的地址

weixin_52148070的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

逻辑地址和物理地址的区别

    根据我的理解,逻辑地址属于相对地址,其作用是寻找直接地址的存放处,而物理地址则直接指向存储器中的数据。    例题如下:e.g 设有8页的逻辑空间,每页有1024B,他们被映射到32块的物理存储区中,那么按字节编址逻辑地址的有效位是(    ),物理地址至少为(    )位。A. 10,12B. 10,15C. 13,15D. 13,12解答:        用位来表达逻辑地址,即相对地址...

weixin_38016885的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

逻辑地址 和 物理地址

项目逻辑地址(虚拟地址)物理地址谁生成CPU 在运行时操作系统 + MMU 映射得到谁使用程序员 / 编程语言内存控制器 / 硬件访问是否连续对程序员是连续的实际可能是分散的是否受保护是,操作系统隔离不同进程否,直接访问物理硬件。

刘皇叔说Java的博客 1049

逻辑地址和物理地址转换

在操作系统的学习中,很多抵挡都会涉及虚拟地址转换为物理地址的计算,本篇就简单介绍一下在分页存储管理、分段存储管理、磁盘存储管理中涉及的地址转换问题。

请你喝杯Java 4673

介绍一下逻辑地址和物理地址

我们编程一般只和逻辑地址打交道,比如c语言指针里存储的数值就可以理解成内存里的一个地址,这个地址就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址是真实物理内存中地址,具体点来说就是内存地址寄存器中的地址,物理地址是内存单元真正的地址。 ...

qq_38197844的博客 2399

逻辑地址、线性地址和物理地址

逻辑地址、线性地址和物理地址

Haomione的博客 2901

物理地址与逻辑地址的区别和联系

逻辑地址是由段基址和偏移地址两部分组成,段基址和偏移地址都是16位的无符号数。物理地址由逻辑地址变换而来,程序涉及的是逻辑地址而不是物理地址,它不需要知道要产生的代码在存储器的具体位置,这样可以简化储存资源的动态管理。物理地址是20位,在1M字节储存空间里唯一识别每个字节单元的地址,范围从00000H到FFFFFH,CPU和储存器交换数据就是用这个物理地址。逻辑地址相当计算机给这个房子的编号,编号为1111. 这样便于计算机的查找。物理地址=逻辑地址X16+段内偏移地址。自己学习使用,不对的请指正。

wywjiayou的博客 2734

【计组自学笔记】逻辑地址和物理地址:定义、转换

存储单元的编号称为存储单元的地址。实模式下,每个存储单元分配一个惟一的20位二进制数(5位十六进制数)的存储器地址,称为物理地址。 将整个存储器地址分成许多逻辑段,每个逻辑段的容量最多为64 KB且段的首地址能被16整除。逻辑地址由16位二进制数(4位十六进制数)的段地址和偏移地址组成。 段首地址: 5位十六进制数中的末尾1位十六进制数为0的地址,即可作为段首地址段地址是指每一段的段首地址的高4位十六进制数,通常被保存在某个段寄存器中。 偏移地址: 在段内相对于段首地址的偏移值,也取4位十六进制数。 所以,

今天你学习了吗 7288
上一篇: 操作系统原理之内存(一)
下一篇: redisCommand
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值