arm64多核CPU启动流程(ACPI parking protocol)
阅读数:233 评论数:0
跳转到新版页面分类
硬件/嵌入式
正文
ARM64多核启动使用ACPI parking protocol,个人理解因为这个过程和parking有点像,所以如此称呼。
1、引导核
start_kernel//开始初始化内核需要的全局变量,硬件资源等
-> setup_arch
-> setup_processor
-> cpu_init //设定IRQ堆栈
-> rest_init //在最后启动其他核
-> kernel_thread(kernel_init, NULL, CLONE_FS);
kernel_init
-> kernel_init_freeable();
-> smp_init
-> cpu_up()
-> _cpu_up()
-> __cpu_up()
-> boot_secondary
-> cpu_ops[cpu]->cpu_boot(cpu);
-> try_to_run_init_process("/sbin/init")
-> run_init_process
-> do_execve
-> try_to_run_init_process("/etc/init")
-> try_to_run_init_process("/bin/init")
2、非引导核
const struct cpu_operations smp_parking_protocol_ops = {
.name = "parking-protocol",
.cpu_init = smp_parking_protocol_cpu_init,
.cpu_prepare = smp_parking_protocol_cpu_prepare,
.cpu_boot = smp_parking_protocol_cpu_boot,
#ifdef CONFIG_HOTPLUG_CPU
.cpu_disable = smp_parking_protocol_cpu_disable,
.cpu_die = smp_parking_protocol_cpu_die,
#endif
};
cpu_ops[cpu]->cpu_boot(cpu); 调用了 smp_parking_protocol_cpu_boot,
smp_parking_protocol_cpu_boot
-> writeq(__pa(secondary_entry), &mailbox->entry_point);
secondary_entry
-> secondary_startup
-> __secondary_switched
-> secondary_start_kernel //正式启动下一个CPU,AP核
相关推荐
一、概述
1、目前常用的arm汇编环境有以下两种:
(1)arm asm: arm公司的汇编器,适合于windows平台下使用。
(2)gnu arm asm:gnu交叉编译工具链中的汇编器,适合于l
一、armv8概述
ARM架构版本号从1-8,ARMv8架构支持以下两种执行状态:
1、aarch64
(1)提供31个64位通用寄存器(其中x30被用来做链接寄存器LR(函数返回地址)),一个64位
全称Prefetch from memory。
1、PLD = prefetch for load
2、PST = prefetch for store
3、L1表示一级缓存,L2表示二级存,L3表示
Vector Base Address Register,在开启MMU的系统,vbar中写入的是虚拟地址。
armv8定义了vbarel1、vbarel2、vbarel3三个基址寄存器。
当中断产生
当访问零寄存器时,所有写操作都被忽略,所有读操作返回0。因为操作寄存器的速度是最快的,这个寄存的作用是提供0这个值,避免操作内存。
零寄存器当用作源寄存器时读操作的结果为零,当用作目标寄存器时则将结果