内存管理与“三地址”的千丝万缕(1)
① 、这里的cpu都是以pentium(32位)或是8086(20位)为例子的,内存管理则指的是arm9或pentium
② 、由于知识所限,所提到的内容是自己的理解,所以很有可能会有错误,请大家指正。
③ 、我们先了解几个在linux或是arm中遇到的重要概念,这对于读内核或是熟悉arm的硬件架构很有好处。
A、字节对齐。16位的cpu其地址总线有20根,所以其最大寻址为1MB,也就是说此时的内部存储器(内存,不要告诉我说不知道内存是指什么啊)最大只能是1MB,大了cpu找不到其他的空间(这在当时,也就是1978年,1MB已经是很大了)。其地址范围应该是从0x00000~0xfffff(注意了,这便是传说中的物理地址了)!Intel是这样组织内存的:整个内存由两个512KB的存储体组成,一个为奇地址存储体(就是地址的最低位必须为1的存储空间),另外一个当然是偶地址存储体了(这个定义大家想必也能知道吧,这就叫举一反三),具体见图1。
图1:16位的cpu内存组织形式
A0 | nBHE | 操作方式 |
0 | 1 | 按字节访问偶地址存储体,数据在D0~D7传输 |
1 | 0 | 按字节访问奇地址存储体,数据在D8~D15传输 |
0 | 0 | 按字访问奇偶存储体,数据在D0~D15传输 |
1 | 1 | 不能访问任何存储体 |
表1:A0与nBHE的搭配方式
图2:32位cpu的内存组织形式(自己做的,有点粗糙,情大家谅解)
C、线性地址:是在虚拟地址与物理地址之间的中间产物。说得具体点吧,拿个例子,有表达式x=2*y,而y=3*z,这里的x是指虚拟地址,y指的是线性地址,z是物理地址了,通过线性地址才有可能转换为物理地址。(上面拿个例子只是例子,并不代表什么,因为当没有页机制时,物理地址就等于线性地址)。
D、物理地址:物理存储器(通常指的是所说的内存)指由地址总线直接访问的存储空间,其地址就是物理地址。显然,地址总线的位数决定了物理存储器的最大容量。(请注意标大字体的“直接”两字,这就区别了外存与内存的区别了)
E、缺页中断机制:对于linux来讲,当进程需要执行的程序代码超出已经载入的代码范围时,linux就加载4KB的后续代码,不需要的代码就暂时不加载,这个工作由do_no_page函数调用bread_page函数完成。在第一次执行shell程序时就用到了这个机制。(因为shell是被动加载的)