Linux系統移植⑨:uboot啟動流程詳解-bootz啟動Linux過程

Linux系統移植⑨:uboot啟動流程詳解-bootz啟動Linux過程

bootz 是 U-Boot 中用于啟動 Linux 內核的命令,專為處理 zImage(壓縮內核映像) 設計。


啟動 Linux 的完整過程:

1. 加載內核與相關文件

U-Boot 先將以下文件加載到內存指定地址:

  • zImage:壓縮的 Linux 內核映像(位于內存地址 KERNEL_ADDR)。
  • 設備樹二進制文件(DTB):硬件描述文件(位于 FDT_ADDR)。
  • initramfs(可選):初始內存文件系統(位于 INITRD_ADDR)。

2. 執行 bootz 命令

bootz [內核地址] [initramfs地址]:[大小] [設備樹地址]

  • 啟動命令

    bootz ${KERNEL_ADDR} ${INITRD_ADDR}:${INITRD_SIZE} ${FDT_ADDR}

    若無需 initramfs:
    bootz ${KERNEL_ADDR} - ${FDT_ADDR}

3. zImage 自解壓

  • U-Boot 跳轉到 KERNEL_ADDR,執行 zImage 頭部的小型解壓程序。
  • 解壓程序將內核解壓到預設的 物理內存地址(如 ARM 架構通常為 0x8000)。

4. 傳遞啟動參數

U-Boot 通過寄存器/設備樹傳遞關鍵參數:

架構寄存器參數說明
ARMr00(保留)
r1機器 ID(舊)或 0xFFFFFFFF(新)
r2設備樹地址(FDT_ADDR
RISC-Va0設備樹地址
a10(保留)

設備樹(DTB) 包含 CPU、內存、外設等硬件信息,內核據此初始化硬件。


5. 內核初始化

Linux 內核接管后執行:

  1. 硬件初始化:基于 DTB 設置 CPU、內存控制器、時鐘等。
  2. 驅動加載:識別并初始化存儲、網絡等設備驅動。
  3. 掛載根文件系統
    • 若有 initramfs,將其作為臨時根文件系統。
    • 否則直接掛載 root= 參數指定的文件系統(如 /dev/mmcblk0p2)。

6. 用戶空間啟動

  1. 內核啟動第一個用戶進程 /init(位于 initramfs 或根文件系統)。
  2. init 進程加載系統服務(如 systemd 或 SysVinit)。
  3. 最終進入登錄界面或指定應用。

關鍵依賴

  • zImage 格式:必須為 gzip 壓縮的 Image 文件(非 uImage)。
  • 設備樹支持:現代內核強制要求 DTB(無 DTB 的內核無法啟動)。
  • 地址對齊:內核/DTB 的加載地址需符合 CPU 架構要求(如 ARM 需 4KB 對齊)。

do_bootz源碼如下:

在這里插入圖片描述

其內部主要函數調用關系如下:

do_bootz
-> bootz_start
-> do_bootm_states 階段為BOOTM_STATE_START
-> bootm_start 對images全局變量清零,
-> images->ep = 0X80800000
->bootz_setup 判斷zImage是否正確
-> bootm_find_images
-> boot_get_fdt 找到設備樹,然后將設備樹起始地址和長度,寫入到images的ft_addr和ft_len成員變量中。
-> bootm_disable_interrupts 關閉中斷相關
-> images.os.os = IH_OS_LINUX; 表示要啟動Linux系統
-> do_bootm_states 狀態BOOTM_STATE_OS_PREP 、BOOTM_STATE_OS_FAKE_GO 、BOOTM_STATE_OS_GO,
-> bootm_os_get_boot_func 查找Linux內核啟動函數。找到Linux內核啟動函數do_bootm_linux,賦值給boot_fn。
-> boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images); 就是do_bootm_linux。
-> boot_prep_linux 啟動之前的一些工作,對于使用設備樹來說,他會將Bootargs傳遞給Linux內核,通過設備樹完成。也就是向Linux內核傳參。
-> boot_selected_os BOOTM_STATE_OS_GO, do_bootm_linux
-> do_bootm_linux,BOOTM_STATE_OS_GO
-> boot_jump_linux
-> machid= gd->bd->bi_arch_number;
-> void (kernel_entry)(int zero, int arch, uint params);
-> kernel_entry = (void (
)(int, int, uint))images->ep; 0X80800000。
-> announce_and_cleanup 輸出Starting kernel……
-> kernel_entry(0, machid, r2); 啟動Linux內核。 Uboot的最終使命,啟動Linux內核。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909748.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【R】基于R實現貝葉斯分析(一)

文章目錄 貝葉斯簡介Why R理論基礎一、三種先驗分布和對應后驗的計算1. 離散先驗2.Beta先驗(共軛先驗)3. 直方圖先驗 二. 后驗抽樣1. 網格點采樣法2. 其他方法 三、貝葉斯推斷1. 參數估計(1) 后驗均值(2) 后驗方差(3) 后驗區間 2. 假設檢驗3. 預測(1) 先…

論文略讀:Personality Alignment of Large Language Models

ICLR 2025 558 當前的大語言模型(LLMs)在對齊時,通常旨在反映普遍的人類價值觀與行為模式,但卻常常無法捕捉到個體用戶的獨特特征與偏好。 為填補這一空白,本文提出了**“人格對齊(Personality Alignment&…

JSON與XML怎么選?什么情況下會用到 JSON?

一、JSON 與 XML 的核心區別 從 語法、性能、適用場景 等維度對比,核心差異如下: 對比維度JSONXML語法結構鍵值對格式(如 {"name": "無線耳機"}),無標簽,結構緊湊。標簽嵌套格式&…

PCB設計實踐(三十六)PCB設計新手系統性注意事項總結

以下是PCB設計的系統性注意事項總結,涵蓋布局、布線、電源/地處理、EMC、制造工藝及驗證等關鍵環節,依據行業規范與最佳實踐整理: 一、布局設計規范 器件優先級策略 先固定接口器件(電源插座、連接器),鎖定…

LangChain中的向量數據庫抽象基類-VectorStore

文章目錄 前言一、原型定義二、常用說明1、添加或更新文檔2、添加或更新文本3、通過文檔初始化VectorStore對象4、通過文本初始化VectorStore對象5、獲得VectorStoreRetriever對象6、查詢最相似的文檔三、代碼解析1、add_documents方法2、add_texts方法3、from_documents方法4、…

5G光網絡新突破:<Light: Science Applications>報道可適應環境擾動的DRC實時校準技術

前言摘要 近日,國際頂尖光學期刊《Light: Science & Applications》刊登了一項來自中國國防科技大學研究團隊的重要成果。該團隊由姜天教授、張軍教授和郝浩教授領銜,成員包括嚴秋全、歐陽灝(共同一作)等研究人員。他們提出了…

C++:Hash拓展--布隆過濾器

布隆過濾器 問題前景: 之前學習了位圖,我們知道位圖在大量數據查找時候是很方便的。但位圖的缺陷在于只能用于整型數據。而在實際中,我們的數據更多的是更復雜的字符串或者自定義類型。那么此時位圖就顯得有點無力,所以就誕生了叫布隆過濾器…

快速了解JVM中的深堆與淺堆

在Java虛擬機(JVM)的內存管理世界里,深堆與淺堆是兩個重要的概念。它們如同衡量對象內存占用的兩把標尺,對于優化程序性能、排查內存泄漏問題起著關鍵作用。接下來,讓我們快速且深入地了解它們。 一、淺堆&#xff08…

開疆智能ModbusTCP轉Devicenet網關連接FANUC機器人配置案例

本案例是ModbusTCP主站通過開疆智能ModbusTCP轉Devicenet網關連接發那科機器人的配置案例,操作分為三個配置1:ModbusTCP主站配置2:ModbusTCP轉Devicenet網關配置3:FANUC機器人配置,具體過程如下 配置過程 主菜單—IO—…

詳解RabbitMQ高級特性之發送方確認機制

目錄 發送方確認 添加配置 常量類 聲明隊列和交換機并綁定二者關系 confirm確認模式 編寫生產消息代碼 生產消息1 解決方法 多次生產消息2 解決方法 生產消息3 return 模式 編寫生產消息代碼(路由正確) 生產消息1 編寫生產消息代碼&…

Google Play開發者賬號8.3/10.3政策違規自救指南

最近,有一位開發者焦急地向我們訴說,其辛苦開發的多個應用,毫無征兆地全部下架,賬戶提示違反政策 8.3 和 10.3。經過連夜排查,原來是換皮應用與誤導性描述導致的問題。 這并非個例,在 2024 年,G…

pythonday50

作業: 1.好好理解下resnet18的模型結構 2.嘗試對vgg16cbam進行微調策略 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torchvision import models from torch.utils.d…

天貓618高增長背后:電商邁入價值戰新周期

作者 | 曾響鈴 文 | 響鈴說 這次618,來“真”的了。 天貓618玩法變得極致簡單,只設了“官方立減”的85折的基礎優惠,再疊加行業品類券、國補等優惠,最高立減可達50%,十分直觀。 讓消費者省心的結果也是顯而易見的&…

tauri+vue自動更新客戶端打包配置

拉取最新代碼打開項目根目錄下"~.tauri\myapp.key"文件并復制內容 打開項目的powershell窗口,輸入如下內容并回車 $env:TAURI_SIGNING_PRIVATE_KEY"復制的myapp.key" $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD""然后修改tauri.conf.…

硬件------51單片機

一.基本概念 1.裸機程序 BSP BSP:bord suppord pack 板級支持包 就是程序編寫的內容是沒有操作系統的,直接通過代碼去控制寄存器,讓硬件按照要求去工作。 主要內容:51單片機 IMAX6ULL 2.linux驅動部分 在裸機BSP程序的基礎…

java 基礎方法 list分頁

新增一個list 泛型分類方法 hutools沒這個方法, mybatis 里面的方法不好用 故新增此方法 package com.common.base.util.page;import lombok.Data;import java.util.List;/*** className: VoPage* description: list分頁* author: chenyuanlong* date: 2025年6月16日 0016 上午…

操作系統期末復習--操作系統初識以及進程與線程

操作系統概念與主要功能 操作系統的概念 在信息化時代,軟件是計算機系統的靈魂,而作為軟件核心的操作系統,已與現代計算機系統密不可分、融為一體。計算機系統自下而上大致分為4部分:硬件、操作系統、應用程序和用戶 操作系統管…

使用jhat查看dump.hprof文件內具體對象的屬性值信息

jhat是JDK自帶的堆轉儲分析工具,可以用來查看.hprof文件中對象的具體內容。本文演示使用的是JKD8. 一、啟動jhat 執行啟動命令。 jhat -J-Xmx4g your_heap_dump.hprof -J-Xmx4g表示為jhat分配4GB內存,根據你自己情況調整大小。your_heap_dump.hprof是…

freeRTOS之隊列(queue)

一.概述 1.介紹 隊列(queue)可以用于"任務到任務"、“任務到中斷”、"中斷到任務"直接傳輸信息。 2.核心功能 線程安全:自動處理多任務訪問時的互斥問題。 數據復制:入隊時復制數據(而非引用),…

【python】typing用法

一、基礎類型提示 1. 基本類型注解 # 變量類型注解 age: int 30 name: str "Alice" is_student: bool False height: float 1.752. 函數注解 def greet(name: str, age: int) -> str:return f"Hello {name}, you are {age} years old!"二、組合類…