在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

設備樹的傳遞及kernel 對設備樹的解析

Linux愛好者 ? 來源:Linux與SoC ? 作者:spy_os ? 2021-07-29 11:19 ? 次閱讀

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

設備樹的傳遞

當使用 bootm 加載 kernel 鏡像時(bootz 是對 bootm 的一種封裝以及功能擴展,實質一樣)。U-Boot 跳轉到 kernel 的入口函數是 boot_jump_linux

這個函數的 C 文件在 arch/arm/lib 下,說明設備樹的傳遞的方式是與 SoC 架構相關的。不同的 SoC 在 bring-up 時,這個函數格外重要,這是 U-Boot 與 kernel 之間銜接、交互信息的一個關鍵 API。U-Boot 的這個函數執行結束后,將 CPU 的控制權完整的交給 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 作為存放設備樹地址的寄存器,其取值有兩種方式,分別是例化 bootm_header_t 這個數據結構的 ft_addr,以及利用 U-Boot 的板級啟動參數作為設備樹的地址。

bootm_header_t 方式

數據結構 bootm_header_t 的定義如下,供各種內核的 SoC 使用,每家廠商根據自己 CPU 的特點對各個成員進行不同的例化。

/*

* 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 需支持設備樹以及文件非空。

ft_len 以及 ft_addr 屬于 bootm_header_t,在 U-Boot 解析鏡像文件時,實例化這兩個成員。函數調用棧如下:

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 方式

這種屬于比較古老的一種方式了,目前基本不會采用。bi_boot_params 是一個存放內核啟動參數的地址,通常是在板級初始化中進行指定。

代碼執行到此處,r2 是否為預期的值,一是可以通過打印的方式、再有使用調試工具連上去確認。

kernel 對設備樹的解析

解析分兩個階段,第一階段進行校驗以及啟動參數的再調整;第二階段完成設備樹的解壓,也就是將設備樹由 FDT 變成 EDT,創建 device_node。

第一階段

kernel 啟動日志中與設備樹相關的第一條打印如下,也就是打印出當前硬件設備的模型名,“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

這個模型名是在設備樹文件的頭部定義的,定義當前設備的總體名稱。

// 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 對設備樹第一次進行處理的地方。在此之前已有其他的操作。函數調用棧如下:

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 在內存中的地址,這個地址在匯編階段(若鏡像為 zImage,那么在解壓縮階段就完成了)便獲取到了。由于執行到 setup_arch 時 mmu 已經使能并且 4K 的段頁表也已經完成了映射,而 U-Boot 傳遞給 kernel 的設備樹 fdt 地址屬于物理地址,因此需要將物理地址轉換成虛擬地址。

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

第一階段對設備樹的配置主要包括:

A 對 dtb 文件進行 crc32 校驗,檢測設備樹文件是否合法 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

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

第二階段

第二階段單純的是將設備樹 ABI 文件進行解壓縮,由 FDT 變成 EDT,生成相應的 device_node 結點。這個階段的函數調用棧如下:

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 結點如下:

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

device_node 創建完成后,kernel 創建 platform_device 時依據這個階段完成的工作情況進行對應的設備注冊,供驅動代碼使用。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Kernel
    +關注

    關注

    0

    文章

    48

    瀏覽量

    11490

原文標題:Linux 設備樹的傳遞以及 kernel 中對設備樹的解析

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于RV1126開發板修改CAN內核設備

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

    基于RV1126開發板修改GPIO內核設備

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

    請問有沒有辦法修改live系統上的設備

    i.MX8M 納米 yocto Linux 我想在不經過構建過程的情況下測試 Device Tree 更改。有沒有辦法修改 live 系統上的設備設置? This https
    發表于 04-09 08:23

    如何獲取yocto build來構建對設備的更改?

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

    請問stm32mp257如何修改設備并加載驅動?

    1、重新編譯kernel容易報錯,重新編譯設備也會報錯。 2、加載驅動,編譯環境應該對應,加載不成功。 3、想知道整體比方說,修改下IO,修改下設備
    發表于 03-07 08:05

    【技術分享】迅為RK3568開發板使用TFTP加載內核設備

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

    求解答,設備問題

    請問,rk3588j要再提取一個USB3.0接口設備怎么改
    發表于 02-20 11:22

    科技在物聯網方面

    布局、人員位置等,在工業物聯網場景中監測生產設備的狀態、檢測產品質量等。 通信技術應用 遠程控制與數據傳輸:宇科技的人形機器人H1等產品具備遠程控制和數據傳輸功能,這依賴于先進的通信技術。在物聯網
    發表于 02-04 06:48

    使用TFTP加載內核設備

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

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-初識設備之Makefile修改

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

    飛凌嵌入式ElfBoard ELF 1板卡-初識設備之Makefile修改

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

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-初識設備設備組成和結構

    的一項技能。設備的起源設備(Device Tree)是一種描述硬件資源的數據結構,它由uboot傳遞給Linux內核,被內核
    發表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識設備設備組成和結構

    的一項技能。設備的起源設備(Device Tree)是一種描述硬件資源的數據結構,它由uboot傳遞給Linux內核,被內核
    發表于 01-07 09:16

    請問PCM1864的驅動在設備該如何描述?

    請問PCM1864的驅動在設備該如何描述呢: 1. 我使用的不是TI的LINUX內核,是另外一款SOC的LINUX內核 2. 我在設備做了以下描述: ps7-i2c@e00040
    發表于 10-23 07:30

    如何使用CubeMX生成的設備編譯鏡像?

    我的硬件平臺是MP135,我現在想給它增加一個串口UART8,于是我打算修改設備。但是在使用SDK的時候我遇到了些問題。按照官方的`how to do.txt`,我編譯了u-boot,在
    發表于 05-31 14:41
    主站蜘蛛池模板: 1000部啪啪未满十八勿入 | 69pao强力打造在线 | 色婷婷激婷婷深爱五月老司机 | 亚洲第一精品夜夜躁人人爽 | 色在线网 | 生活片黄色 | 美女被色 | 老司机午夜永久在线观看 | 四虎hu| 天天干小说 | 女性一级全黄生活片免费看 | 狠狠狠色丁香婷婷综合久久88 | 欧美黄色免费 | 狠狠躁夜夜躁人人爽天天段 | 国产精品莉莉欧美自在线线 | 一级片在线免费观看 | 亚洲福利一区福利三区 | 欧美爱爱网 | 天天视频国产免费入口 | 久久久久久久成人午夜精品福利 | 免费无码看av的网站 | 天天操天天插 | 97影院理论片在线观看 | 久久久久久全国免费观看 | 看日本黄大片在线观看 | 美女一区二区三区 | 亚洲国产日韩精品怡红院 | 性喷潮久久久久久久久 | 成人v片| 在线观看一区二区三区视频 | 欧美一区亚洲二区 | 综合99| 日本中文在线三级在线播放 | 男人的天堂在线免费视频 | 狠狠狠色丁香婷婷综合久久88 | 成人免费一区二区三区 | 五月婷婷综合激情网 | 国产一级特黄aaaa大片野外 | 婷婷久 | 午夜精品久久久久久久第一页 | 国产精品天天爽夜夜欢张柏芝 |