同学你好,我觉得你没把处理器的分页机制弄清楚。
说我的拙见啊,32bit, pgd-pmd-pte 按10bit-10bit-10bit切开
pgd/pmd/pte是不是各占1024项,
pgd (1)
+-----+
| | 0 每个pgd 覆盖4M的地址映射
+-----+
| | 1
+-----+ pmd (2)
| | x ----> +------+
+-----+ | | 0 每个pmd负责4k的地址映射
| | 1023 +------+
+-----+ | | 1
+------+ pte(3)
| | y ----------> +------+
+------+ | | 0
| | 1023 +------+
+------+ | | 1
+------+
| | z每个pte指向具体映射到哪个物理页
+------+
| | 1023
+------+
要存放1024个pgd/pmd/pte表项需要3个page,也就是pgd,pmd,pte各需要4kB的空间。
你贴的代码是如何初始化x这个地方值,显而易见如果不需要pmd/pte再细分映射,在pgd这一级一次建立4M的huge page映射关系,那么是不是就只需写pgd就可以了。
ps 你贴的代码注释不是也将的很明白了吗?
pmd = one_md_table_init(pgd); /*返回pgd*/
phys_addr += PTRS_PER_PTE * PAGE_SIZE; /* 0x400000 */ 物理地址是按照4M单位映射的
【 在 mousestuman 的大作中提到: 】
: pgd = swapper_pg_dir + pgd_index(PAGE_OFFSET); /* 768 */
: phys_addr = 0x00000000;
: while (phys_addr
: ...................