硬件地址不连续的思考
Posted dongweihua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了硬件地址不连续的思考相关的知识,希望对你有一定的参考价值。
我们在看数据手册的寄存器列表时,会发现寄存器的地址不连续,例如每个寄存器空间是32bit , 寄存器A的地址是0x0 , B是0x4 ,C是0x8,···为什么间隔4呢?0x1 ,0x2等等难道没用?
数字电路设计工程师当然不会像些土豪,一下买四套房子,住一套,空三套,就算有钱也不会这么任性,因为代码都没写完,哪有空闲来打理这么多房子···
言归正传,例如0x1,0x2不是不存在,而是和0x0表示的地址相同···
解释之前先普及一下基础知识,cpu在寻址时是以字节为基本单位的,1字节等于8bit,就是一组8个0或1的特定组合。有人就会问为什么不以1bit或者16bit为基本单位呢?这是上世纪的前辈规定好的,就像你每次吃饭为什么不以一粒米为或者一碗为基本单位?不是饿就是吃饱了撑着···
回到问题,cpu 有个存放数据的RAM,每个单元能容纳8bit数据,现在cpu要向寄存器A写数据了,因为寄存器A的空间是32bit,因此cpu要调用四个单元,0x0,0x1,0x2,0x3,完成一次写操作。后来cpu为了省事,每次访问寄存器A只提醒0x0,后面的0x1,0x2,0x3知道要写32bit,也跟着0x0一起happy了。同样提醒0x4,后面的0x5,0x6,0x7也如影随形。
这样看来,0x0,0x4,0x8···地址分配并没有浪费空间,在cpu那边是连续的存储空间,到了寄存器这里0x0还是0x0,0x4相当于0x1,0x8相当于0x3,···每次给寄存器地址时都要除以4,来访问新的32bit的空间。抽象来讲,单个空间变大了,又不能改变原来的顺序,只好把新的单元的编号分隔大一点。如下图所示。
例如阿顺上街去买橘子看岳父岳母姐夫小舅子,一共买了32个,如果一个袋子装8个,共4个袋子,阿顺把4个袋子标号0~3(为什么不标号1~4,因为4个会溢出)。但是快到目的地得知只有岳父岳母在家,橘子又不能退,于是他把一个装着橘子的塑料袋放在另一个塑料袋里面。
于是阿顺提了编号为0和2的袋子进了门,给岳父岳母一人一份,并且告诉他们“”如果姐夫小舅子过来了,你们把里面的小袋子编号为0和3的给他们。”
岳父听完哈哈大笑,“来玩就直接来,家里又不缺水果,况且他们也不回来,还多买两个塑料袋”
本来是个要面子的人, 但听到这句话以后突然醍醐灌顶,觉得应该为环保事业做出贡献,于是他下次还是买32个橘子,两个塑料袋,编号0和2。
岳父看到塑料袋标号微微一愣 “小伙子有前途,连买水果都有数据位宽变大时地址数值变小的思想!”
以上是关于硬件地址不连续的思考的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )
Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )