chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

設(shè)備樹的傳遞及kernel 對(duì)設(shè)備樹的解析

Linux愛好者 ? 來源:Linux與SoC ? 作者:spy_os ? 2021-07-29 11:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

當(dāng) U-Boot 將設(shè)備樹加載到內(nèi)存指定位置后,ARM 內(nèi)核的 SoC 以通用寄存器 r2 來傳遞 dtb 在內(nèi)存中的地址。kernel 獲取到該地址后對(duì) dtb 文件做進(jìn)一步的處理。

設(shè)備樹的傳遞

當(dāng)使用 bootm 加載 kernel 鏡像時(shí)(bootz 是對(duì) bootm 的一種封裝以及功能擴(kuò)展,實(shí)質(zhì)一樣)。U-Boot 跳轉(zhuǎn)到 kernel 的入口函數(shù)是 boot_jump_linux

這個(gè)函數(shù)的 C 文件在 arch/arm/lib 下,說明設(shè)備樹的傳遞的方式是與 SoC 架構(gòu)相關(guān)的。不同的 SoC 在 bring-up 時(shí),這個(gè)函數(shù)格外重要,這是 U-Boot 與 kernel 之間銜接、交互信息的一個(gè)關(guān)鍵 API。U-Boot 的這個(gè)函數(shù)執(zhí)行結(jié)束后,將 CPU 的控制權(quán)完整的交給 kernel。

/* Subcommand: GO */static void boot_jump_linux(bootm_headers_t *images, int flag)

{

。。。

debug(“## Transferring control to Linux (at address %08lx)”

“。。。

”, (ulong) kernel_entry);

bootstage_mark(BOOTSTAGE_ID_RUN_OS);

announce_and_cleanup(fake);

if (IMAGE_ENABLE_OF_LIBFDT && images-》ft_len)

r2 = (unsigned long)images-》ft_addr;

else

r2 = gd-》bd-》bi_boot_params;

。。。

}

r2 作為存放設(shè)備樹地址的寄存器,其取值有兩種方式,分別是例化 bootm_header_t 這個(gè)數(shù)據(jù)結(jié)構(gòu)的 ft_addr,以及利用 U-Boot 的板級(jí)啟動(dòng)參數(shù)作為設(shè)備樹的地址。

bootm_header_t 方式

數(shù)據(jù)結(jié)構(gòu) bootm_header_t 的定義如下,供各種內(nèi)核的 SoC 使用,每家廠商根據(jù)自己 CPU 的特點(diǎn)對(duì)各個(gè)成員進(jìn)行不同的例化。

/*

* Legacy and FIT format headers used by do_bootm() and do_bootm_《os》()

* routines.

*/typedef struct bootm_headers {

。。。

char *ft_addr; /* flat dev tree address */

ulong ft_len; /* length of flat device tree */

。。。

} bootm_headers_t;

用 bootm_header_t 的方式,U-Boot 需支持設(shè)備樹以及文件非空。

ft_len 以及 ft_addr 屬于 bootm_header_t,在 U-Boot 解析鏡像文件時(shí),實(shí)例化這兩個(gè)成員。函數(shù)調(diào)用棧如下:

do_bootz(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])

-bootz_start()

--bootm_find_images(int flag, int argc, char *const argv[], ulong start,ulong size)

---boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,&images.ft_addr, &images.ft_len);

u-boot-v2021.04/common/image-fdt.c

gd-》bd-》bi_boot_params 方式

這種屬于比較古老的一種方式了,目前基本不會(huì)采用。bi_boot_params 是一個(gè)存放內(nèi)核啟動(dòng)參數(shù)的地址,通常是在板級(jí)初始化中進(jìn)行指定。

代碼執(zhí)行到此處,r2 是否為預(yù)期的值,一是可以通過打印的方式、再有使用調(diào)試工具連上去確認(rèn)。

kernel 對(duì)設(shè)備樹的解析

解析分兩個(gè)階段,第一階段進(jìn)行校驗(yàn)以及啟動(dòng)參數(shù)的再調(diào)整;第二階段完成設(shè)備樹的解壓,也就是將設(shè)備樹由 FDT 變成 EDT,創(chuàng)建 device_node。

第一階段

kernel 啟動(dòng)日志中與設(shè)備樹相關(guān)的第一條打印如下,也就是打印出當(dāng)前硬件設(shè)備的模型名,“OF: fdt: Machine model: V2P-CA9”

Booting Linux on physical CPU 0x0

Linux version 5.4.124 (qemu@qemu) (gcc version 6.5.0 (Linaro GCC 6.5-2018.12)) #3 SMP Fri Jun 25 1502 CST 2021

CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d

CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache

OF: fdt: Machine model: V2P-CA9

這個(gè)模型名是在設(shè)備樹文件的頭部定義的,定義當(dāng)前設(shè)備的總體名稱。

// SPDX-License-Identifier: GPL-2.0/*

* ARM Ltd. Versatile Express

*

* CoreTile Express A9x4

* Cortex-A9 MPCore (V2P-CA9)

*

* HBI-0191B

*/

/dts-v1/;

#include “vexpress-v2m.dtsi”

/ {

model = “V2P-CA9”;

。。。

}

但這并不是 kernel 對(duì)設(shè)備樹第一次進(jìn)行處理的地方。在此之前已有其他的操作。函數(shù)調(diào)用棧如下:

setup_arch(char **cmdline_p) arch/arm/kernel/setup.c

atags_vaddr = FDT_VIRT_BASE(__atags_pointer);

setup_machine_fdt(void *dt_virt) arch/arm/kernel/devtree.c

early_init_dt_verify()

of_flat_dt_match_machine() drivers/of/fdt.c

early_init_dt_scan_nodes();

__machine_arch_type = mdesc-》nr;

第 2 行、__atags_pointer 是 dtb 在內(nèi)存中的地址,這個(gè)地址在匯編階段(若鏡像為 zImage,那么在解壓縮階段就完成了)便獲取到了。由于執(zhí)行到 setup_arch 時(shí) mmu 已經(jīng)使能并且 4K 的段頁表也已經(jīng)完成了映射,而 U-Boot 傳遞給 kernel 的設(shè)備樹 fdt 地址屬于物理地址,因此需要將物理地址轉(zhuǎn)換成虛擬地址。

head-common.S

.align 2

.type __mmap_switched_data, %object

__mmap_switched_data:

#ifdef CONFIG_XIP_KERNEL#ifndef CONFIG_XIP_DEFLATED_DATA

.long _sdata @ r0

.long __data_loc @ r1

.long _edata_loc @ r2

#endif

.long __bss_stop @ sp (temporary stack in .bss)

#endif

.long __bss_start @ r0

.long __bss_stop @ r1

.long init_thread_union + THREAD_START_SP @ sp

.long processor_id @ r0

.long __machine_arch_type @ r1

.long __atags_pointer @ r2

第一階段對(duì)設(shè)備樹的配置主要包括:

A 對(duì) dtb 文件進(jìn)行 crc32 校驗(yàn),檢測設(shè)備樹文件是否合法 early_init_dt_verify()

B early_init_dt_scan_nodes()

/* Retrieve various information from the /chosen node */

of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

/* Initialize {size,address}-cells info */

of_scan_flat_dt(early_init_dt_scan_root, NULL);

/* Setup memory, calling early_init_dt_add_memory_arch */

of_scan_flat_dt(early_init_dt_scan_memory, NULL);

C 更新__machine_arch_type

D 更新 chosen

上面這個(gè) chosen 信息可以在 kernel 起來后再次查看做了哪些修改。

第二階段

第二階段單純的是將設(shè)備樹 ABI 文件進(jìn)行解壓縮,由 FDT 變成 EDT,生成相應(yīng)的 device_node 結(jié)點(diǎn)。這個(gè)階段的函數(shù)調(diào)用棧如下:

unflatten_device_tree();

*__unflatten_device_tree()

/* First pass, scan for size */

size = unflatten_dt_nodes(blob, NULL, dad, NULL);

/* Second pass, do actual unflattening */

unflatten_dt_nodes(blob, mem, dad, mynodes);

unflatten_dt_nodes()

populate_node()

device_nodes 結(jié)點(diǎn)如下:

354e808e-ee05-11eb-a97a-12bb97331649.png

device_node 創(chuàng)建完成后,kernel 創(chuàng)建 platform_device 時(shí)依據(jù)這個(gè)階段完成的工作情況進(jìn)行對(duì)應(yīng)的設(shè)備注冊(cè),供驅(qū)動(dòng)代碼使用。

編輯:jq

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

    關(guān)注

    0

    文章

    49

    瀏覽量

    11981

原文標(biāo)題:Linux 設(shè)備樹的傳遞以及 kernel 中對(duì)設(shè)備樹的解析

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在AMD Vitis Unified IDE中使用系統(tǒng)設(shè)備

    您將在這篇博客中了解系統(tǒng)設(shè)備 (SDT) 以及如何在 AMD Vitis Unified IDE 中使用 SDT 維護(hù)來自 XSA 的硬件元數(shù)據(jù)。本文還講述了如何對(duì) SDT 進(jìn)行操作,以便在 Vitis Unified IDE 中實(shí)現(xiàn)更靈活的使用場景。
    的頭像 發(fā)表于 11-18 11:13 ?2782次閱讀
    如何在AMD Vitis Unified IDE中使用系統(tǒng)<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>

    想在rtsmart中使用uart2,是不是只能通過修改設(shè)備方法來實(shí)現(xiàn)uart2的復(fù)用呀?

    我想在rtsmart中使用uart2,是不是只能通過修改設(shè)備方法來實(shí)現(xiàn)uart2的復(fù)用呀? 修改設(shè)備后如何只編譯設(shè)備
    發(fā)表于 06-24 07:04

    基于RV1126開發(fā)板修改CAN內(nèi)核設(shè)備

    編輯設(shè)備文件,執(zhí)行以下指令可以修改nano的板級(jí)頭文件,如下圖所示。(比如基于MCP2515把復(fù)用為SPI1的硬件資源轉(zhuǎn)成CAN對(duì)源代碼進(jìn)行修改)
    的頭像 發(fā)表于 04-17 10:10 ?606次閱讀
    基于RV1126開發(fā)板修改CAN內(nèi)核<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>

    基于RV1126開發(fā)板修改GPIO內(nèi)核設(shè)備

    編輯設(shè)備文件,執(zhí)行以下指令可以修改nano的板級(jí)頭文件,如圖所示。(比如把復(fù)用為SPI1的硬件資源改成通用的GPIO對(duì)源代碼進(jìn)行修改)
    的頭像 發(fā)表于 04-17 10:00 ?588次閱讀
    基于RV1126開發(fā)板修改GPIO內(nèi)核<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>

    請(qǐng)問有沒有辦法修改live系統(tǒng)上的設(shè)備?

    i.MX8M 納米 yocto Linux 我想在不經(jīng)過構(gòu)建過程的情況下測試 Device Tree 更改。有沒有辦法修改 live 系統(tǒng)上的設(shè)備設(shè)置? This https
    發(fā)表于 04-09 08:23

    如何獲取yocto build來構(gòu)建對(duì)設(shè)備的更改?

    來自 NXP 的 Yocto 構(gòu)建設(shè)置 我想為 imx8m nano 構(gòu)建一個(gè)修改后的器件。我了解設(shè)備源文件(.dts、dtsi)的語法,但我不知道如何讓 yocto 版本更新 DTB
    發(fā)表于 04-09 07:37

    請(qǐng)問stm32mp257如何修改設(shè)備并加載驅(qū)動(dòng)?

    1、重新編譯kernel容易報(bào)錯(cuò),重新編譯設(shè)備也會(huì)報(bào)錯(cuò)。 2、加載驅(qū)動(dòng),編譯環(huán)境應(yīng)該對(duì)應(yīng),加載不成功。 3、想知道整體比方說,修改下IO,修改下設(shè)備
    發(fā)表于 03-07 08:05

    【技術(shù)分享】迅為RK3568開發(fā)板使用TFTP加載內(nèi)核設(shè)備

    【技術(shù)分享】迅為RK3568開發(fā)板使用TFTP加載內(nèi)核設(shè)備
    的頭像 發(fā)表于 02-21 14:04 ?1108次閱讀
    【技術(shù)分享】迅為RK3568開發(fā)板使用TFTP加載內(nèi)核<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>

    求解答,設(shè)備問題

    請(qǐng)問,rk3588j要再提取一個(gè)USB3.0接口設(shè)備怎么改
    發(fā)表于 02-20 11:22

    科技在物聯(lián)網(wǎng)方面

    布局、人員位置等,在工業(yè)物聯(lián)網(wǎng)場景中監(jiān)測生產(chǎn)設(shè)備的狀態(tài)、檢測產(chǎn)品質(zhì)量等。 通信技術(shù)應(yīng)用 遠(yuǎn)程控制與數(shù)據(jù)傳輸:宇科技的人形機(jī)器人H1等產(chǎn)品具備遠(yuǎn)程控制和數(shù)據(jù)傳輸功能,這依賴于先進(jìn)的通信技術(shù)。在物聯(lián)網(wǎng)
    發(fā)表于 02-04 06:48

    使用TFTP加載內(nèi)核設(shè)備

    在嵌入式項(xiàng)目開發(fā)中,為了適配新外設(shè)、調(diào)整硬件資源分配或修復(fù)驅(qū)動(dòng)問題,需要頻繁修改設(shè)備和內(nèi)核。修改完成后,通常需要重新編譯生成鏡像,并將其燒錄到開發(fā)板上進(jìn)行測試。然而,傳統(tǒng)的燒錄方式不僅需要連接物理接口,還可能因?yàn)殓R像體積較大而耗費(fèi)較長時(shí)間,這在開發(fā)周期緊張的情況下顯得尤
    的頭像 發(fā)表于 01-17 15:52 ?1845次閱讀
    使用TFTP加載內(nèi)核<b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備之Makefile修改

    不同而新增加了dts,則需要在這個(gè)Makefile的這個(gè)位置添加上對(duì)應(yīng)的.dtb文件名參與編譯。ELF 1使用的設(shè)備命名為imx6ull-elf1-emmc.dts,是基于NXP官方evk板子的設(shè)備
    發(fā)表于 01-13 09:09

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備之Makefile修改

    不同而新增加了dts,則需要在這個(gè)Makefile的這個(gè)位置添加上對(duì)應(yīng)的.dtb文件名參與編譯。ELF 1使用的設(shè)備命名為imx6ull-elf1-emmc.dts,是基于NXP官方evk板子的設(shè)備
    發(fā)表于 01-10 09:23

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備設(shè)備組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備的起源設(shè)備(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備設(shè)備組成和結(jié)構(gòu)

    的一項(xiàng)技能。設(shè)備的起源設(shè)備(Device Tree)是一種描述硬件資源的數(shù)據(jù)結(jié)構(gòu),它由uboot傳遞給Linux內(nèi)核,被內(nèi)核
    發(fā)表于 01-07 09:16