对linux分页机制有了进一步的理解.

昨天在看fork()函数的时候..心中生一疑惑..linux是怎么把线性地址高十位用于寻找页目录项..而线性地址又是怎么对应于页目录项的,为什么每个进程产生的线性地址高十位就是对应的页目录项…..

今日.通过认真的把fork()深入的看下去了..终于明白了…线性地址是怎样对应于页目录项的……..

原来总以为,每个进程的页目录项是紧挨着的…..今天通过看fork()函数才明白…原来不是我认为的那么回事..

线性地址空间有32位,最大容量是4G…….以前的疑惑是为什么线性地址高十位能对应到页目录项………每个页表能映射4M的地址……页目录项最多为1024个…..以前总认为每个进程的页目录是紧挨着的..没有多余的…如下图

页目录项1023

…….

页目录项5

页目录项4

页目录项3

页目录项2

页目录项1

页目录项0

例如linux0.11内核中把进程0映射到16M的物理内存空间….占用四个页目录项(每个页目录项可以映射4M),那么进程1就直接从页目录项5开始分配………..我就纳闷了……为什么会这样?错了?还是对了?

今天发现我错了…..原来线性地址空间已经被分成相对于页目录来4M,相对于页表来4K的内存页……………..

页目录项1023

……..

………

页目录项16

页目录项15

页目录项14

页目录项13

页目录项12

页目录项11

页目录项10

页目录项

页目录项8

页目录项7

页目录项6

页目录项5

页目录项4

页目录项3

页目录项2

页目录项1

页目录项

linux0.11把进程0映射16M物理内存..需要4个页目录项….那么页目录项4—页目录15就会被标识为p=0,代表页表不存在..进程1使用页目录的时候就会从页目录16开始…..

举个例子.

进程1的起始线性地址是0x4000000   

写成32位二进制是    0000 0100 0000 0000 0000 0000 0000 0000

最高十位正好是0x10   对应于页目录项16....

终于搞懂了...呵呵..