Linux_arm_启动_c语言部分详解,linuxarm启动c语言部分详解第二讲(startkernel--setupa

41528d3028836879cd698677c3999917.giflinuxarm启动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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值