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

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

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

SMP多核啟動向內(nèi)核傳遞參數(shù)信息

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

spin_table_cpu_release_addr的傳遞

由于在armv8架構(gòu)下, uboot只能通過devicetree向內(nèi)核傳遞參數(shù)信息 ,因此當(dāng)其開啟了CONFIG_ARMV8_SPIN_TABLE配置選項后,就需要在適當(dāng)?shù)臅r候?qū)⒃撝祵懭雂evicetree中。

我們知道uboot一般通過bootm命令啟動操作系統(tǒng)(aarch64支持的booti命令,其底層實現(xiàn)與bootm相同),因此在bootm中會執(zhí)行一系列啟動前的準備工作,其中就包括將spin-table地寫入devicetree的工作。以下其執(zhí)行流程圖:

圖片
spin_table_update_dt的代碼實現(xiàn)如下:

int spin_table_update_dt(void *fdt)
{
	…
	unsigned long rsv_addr = (unsigned long)&spin_table_reserve_begin;   
	unsigned long rsv_size = &spin_table_reserve_end -
						&spin_table_reserve_begin;                 (1)

	cpus_offset = fdt_path_offset(fdt, "/cpus");                                       (2if (cpus_offset < 0)
		return -ENODEV;

	for (offset = fdt_first_subnode(fdt, cpus_offset);                    
	     offset >= 0;
	     offset = fdt_next_subnode(fdt, offset)) {
		prop = fdt_getprop(fdt, offset, "device_type", NULL);
		if (!prop || strcmp(prop, "cpu"))
			continue;
		prop = fdt_getprop(fdt, offset, "enable-method", NULL);                    (3if (!prop || strcmp(prop, "spin-table"))
			return 0;
	}

	for (offset = fdt_first_subnode(fdt, cpus_offset);
	     offset >= 0;
	     offset = fdt_next_subnode(fdt, offset)) {
		prop = fdt_getprop(fdt, offset, "device_type", NULL);
		if (!prop || strcmp(prop, "cpu"))
			continue;

		ret = fdt_setprop_u64(fdt, offset, "cpu-release-addr",
				(unsigned long)&spin_table_cpu_release_addr);              (4if (ret)
			return -ENOSPC;
	}

	ret = fdt_add_mem_rsv(fdt, rsv_addr, rsv_size);                                    (5)
	…
}

(1)獲取其起始地址和長度

(2)從devicetree中獲取cpus節(jié)點

(3)遍歷該節(jié)點的所有cpu子節(jié)點,并校驗其enable-method是否為spin-table。若不是所有cpu的都該類型,則不設(shè)置

(4)若所有cpu的enable-method都為spin-table,則將該參數(shù)設(shè)置到cpu-release-addr屬性中

(5)由于這段地址有特殊用途,內(nèi)核的內(nèi)存管理系統(tǒng)不能將其分配給其它模塊。因此,需要將其添加到保留內(nèi)存中

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

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

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209338
  • 多核
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

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

    關(guān)注

    0

    文章

    70

    瀏覽量

    19554
收藏 人收藏

    評論

    相關(guān)推薦

    AliOS Things SMP系統(tǒng)及其在esp32上實現(xiàn)示例

    對應(yīng)CPU的SMP功能:2.1 核啟動加載目前的啟動順序是,系統(tǒng)默認開始啟動0核,在0核的主任務(wù)入口內(nèi)啟動其他核的加載,使其都進入任務(wù)調(diào)度,
    發(fā)表于 05-15 12:45

    典型的支持多核處理器的RTOS功能解析

    運行中更換或重新啟動幾乎所有的模塊,甚至是設(shè)備驅(qū)動程序。QNX對多核處理器的支持基于其微內(nèi)核結(jié)構(gòu),通信被集成到QNX消息傳遞原語,本地的IPC和遠端節(jié)點間的IPC一樣。在單CPU上運行
    發(fā)表于 06-29 08:30

    ARM64 SMP多核啟動相關(guān)資料推薦(上)

    ddr某個地址,為內(nèi)核傳遞參數(shù)之后,然后bootloader就完成了它的使命,跳轉(zhuǎn)到內(nèi)核,就進入了操作系統(tǒng)內(nèi)核的世界。4)linux
    發(fā)表于 06-06 17:05

    ARM64 SMP多核啟動相關(guān)資料推薦(下)

    psci。下面我們來揭開他神秘的面紗,其實理解了spin-table的啟動方式,psci并不難(說白了也是需要主處理器給從處理器一個啟動地址,然后從處理器從這個地址執(zhí)行指令,實際上比這要復(fù)雜的多)。下面給出psci方式多核
    發(fā)表于 06-06 17:11

    Linux在SMP系統(tǒng)上的移植研究

    基于自主開發(fā)以雙核嵌入式CPU EM8301為處理核心的嵌入式應(yīng)用的目的,針對雙核CPU芯片的系統(tǒng)結(jié)構(gòu)和Linux內(nèi)核的特性,通過研究嵌入式Linux操作系統(tǒng)在SMP系統(tǒng)上的移植,探討SMP架構(gòu)
    發(fā)表于 11-14 16:09 ?11次下載
    Linux在<b class='flag-5'>SMP</b>系統(tǒng)上的移植研究

    Linux內(nèi)核源碼分析--內(nèi)核啟動命令行的傳遞過程

    內(nèi)核啟動參數(shù)其實不僅僅包含在了cmdline中,cmdline不過是bootloader傳遞內(nèi)核
    發(fā)表于 05-05 15:28 ?1635次閱讀

    用戶與內(nèi)核空間數(shù)據(jù)交換的方式之一:內(nèi)核啟動參數(shù)

    Linux 提供了一種通過 bootloader 向其傳輸啟動參數(shù)的功能,內(nèi)核開發(fā)者可以通過這種方式來向內(nèi)核傳輸數(shù)據(jù),從而控制內(nèi)核
    發(fā)表于 05-14 15:42 ?467次閱讀

    BootLoader與Linux內(nèi)核參數(shù)傳遞

    。5. 參數(shù)傳遞的驗證和測試參數(shù)傳遞的結(jié)果可以通過內(nèi)核啟動的打印
    發(fā)表于 04-02 14:31 ?327次閱讀

    BootLoader與Linux內(nèi)核參數(shù)傳遞詳細資料說明

    在嵌入式系統(tǒng)中, Bootloader是用來初始化硬件,加載內(nèi)核,傳遞參數(shù)。因為嵌入式系統(tǒng)的硬件環(huán)境各不相同,所以嵌入式系統(tǒng)的 Bootloader也各不相同,其中比較通用的是U-Boot,它支持
    發(fā)表于 03-16 10:39 ?13次下載
    BootLoader與Linux<b class='flag-5'>內(nèi)核</b>的<b class='flag-5'>參數(shù)</b><b class='flag-5'>傳遞</b>詳細資料說明

    如何解讀內(nèi)核的oops

    96000045表示錯誤碼。后面[]內(nèi)的數(shù)值是與頁面有關(guān)的oops信息被顯示的次數(shù)。之后顯示內(nèi)核的重要特性SMP和PREEMPT被顯示的配置情況。這條信息所在的
    的頭像 發(fā)表于 10-21 12:39 ?1283次閱讀

    Linux內(nèi)核模塊參數(shù)傳遞與sysfs文件系統(tǒng)

    Linux應(yīng)用開發(fā)中,為使應(yīng)用程序更加靈活地執(zhí)行用戶的預(yù)期功能,我們有時候會通過命令行傳遞一些參數(shù)到main函數(shù)中,使得代碼邏輯可以依據(jù)參數(shù)執(zhí)行不同的任務(wù)。同樣,Linux內(nèi)核也提供了
    發(fā)表于 06-07 16:23 ?1914次閱讀

    ARM64 SMP多核啟動(下)—PSCI

    上面說了pin-table的多核啟動方式,看似很繁瑣,實際上并不復(fù)雜,無外乎主處理器喚醒從處理器到指定地址上去執(zhí)行指令
    發(fā)表于 06-09 14:31 ?606次閱讀
    ARM64 <b class='flag-5'>SMP</b><b class='flag-5'>多核</b><b class='flag-5'>啟動</b>(下)—PSCI

    SMP是什么?多核芯片(SMP)的啟動方法

    SMP 英文為Symmetric Multi-Processing ,是對稱多處理結(jié)構(gòu)的簡稱,是指在一個計算機上匯集了一組處理器(多CPU),各CPU之間共享內(nèi)存子系統(tǒng)以及總線結(jié)構(gòu),一個服務(wù)器系統(tǒng)可以同時運行多個處理器,并共享內(nèi)存和其他的主機資源。
    的頭像 發(fā)表于 07-26 09:26 ?1.5w次閱讀
    <b class='flag-5'>SMP</b>是什么?<b class='flag-5'>多核</b>芯片(<b class='flag-5'>SMP</b>)的<b class='flag-5'>啟動</b>方法

    SMP是什么 啟動方式介紹

    ,一個服務(wù)器系統(tǒng)可以同時運行多個處理器,并共享內(nèi)存和其他的主機資源。 CMP 英文為Chip multiprocessors,指的是單芯片多處理器,也指多核心。其思想是將大規(guī)模并行處理器中的SMP集成到同一芯片內(nèi),各個處理器并行執(zhí)行不同的進程。 (1)CPU數(shù):獨立的中央
    的頭像 發(fā)表于 12-05 15:23 ?1478次閱讀

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

    其中spin-table啟動方式的回調(diào)如下: const struct cpu_operations smp_spin_table_ops = {.name= "spin-table
    的頭像 發(fā)表于 12-05 16:04 ?516次閱讀
    <b class='flag-5'>SMP</b><b class='flag-5'>多核</b><b class='flag-5'>啟動</b>cpu操作函數(shù)