日期:2014-05-16  浏览次数:20650 次

linux-3.2.36内核启动2-setup_arch中的内存初始化2(arm平台 分析建立页表)

又是一个国庆七天假,之前有很多打算

可是到最后,只有linux愿意陪我。


介绍pageing_init之前,我们了解几个定义

pte_t 页表项

pmd_t 页中间目录项

pud_t 页上级目录

pgd_t 页全局目录项

我的arm平台

#define PMD_SHIFT                21

#define PGDIR_SHIFT               21

 

下面这个函数paging_init每个平台实现不一样,我的根本就没有用PUD_SHIFT

arm最多用二级

void __init paging_init(struct machine_desc*mdesc)

{

       void *zero_page;

 

       memblock_set_current_limit(lowmem_limit);

       就是

       memblock.current_limit = limit;

lowmem_limit = bank->start + bank->size;高端内存初始化时记录的我的是0x34000000

 

        build_mem_type_table();这个函数很大,主要就是根据cpu类型记录内存信息,大的原因就是可虑了所以现有的arm类型

        printk("Memory policy: ECC%sabled, Data cache %s\n",

                ecc_mask ? "en" :"dis", cp->policy);

我的平台Memory policy: ECC disabled, Data cache writeback关闭ecc数据缓存为回写

       prepare_page_table();

我们看看准备什么

static inline void prepare_page_table(void)

{

        unsigned longaddr;

        phys_addr_t end;

 

        /*

         * Clear out allthe mappings below the kernel image.

         */

清除内核下所有的映射

我的MODULES_VADDR=0xbf000000 PMD_SIZE=0x2000000

MODULES_VADDR是动态模块映射区起始地址,

PMD_SIZE宏用于计算由页中间目录的一个单独表项所映射的区域大小,也就是一个页表的大小

我的平台启动打印

    vector  : 0xffff0000 - 0xffff1000   (   4kB)

    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)

    vmalloc : 0xc4800000 -0xf6000000   ( 792 MB)

    lowmem  : 0xc0000000 - 0xc4000000