本学期Linux内核实验最后是打印内核页表,线性地址----物理地址
我看到这个实验题目的时候想到的就是这个init函数(因为这部分当时就是我讲的^_^),这个函数是初始化linux内核页表的,也就是将32位系统中3G以上的896M线性地址映射到物理地址的0-896M,在其调用者paging_init函数中还处理了其他的情况,比如固定映射之类的。那属于高端内存映射那一块的内容,目前我们先看一下如何将内核页表3G~3G+896M的线性地址对应的物理地址打印出来。
一下的源码是linux2.6.11版本的,应该是和白皮书上的是对应的版本
static void __initkernel_physical_mapping_init(pgd_t *pgd_base)
{
unsignedlong pfn;
pgd_t*pgd;
pmd_t*pmd;
pte_t*pte;
intpgd_idx, pmd_idx, pte_ofs;
/*因为内核的线性地址空间是从0xC0000000开始的,所以这里我们只需要初始化内核全局页目录从0x300开始的项*/
pgd_idx= pgd_index(PAGE_OFFSET); /*768*/
pgd= pgd_base + pgd_idx; /*pgd指向当前的目录项 */
pfn= 0; /*需要被映射的物理页框号,从物理地址0开始 */
/*初