啟動(dòng)secondary cpu
內(nèi)核在啟動(dòng)secondary cpu之前當(dāng)然需要為其準(zhǔn)備好執(zhí)行環(huán)境,因?yàn)閮?nèi)核中cpu最終都將由調(diào)度器管理,故此時(shí)調(diào)度子系統(tǒng)應(yīng)該要初始化完成。
同時(shí)cpu啟動(dòng)完成轉(zhuǎn)交給調(diào)度器之前,并沒有實(shí)際的業(yè)務(wù)進(jìn)程,而我們知道內(nèi)核中cpu在空閑時(shí)會(huì)執(zhí)行idle進(jìn)程。因此,在其啟動(dòng)之前需要為每個(gè)cpu初始化一個(gè)idle進(jìn)程。
另外,由于將一個(gè)cpu通過熱插拔方式移除后,再次啟動(dòng)該cpu的流程,與secondary cpu的啟動(dòng)流程是相同的,因此內(nèi)核復(fù)用了cpu hotplug框架用于啟動(dòng)secondary cpu。
而內(nèi)核為每個(gè)cpu都分配了一個(gè)獨(dú)立的hotplug線程,用于執(zhí)行本cpu相關(guān)的熱插拔流程。為此,內(nèi)核通過以下流程執(zhí)行secondary cpu啟動(dòng)操作:
idle進(jìn)程初始化
以下代碼為每個(gè)非boot cpu分配一個(gè)idle進(jìn)程
void __init idle_threads_init(void)
{
…
boot_cpu = smp_processor_id();
for_each_possible_cpu(cpu) { (1)
if (cpu != boot_cpu)
idle_init(cpu); (2)
}
}
(1)遍歷系統(tǒng)中所有的possible cpu
(2)若該cpu為secondary cpu,則為其初始化一個(gè)idle進(jìn)程
hotplug線程初始化
以下代碼為每個(gè)cpu初始化一個(gè)hotplug線程
void __init cpuhp_threads_init(void)
{
BUG_ON(smpboot_register_percpu_thread(&cpuhp_threads));
kthread_unpark(this_cpu_read(cpuhp_state.thread));
}
其中線程的描述結(jié)構(gòu)體定義如下:
static struct smp_hotplug_thread cpuhp_threads = {
.store = &cpuhp_state.thread, (1)
.create = &cpuhp_create, (2)
.thread_should_run = cpuhp_should_run, (3)
.thread_fn = cpuhp_thread_fun, (4)
.thread_comm = "cpuhp/%u", (5)
.selfparking = true, (6)
}
(1)用于保存cpu上的task struct指針
(2)線程創(chuàng)建時(shí)調(diào)用的回調(diào)
(3)該回調(diào)用于獲取線程是否需要退出標(biāo)志
(4)cpu hotplug主函數(shù),執(zhí)行實(shí)際的hotplug操作
(5)該線程的線程名
(6)用于設(shè)置線程創(chuàng)建完成后,是否將其設(shè)置為park狀態(tài)
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1391瀏覽量
40599 -
cpu
+關(guān)注
關(guān)注
68文章
10947瀏覽量
213895 -
SMP
+關(guān)注
關(guān)注
0文章
76瀏覽量
19839
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何使用dtb方式啟動(dòng)內(nèi)核
如何在eDesignSuite中將調(diào)節(jié)模式從Secondary更改為Primary?
是否可以通過SPAEr320 CPU中的USB啟動(dòng)機(jī)制啟動(dòng)Linux內(nèi)核?
I.MX8MM開發(fā)板Linux如何在內(nèi)核中添加驅(qū)動(dòng)呢
基于ARM體系的內(nèi)核啟動(dòng)解析
在內(nèi)核啟動(dòng)時(shí)發(fā)現(xiàn)SPI驅(qū)動(dòng)沒有正確運(yùn)行?
CPU內(nèi)核結(jié)構(gòu)解析
米爾科技改內(nèi)核調(diào)整GPIO在內(nèi)核啟動(dòng)階段方案

程序是如何在 CPU 中運(yùn)行的(二)

Linux內(nèi)核啟動(dòng)流程(上)

secondary cpu初始化狀態(tài)設(shè)置

SMP多核啟動(dòng)cpu操作函數(shù)

評(píng)論