linuxarm启动c语言部分详解第二讲(startkernel--setupa
[ 原创]Linux arm 启动 c 语言部分详解第二讲(Start kernel-> setup_aWritten by leeming这一讲是主要讲 setup_arch 中那个没有解释的函数解释完毕,完成 setup_arch 的函数, 好让我们的 start_kernel 继续下去。/** paging_init() sets up the page tables, initialises the zone memory* maps, and sets up the zero page, bad page and bad page tables.*这部分的主要工作建立页表,初始化内存。*/void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc){void *zero_page;//这个函数主要是用来建立各种类型的页表选项(比如内存是 MEMORY 类型,设备室 DEVICE,中断向量表是 HIGH_VECTORS)build_mem_type_table();{struct cachepolicy *cp;//获取 cp15 处理器的 c1 寄存器位unsigned int cr = get_cr();unsigned int user_pgprot, kern_pgprot;//获取处理器架构版本int cpu_arch = cpu_architecture();int i;//根据处理器版本号调整 cache 政策,不是写缓冲区的政策#if defined(CONFIG_CPU_DCACHE_DISABLE)if (cachepolicy CPOLICY_BUFFERED)cachepolicy = CPOLICY_BUFFERED;#elif defined(CONFIG_CPU_DCACHE_WRITETHROUGH)if (cachepolicy CPOLICY_WRITETHROUGH)cachepolicy = CPOLICY_WRITETHROUGH;#endifif (cpu_arch if (cachepolicy = CPOLICY_WRITEALLOC)cachepolicy = CPOLICY_WRITEBACK;ecc_mask = 0;// 因 为 v5 前的处理器的一级描述符没有定义第 9 位作为保护标志位}if (cpu_arch //mem_types 是一 个全局数组 arch/arm/mm-armv.c ,里面有所有类型for (i = 0; i //prot_l1 prot_sect 都是一级描述符的意思// 将一级描述符的第 4 位置 1if (mem_types.prot_l1)mem_types.prot_l1 |= PMD_BIT4;if (mem_types.prot_sect)mem_types.prot_sect |= PMD_BIT4;}}//我们的 cachepolicy 是 3,因此相应的配置如下// .policy = writeback,// .cr_mask = 0,// .pmd = PMD_SECT_WB,// .pte = PTE_BUFFERABLE|PTE_CACHEABLE,cp = cache_policies[cachepolicy];//kern_pgprot user_pgprot 是内核和用户空间的二级页表描述 符kern_pgprot = user_pgprot = cp-pte;