3.5.1.14. boot_cpu_init
void __init boot_cpu_init(void)
{
//获得boot cpu的ID
int cpu = smp_processor_id();
//将其在系统维护的多个位图中置位,其中包括online, active, present, possible
set_cpu_online(cpu, true);
set_cpu_active(cpu, true);
set_cpu_present(cpu, true);
set_cpu_possible(cpu, true);
#ifdef CONFIG_SMP
__boot_cpu_id = cpu;
#endif
}
boot_cpu_init
用于初始化Boot CPU
3.5.1.15. build_mem_type_table
static void __init build_mem_type_table(void)
{
struct cachepolicy *cp;
unsigned int cr = get_cr();
pteval_t user_pgprot, kern_pgprot, vecs_pgprot;
pteval_t hyp_device_pgprot, s2_pgprot, s2_device_pgprot;
int cpu_arch = cpu_architecture();
int i;
if(is_smp()) {
if(cachepolicy != CPOLICY_WRITEALLOC)
cachepolicy = CPOLICY_WRITEALLOC;
if(!(initial_pmd_value & PMD_SECT_S))
initial_pmd_value |= PMD_SECT_S;
}
if(cpu_is_xsc3() || (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP))) {
if(!cpu_is_xsc3()) {
//对各个成员的prot_sect标志增加PMD_SECT_XN支持
//XN为Execute-Never,即指明处理器能否在该区域上执行程序
mem_types[MT_DEVICE].prot_sect |= PMD_SECT_XN;
mem_types[MT_DEVICE_NONSHARED].pro_sect |= PMD_SECT_XN;
mem_types[MT_DEVICE_CACHED].pro_sect |= PMD_SECT_XN;
mem_types[MT_DEVICE_WC].pro_sect |= PMD_SECT_XN;
mem_types[MT_MEMORY_RW].prot_sect |= PMD_SECT_XN;
}
if(cpu_arch >= CPU_ARCH_ARMv7 && (cr & CR_TRE)) {
mem_types[MT_DEVICE].prot_sect |= PMD_SECT_TEX(1);
mem_types[MT_DEVICE_NONSHARED].prot_sect |= PMD_SECT_TE(1);
mem_types[MT_DEVICE_WC].prot_sect |= PMD_SECT_BUFFERABLE;
}
}
cp = &cache_policies(cachepolicy);
vecs_pgprot = kern_pgprot = user_pgprot = cp->pte;
s2_pgprot = cp->pte_s2;
hyp_device_pgprot = mem_types[MT_DEVICE].prot_pte;
s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2;
}
注解
TRE位用于SCTLR寄存器的bit28, 用于页表TEX remap使能.如果该位置位,那么在页表中,TEX[2:1]被分配给操作系统管理,而TEX[0], C, B位以及MMU remap寄存器用于描述内存区的属性.反之如果该位清零,那么页表中,TEX[2:0]和C, B位一起用于描述内存区域的属性
警告
此函数待完善………