Linux arm启动 c语言部分详解第二讲(Start kernel-- setup_a
[原创]Linux arm 启动 c语言部分详解第二讲(Start kernel-> setup_a
Written 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;
#endif
if (cpu_arch
if (cachepolicy >= CPOLICY_WRITEALLOC)
cachepolicy = CPOLICY_WRITEBACK;
ecc_mask = 0;//因为v5前的处理器的一级描述符没有定义第9位作为保护标志位
}
if (cpu_arch
//mem_types是一个全局数组arch/arm/mm-armv.c,里面有所有类型
&n