内存管理与“三地址”的千丝万缕(1)

内存管理与“三地址”的千丝万缕(1)

  前记:我先谈一下一点很深的体会:你有时候会为某个知识点在那绞尽脑汁地想解决,但是我通过这阶段的学习知道,有时候想不通一个问题,也许是自己的知识积累不够造成的,所以这时请你不要急躁,迷茫。请你静下心来好好再把这个问题涉及的知识点看看,多找点书看,当你能够融会贯通的时候,你便能轻而易举地解决掉它了,不管你信不信,反正我是信了!祝有志于在嵌入式方面一展宏图的你能够事事顺心!

 

   开始我声明几点:

① 、这里的cpu都是以pentium32位)或是808620位)为例子的,内存管理则指的是arm9pentium

② 、由于知识所限,所提到的内容是自己的理解,所以很有可能会有错误,请大家指正。

③ 、我们先了解几个在linux或是arm中遇到的重要概念,这对于读内核或是熟悉arm的硬件架构很有好处。

A、字节对齐。16位的cpu其地址总线有20根,所以其最大寻址为1MB,也就是说此时的内部存储器(内存,不要告诉我说不知道内存是指什么啊)最大只能是1MB,大了cpu找不到其他的空间(这在当时,也就是1978年,1MB已经是很大了)。其地址范围应该是从0x00000~0xfffff(注意了,这便是传说中的物理地址了)!Intel是这样组织内存的:整个内存由两个512KB的存储体组成,一个为奇地址存储体(就是地址的最低位必须为1的存储空间),另外一个当然是偶地址存储体了(这个定义大家想必也能知道吧,这就叫举一反三),具体见图1

    这样16位的cpu对存储器的访问就有按字节访问与按字访问。其中nBHE(知道n的意思吧?那是指低电平有效,这在arm的管脚图中随处可见)和A0来选择是否对奇/偶存储体操作。详细见表1。所以按字访问时就有对齐和非对齐两种方式,字的对齐方式要求起始地址为偶地址,比如要访问的地址为0x00010,那么用一个总线周期就可以往该地址写进或读出D0~D15的数据了。但是字的非对齐方式却是这样的:访问的地址为0x00011,那么第一个总线周期将往奇地址存储体操作(读或写)一个字节,等另一个总线周期才往0x00012操作高八位数据。所以这样就浪费了时间,因此编程时尽量用偶地址访问!!

物理地址、线性地址、虚拟地址与内存管理(第一部分)

1:16位的cpu内存组织形式

A0

nBHE

操作方式

0

1

按字节访问偶地址存储体,数据在D0~D7传输

1

0

按字节访问奇地址存储体,数据在D8~D15传输

0

0

按字访问奇偶存储体,数据在D0~D15传输

1

1

不能访问任何存储体

表1A0nBHE的搭配方式

 下面讲的是32位的cpu的内存组织,其他我就不再详细讲解了,和16位的类似,只不过地址线成了32根,其内存组织形式见图2:总共有4个存储体,可以组成双字的形式,32位存储体要满足对8位、16位、32位各种规格的数据访问。同样,这也有字对齐与非对齐的方式,另外增加了双字对齐的,那就是要求起始地址是4的倍数(比如0Xxxxxx100),如果用奇地址进行字访问,或不是用4的倍数的地址进行双字访问,就会造成非对齐状态,这时需要2个总线周期完成字的传输或双字传输。比如要访问地址0x0000 0006的双字,cpu认为此双字在6789这四个存储单元中,在传输时cpu会用第一个总线周期访问67存储体,再用一个总线周期访问89存储体。这同样浪费了时间,不可取!!以上就是字与双字对齐的解析,不知你明白了吗?

物理地址、线性地址、虚拟地址与内存管理(第一部分)

232cpu的内存组织形式(自己做的,有点粗糙,情大家谅解)

 B、逻辑地址:或称虚拟地址,这时程序员所看到的地址,也就是你编程时写的地址(这下知道了吧,原来自己经常写的地址竟然是虚的,没错!),注意!记住前提条件是在cpu的保护模式或是arm具有MMU并使用段与页机制的情况下。

C、线性地址:是在虚拟地址与物理地址之间的中间产物。说得具体点吧,拿个例子,有表达式x=2*y,而y=3*z,这里的x是指虚拟地址,y指的是线性地址,z是物理地址了,通过线性地址才有可能转换为物理地址。(上面拿个例子只是例子,并不代表什么,因为当没有页机制时,物理地址就等于线性地址)。

D、物理地址:物理存储器(通常指的是所说的内存)指由地址总线直接访问的存储空间,其地址就是物理地址。显然,地址总线的位数决定了物理存储器的最大容量。(请注意标大字体的“直接”两字,这就区别了外存与内存的区别了)

E、缺页中断机制:对于linux来讲,当进程需要执行的程序代码超出已经载入的代码范围时,linux就加载4KB的后续代码,不需要的代码就暂时不加载,这个工作由do_no_page函数调用bread_page函数完成。在第一次执行shell程序时就用到了这个机制。(因为shell是被动加载的)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值