0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在內(nèi)核中啟動(dòng)secondary cpu

麥辣雞腿堡 ? 來源:TrustZone ? 作者:Hcoco ? 2023-12-05 15:46 ? 次閱讀

啟動(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) {                 (1if (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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1346

    瀏覽量

    40152
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10770

    瀏覽量

    210429
  • SMP
    SMP
    +關(guān)注

    關(guān)注

    0

    文章

    71

    瀏覽量

    19598
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用dtb方式啟動(dòng)內(nèi)核

    /boot/zImagebootz 0x82000000 - 0x88000000至此,Linux內(nèi)核就能啟動(dòng)了。  (7)小結(jié)  從啟動(dòng)Log上分析,現(xiàn)在內(nèi)核無法掛在根文件系統(tǒng),在
    發(fā)表于 04-22 14:06

    何在eDesignSuite中將調(diào)節(jié)模式從Secondary更改為Primary?

    何在eDesignSuite中將調(diào)節(jié)模式從Secondary更改為Primary?我想設(shè)計(jì)一個(gè)低成本的85-265V AC到12V 0.2A DC隔離反激式轉(zhuǎn)換器,使用Viper06和PSR
    發(fā)表于 07-09 08:55

    是否可以通過SPAEr320 CPU的USB啟動(dòng)機(jī)制啟動(dòng)Linux內(nèi)核?

    你好 是否可以通過SPAEr320 CPU的USB啟動(dòng)機(jī)制啟動(dòng)Linux內(nèi)核? 如果是,可以使用哪些工具為可
    發(fā)表于 08-07 14:23

    何在內(nèi)核中去讀取文件的大小呢

    何在內(nèi)核中去讀取文件的大小呢?有什么方法嗎?
    發(fā)表于 11-02 06:57

    I.MX8MM開發(fā)板Linux如何在內(nèi)核添加驅(qū)動(dòng)呢

    迅為I.MX8MM開發(fā)板編譯驅(qū)動(dòng)到內(nèi)核,在平時(shí)的驅(qū)動(dòng)開發(fā),經(jīng)常需要在內(nèi)核配置某種功能,為了方便大家開發(fā)和學(xué)習(xí),本小節(jié)講解如何在內(nèi)核
    發(fā)表于 08-29 17:46

    基于ARM體系的內(nèi)核啟動(dòng)解析

    初始化內(nèi)存位置。具有“ psci”啟用方法的CPU應(yīng)該保留在內(nèi)核之外(即,在內(nèi)存節(jié)點(diǎn)中描述給內(nèi)核的內(nèi)存區(qū)域之外,或者在內(nèi)核
    發(fā)表于 09-14 12:02

    在內(nèi)核啟動(dòng)時(shí)發(fā)現(xiàn)SPI驅(qū)動(dòng)沒有正確運(yùn)行?

    在內(nèi)核啟動(dòng)中發(fā)現(xiàn)這個(gè)打印信息[ 1.138240] spi_gpio spi4.15: gpio-miso property not found, switching to no-rx mode這是
    發(fā)表于 11-28 07:54

    米爾科技改內(nèi)核調(diào)整GPIO在內(nèi)核啟動(dòng)階段方案

    米爾用戶在使用i.MX6UL/i.MX6ULL系列產(chǎn)品開發(fā)時(shí),需要調(diào)整GPIO在內(nèi)核啟動(dòng)階段的狀態(tài),這怎么操作呢?
    的頭像 發(fā)表于 11-26 16:31 ?2800次閱讀
    米爾科技改<b class='flag-5'>內(nèi)核</b>調(diào)整GPIO<b class='flag-5'>在內(nèi)核</b><b class='flag-5'>啟動(dòng)</b>階段方案

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

    在上一篇文章《程序是如何在 CPU 運(yùn)行的(一)》筆者講述了程序中一條一條指令以及一條一條數(shù)據(jù)是如何在
    發(fā)表于 02-07 11:10 ?1次下載
    程序是如<b class='flag-5'>何在</b> <b class='flag-5'>CPU</b> <b class='flag-5'>中</b>運(yùn)行的(二)

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

    本文先講解上篇,大家看到匯編不用擔(dān)心看不懂,在內(nèi)核啟動(dòng)階段,沒有特別復(fù)雜的流程,都是順序執(zhí)行,只需一句一句閱讀代碼即可。
    發(fā)表于 06-23 14:07 ?1525次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>啟動(dòng)</b>流程(上)

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

    ,用于填寫secondary cpu的入口地址。 uboot負(fù)責(zé)將這塊內(nèi)存的地址寫入devicetree,當(dāng)內(nèi)核初始化完成,需要啟動(dòng)
    的頭像 發(fā)表于 12-05 15:27 ?908次閱讀
    <b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>初始化狀態(tài)設(shè)置

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

    cpu操作函數(shù) cpu_ops函數(shù)由bringup_cpu調(diào)用,以觸發(fā)secondary cpu啟動(dòng)
    的頭像 發(fā)表于 12-05 16:04 ?615次閱讀
    SMP多核<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>cpu</b>操作函數(shù)

    secondary cpu執(zhí)行流程介紹

    secondary cpu執(zhí)行流程 aarch64架構(gòu)secondary cpu內(nèi)核入口函數(shù)為seco
    的頭像 發(fā)表于 12-05 16:12 ?750次閱讀
    <b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>執(zhí)行流程介紹

    SMP多核secondary cpu啟動(dòng)流程

    secondary cpu啟動(dòng) 由于psci方式啟動(dòng)secondary cpu的流程,除了其所執(zhí)
    的頭像 發(fā)表于 12-05 17:41 ?683次閱讀
    SMP多核<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b><b class='flag-5'>啟動(dòng)</b>流程

    何在反激式拓?fù)?b class='flag-5'>中實(shí)現(xiàn)軟啟動(dòng)

    電子發(fā)燒友網(wǎng)站提供《如何在反激式拓?fù)?b class='flag-5'>中實(shí)現(xiàn)軟啟動(dòng).pdf》資料免費(fèi)下載
    發(fā)表于 09-04 11:09 ?0次下載
    如<b class='flag-5'>何在</b>反激式拓?fù)?b class='flag-5'>中</b>實(shí)現(xiàn)軟<b class='flag-5'>啟動(dòng)</b>