Linux使用的是4KB的内存页面大小(CPU有4KB或者4MB两种设置)。实际的物理内存被划分成一个一个4KB的内存页帧,每一个页帧在内存中都对应有相应的一个32字节大小的page struct。在Linux看来,一个page struct实际上就代表了一个实际的物理页帧。每个有效的(mapped)线性地址都映射到一个相应的page struct上。但是内核的线性地址空间只有1GB,而真正的物理地址可以大到4GB,所以没有办法做到线性地址和实际的物理地址的一一对应。所以在内核的1GB线性地址空间中有一部分(896MB, Low Memory)是直接映射到物理地址上的,也就是说从0xc0000000到0xffffffff-128M的内核空间,但是物理内存被映射后不一定被分配,如果没有被内核分配,则可以由用户进程分配,该页同时被内核与用户映射。
内核线性空间还剩下128MB (内核虚拟地址)提供给映射896MB以上的内存(High Memory)之用。内核通过三种不同的办法将896MB以上的物理内存映射到这128MB的线性地址空间中(permanent kernel mapping, temporary kernel mapping, and noncontiguous memory allocation),具体的实现方法可以参考ULK3的第八章。
补充:内核给自己分配的地址空间是0xc0000000到0xffffffff,共1G空间,映射到物理内存中是1G,大于1G的地址内核是访问不到的,用户空间的映射是二级映射,所以是可以访问到的。
jawanli 于 2009-08-17 20:22:27发表:
温故!
js001sdx 于 2009-08-11 17:31:59发表:
学习