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核 



相关推荐

作用是把pc寄存器和立即数按照一定的规则计算后赋值给寄存器。  

stp指令是str的变种指令,p可以理解成pair的意思,可以同时操作两个寄存器。 例如 stp x2

一、概述 1、目前常用的arm汇编环境有以下两种: (1)arm asm: arm公司的汇编器,适合于windows平台下使用。 (2)gnu arm asm:gnu交叉编译工具链中的汇编器,适合于l

Move to Register from Status Register 用于将程序状态寄存器内容传输到通用寄存器。  

一、armv8概述 ARM架构版本号从1-8,ARMv8架构支持以下两种执行状态: 1、aarch64 (1)提供31个64位通用寄存器(其中x30被用来做链接寄存器LR(函数返回地址)),一个64位

一、概述 1、LSL=Logic Shift Left 2、LSR=Logic Shift Right 3、ASL=Arithmatic Shift

一、概述 Condition execution是根据运行结果更新Conidtion flags,来判断Condition code是否可以执行。 通过给汇编指令

全称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这个值,避免操作内存。 零寄存器当用作源寄存器时读操作的结果为零,当用作目标寄存器时则将结果