secondary cpu執行流程
aarch64架構secondary cpu的內核入口函數為secondary_entry(arch/arm64/kernel/head.S),以下為其執行主流程:
由于其底層相關初始化流程與primary cpu類似,因此此處不再介紹。我們這里主要看一下它是如何通過secondary_start_kernel啟動idle線程的:
asmlinkage notrace void secondary_start_kernel(void)
{
struct mm_struct *mm = &init_mm;
…
current- >active_mm = mm; (1)
cpu_uninstall_idmap(); (2)
…
ops = get_cpu_ops(cpu);
if (ops- >cpu_postboot)
ops- >cpu_postboot(); (3)
…
set_cpu_online(cpu, true); (4)
complete(&cpu_running); (5)
…
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE); (6)
}
(1)由于內核線程并沒有用于地址空間,因此其active_mm通常指向上一個用戶進程的地址空間。而cpu初始化時,由于之前并沒有運行過用戶進程,因此將其初始化為init_mm
(2)idmap地址映射僅僅是用于mmu使能時地址空間的平滑切換,在mmu使能完成后已經沒有作用。更進一步,由于idmap頁表所使用的ttbr0_elx頁表基地址寄存器,正常情況下是用于用戶空間頁表的,在調度器接管該cpu之前也必須要將其歸還給用戶空間
(3)執行cpu_postboot回調
(4)由secondary cpu已經啟動成功,故將其設置為online狀態
(5)喚醒cpu hotplug線程
(6)讓cpu執行idle線程,其代碼實現如下:
void cpu_startup_entry(enum cpuhp_state state)
{
arch_cpu_idle_prepare();
cpuhp_online_idle(state);
while (1)
do_idle();
}
至此,cpu已經啟動完成,并開始執行idle線程了。最后當然是要通知調度器,將該cpu的管理權限移交給調度器了。它是通過cpu hotplug的以下回調實現的:
static struct cpuhp_step cpuhp_hp_states[] = {
…
[CPUHP_AP_SCHED_STARTING] = {
.name = "sched:starting",
.startup.single = sched_cpu_starting,
.teardown.single = sched_cpu_dying,
}
…
}
以下為該函數的實現:
int sched_cpu_starting(unsigned int cpu)
{
…
sched_rq_cpu_starting(cpu); (1)
sched_tick_start(cpu); (2)
…
}
(1)用于初始化負載均衡相關參數,此后該cpu就可以在其后的負載均衡流程中拉取進程
(2)tick時鐘是內核調度器的脈搏,啟動了該時鐘之后,cpu就會在時鐘中斷中執行調度操作,從而讓cpu參與到系統的調度流程中
-
cpu
+關注
關注
68文章
10824瀏覽量
211135 -
SMP
+關注
關注
0文章
71瀏覽量
19630 -
線程
+關注
關注
0文章
504瀏覽量
19649
發布評論請先 登錄
相關推薦
評論