我们讲完了分段机制。接下来我们需要分析保护模式的第二种存储
管理机制:分页方式。
- z* S6 ^: }# H在前面我们提到过转台和控制寄存器组。他们包括EFLAGS、ELP。和4个32位的控制寄存器CROCR1CR2CER3。其中CRO中有一位PE用于标志是使用保护模式还是实模式的。有一位PG定义是否使用分页方式(1或0)。
5 O+ v) v: M- G! k. l7 `1 ] b[color=#FFFFFF']
1 F, |/ Z$ b4 |7 @* `. m% y
& ?+ f$ n6 d" U" U* ~当PG=1时,
系统使用分页机制。80386使用大小位4K的页,并且每一个页的边界队奇。即每一个页的起始位置都可以被4K整除。这样4G的字节就被分成了1M页。分页机制把线性页映射成
物理页。真正的起到了转换作用
. {/ D h+ [% r+ A+ z0 B; @
下面我们看一下LINUXE得分页
结构:
5 x& S' F, {5 S1.多级页表结构
5 j8 \$ S8 F1 Y3 z# }: c在LINUX中含有1M个页。其中每个页表占4个字节。则需要占用4M的连续
内存因此LINUX引入了2级页表结构。在线性地址中的后10位(22-32)定义了二级页表。
; ^- Z' @$ K8 v" R! q$ i
二级页表有1K个字节,页正好存在]一个4K的页中。并且通过前20位进行索引,从而实现实际的物理地址。
5 U4 C* K$ h1 m% ?; [
这个地方我说不太清楚。大致可以这样理解。
6 k$ B- [: U2 B- \* C
如:有N个链表。每一个便是一页。可最后一页的内容是指向另一个二级炼表的指针(或者是索引项)
+ Q; d3 z( `+ [" x* b1 @2,页面项和页目录项
' @9 ~9 H' O; X* B% k) ^对于每一个页。都会存在一个页面项。用来表示该页的使用状况,是否空闲。是否在内存中等等。而这些相会存储成一个连标。以减少使用表时的查询
时间等。
+ O( F0 E0 @2 S) K而每一个页表,会存在1024个页面项,这才是真正的“页“。
% J- V! E. \3 f, v B/ l3,线性地址到物理地址的切换
: ~/ f+ a' S4 ] s& n) O1 G: i/ \$ Q; _
CR包含页目录的起始地址,用32位地址中的31-22位的内容作页目录的页目录项的索引,于CR3种的页目录的起始地址相加。得到相应页表的地址
" F. @. K; w9 Z从指定的地址中取出32位页目录项。它的提12位是0用这32位地址中21-12位作为页表中的页面的索引。将它乘以4和页表的起始地址相加,得到32位地址
7 W' Y5 f8 _% j- m3 K5 ?6 |4 g
奖11-0位作为相对一页面地址的偏移量,于32位页面地址相加。形成32位的物理地址。
7 \7 o+ A/ e" k3 Q; P2 m, C( C
1 i* ~/ J4 |: W$ V7 c& p% u
4,页面CACHE
1 b- h+ ^9 r$ v
[color=#FFFFFF']
/ S; C% Q3 K' f
( V2 _/ Z. Y( o
当然,系统频繁的访问二级页表,会造成很大的时间浪费,因此引入了页表CACHE,用来保存最近使用的页面,或者频繁使用的页面,关于CACHE的原理这里不再详细讲解,有兴趣的朋友可以查一些,
计算机专业的基础教材
3 E: w: G, e2 F
[color=#FFFFFF']
- _. g3 J/ x7 F4 x1 c+ P9 U& T$ \# s& E, g
至此,LINUX使用的836保护模式,基本上讲解完毕。至于控制转移和任务切换。和一般的汇编
编程差不多少,本人汇编水平太低。不在献丑
# p+ m( T* I. y2 q4 W9 r
[color=#FFFFFF']
0 A( p7 E3 h% B& ?4 _# c# o2 P. a+ r7 q+ a( [
总的说来,多任务的切换,以及保护模式的应用。虚拟存储系统的实现,是建立在
硬件的
技术支持之上的。
& O( v. ]# Z$ n* z& e; e: C# R个人认为,LINUX的存储管理。在不同的
机器上是完全不同的,至于linux是否为他们提供了统一的接口。我还不太清楚。可以参见其他机型的源码
, d- V' q6 F% ` |0 f; ]0 l! e
[color=#FFFFFF']