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

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

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

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

RK3576 Linux?內(nèi)核?init?目錄深度解析:從內(nèi)核入口到用戶空間啟動

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-04-06 10:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文章導讀:本文深入剖析RK3576平臺Linux 6.1內(nèi)核的init目錄代碼,從內(nèi)核入口到用戶空間啟動,完整拆解嵌入式Linux的啟動底層邏輯,涵蓋目錄架構(gòu)、核心文件、啟動流程、配置調(diào)試等全維度內(nèi)容,適合內(nèi)核開發(fā)者、嵌入式工程師以及對系統(tǒng)啟動流程感興趣的技術(shù)人員。

一、引言:為什么init目錄如此重要?

當按下電源鍵,RK3576開發(fā)板從“無響應(yīng)”到進入Linux命令行,這一過程的核心調(diào)度者就是init目錄。它是Linux內(nèi)核啟動的“市政廳”,承接從匯編代碼到C代碼的跳轉(zhuǎn),完成系統(tǒng)基礎(chǔ)環(huán)境搭建,最終啟動第一個用戶進程,是內(nèi)核空間到用戶空間的關(guān)鍵橋梁。

其核心職責可概括為5點:

?系統(tǒng)初始化:匯編跳轉(zhuǎn)到C代碼的第一個落腳點,統(tǒng)籌內(nèi)核各子系統(tǒng)啟動

?內(nèi)存管理:建立內(nèi)核內(nèi)存分配體系,初始化頁表、分配器等核心模塊

?文件系統(tǒng):解析啟動參數(shù),掛載根文件系統(tǒng),支持initramfs/initrd等臨時文件系統(tǒng)

?驅(qū)動加載:通過initcall機制按優(yōu)先級初始化所有硬件驅(qū)動

?進程創(chuàng)建:創(chuàng)建0號、1號、2號核心進程,啟動第一個用戶空間init進程

二、init目錄架構(gòu)全景圖

RK3576所基于的Linux 6.1內(nèi)核中,init目錄包含13個核心文件,各文件分工明確、相互配合,構(gòu)成內(nèi)核啟動的核心框架,文件結(jié)構(gòu)及核心功能如下:

kernel-6.1/init/├── main.c        #  核心:內(nèi)核啟動主流程,包含start_kernel()入口├── init_task.c      #  初始任務(wù)結(jié)構(gòu)體定義,定義PID 0的idle進程├── calibrate.c      #  延遲校準,計算BogoMIPS值和loops_per_jiffy├── version.c       #  內(nèi)核版本信息,定義版本字符串、編譯信息├── version-timestamp.c  #  構(gòu)建時間戳,自動生成編譯時間(Makefile調(diào)用)├── do_mounts.c      #  根文件系統(tǒng)掛載核心,解析root=參數(shù)├── do_mounts.h      #  掛載相關(guān)頭文件,定義掛載函數(shù)聲明和宏├── do_mounts_rd.c    #  RAM磁盤基礎(chǔ)處理,解析rd=參數(shù),初始化ramdisk├── do_mounts_initrd.c  #  initrd專用處理,掛載并執(zhí)行initrd內(nèi)的/linuxrc├── initramfs.c      #  initramfs解包與加載,處理臨時根文件系統(tǒng)├── noinitramfs.c     #  無initramfs時的兜底,創(chuàng)建最小化rootfs├── Kconfig        #  內(nèi)核配置選項,定義init目錄相關(guān)編譯開關(guān)└── Makefile       #  編譯規(guī)則,指定文件編譯依賴和生成邏輯
wKgZO2nTHQGACEnfAAD3Ew4WPUI440.jpg

三、核心概念:Linux內(nèi)核啟動三層架構(gòu)與關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

RK3576的Linux內(nèi)核啟動分為三個核心階段,從匯編啟動到C代碼初始化,再到用戶空間啟動,各階段銜接緊密,同時依賴三大核心數(shù)據(jù)結(jié)構(gòu)支撐,構(gòu)成啟動的基礎(chǔ)框架。

3.1啟動三層架構(gòu)與核心函數(shù)

┌─────────────────────────────────────────────────────────────────┐│         Linux內(nèi)核啟動流程核心框架          │├─────────────────────────────────────────────────────────────────┤│┌──────────────┐ ┌──────────────┐ ┌──────────────┐  │││ 第一階段  │───│ 第二階段  │───│ 第三階段  │  │││ 匯編啟動  │ │C代碼初始化│ │ 用戶空間啟動│  ││└──────────────┘ └──────────────┘ └──────────────┘  ││    │         │         │      ││    ▼         ▼         ▼      ││┌──────────────┐ ┌──────────────┐ ┌──────────────┐  │││setup_arch()│ │start_kernel()│ │kernel_init()│  │││ 架構(gòu)相關(guān)  │ │ init/main.c│ │ 第一個內(nèi)核 │  │││ 硬件初始化 │ │ 核心初始化 │ │ 線程啟動  │  ││└──────────────┘ └──────────────┘ └──────────────┘  ││               │         │      ││               ▼         ▼      ││           ┌──────────────┐ ┌──────────────┐  ││           │ rest_init()│──│ 運行/sbin/init│  ││           │創(chuàng)建init線程 │ │ 進入用戶空間 │  ││           └──────────────┘ └──────────────┘  │└─────────────────────────────────────────────────────────────────┘

?第一階段:架構(gòu)相關(guān)匯編代碼執(zhí)行,調(diào)用setup_arch()完成RK3576硬件初始化、設(shè)備樹解析、內(nèi)存布局設(shè)置;

?第二階段:進入start_kernel()(main.c),統(tǒng)籌初始化內(nèi)存、調(diào)度、中斷、VFS等核心子系統(tǒng),執(zhí)行所有initcall初始化函數(shù);

?第三階段:通過rest_init()創(chuàng)建內(nèi)核線程,最終調(diào)用/sbin/init進入用戶空間,完成啟動。

3.2三大核心數(shù)據(jù)結(jié)構(gòu)

所有進程、內(nèi)存、文件系統(tǒng)的初始化都基于以下三個基礎(chǔ)結(jié)構(gòu),是內(nèi)核啟動的“基石”:

?init_task:初始進程結(jié)構(gòu)體(PID 0),也叫idle/swapper進程,是所有進程的祖先,內(nèi)核線程的模板;

?init_mm:初始內(nèi)存描述符,建立內(nèi)核內(nèi)存管理的基礎(chǔ)框架,供內(nèi)核線程借用;

?init_fs:初始文件系統(tǒng)結(jié)構(gòu),定義根文件系統(tǒng)的基礎(chǔ)屬性,支撐后續(xù)文件系統(tǒng)掛載。

四、逐文件深度解析:init目錄核心邏輯

4.1 main.c -內(nèi)核啟動的“心臟”

文件定位:kernel-6.1/init/main.c(約900行)

核心功能

作為Linux內(nèi)核啟動的核心編排器,定義了start_kernel()這一核心入口,統(tǒng)籌所有子系統(tǒng)初始化,是C代碼層面內(nèi)核啟動的總控中心。

start_kernel()核心執(zhí)行流程

start_kernel()是內(nèi)核啟動的核心函數(shù),執(zhí)行順序嚴格遵循“基礎(chǔ)環(huán)境→子系統(tǒng)→初始化→進程創(chuàng)建”邏輯,RK3576的架構(gòu)特定代碼也在該流程中執(zhí)行:

wKgZO2nTHQKAYxqCAAEANh27rl4418.jpg

1.set_task_stack_end_magic(&init_task):設(shè)置初始任務(wù)棧結(jié)束魔數(shù),用于棧溢出檢測

2.smp_setup_processor_id():設(shè)置當前CPU ID,標識SMP系統(tǒng)中的啟動CPU

3.cgroup_init_early():早期cgroup初始化,為資源管理打下基礎(chǔ)

4.local_irq_disable():關(guān)閉本地中斷,進入臨界區(qū),保證初始化原子性

5.boot_cpu_init():標記啟動CPU為在線狀態(tài),完成CPU基礎(chǔ)初始化

6.setup_arch(&command_line):RK3576架構(gòu)專屬初始化,解析設(shè)備樹、設(shè)置內(nèi)存布局、初始化頁表、注冊平臺設(shè)備

7.setup_boot_config():解析bootconfig,處理額外的啟動配置參數(shù)

8.mm_init():內(nèi)存管理子系統(tǒng)初始化,初始化頁面分配器、SLAB/SLUB分配器、vmalloc

9.sched_init():進程調(diào)度器初始化,建立內(nèi)核進程調(diào)度框架

10.init_IRQ() / time_init():初始化中斷控制器和系統(tǒng)時鐘,建立中斷處理機制

11.console_init():控制臺初始化,此后內(nèi)核可通過printk輸出日志

12.vfs_caches_init():虛擬文件系統(tǒng)緩存初始化,為文件系統(tǒng)掛載做準備

13.do_initcalls():執(zhí)行所有__init修飾的初始化函數(shù),按8級優(yōu)先級執(zhí)行

14.rest_init():創(chuàng)建kernel_init(PID 1)和kthreadd(PID 2)進程,PID 0變?yōu)閕dle進程

關(guān)鍵機制:initcall初始化層級

do_initcalls()是驅(qū)動和子系統(tǒng)初始化的核心,通過8級優(yōu)先級確保依賴項先初始化,避免子系統(tǒng)啟動順序錯亂,RK3576的所有硬件驅(qū)動均通過該機制初始化,層級及用途如下:

┌─────────────────────────────────────────────────────────────────┐│           initcall 層級結(jié)構(gòu)              │├─────────────────────────────────────────────────────────────────┤│ 層級     優(yōu)先級  用途                  ││ ───────────────────────────────────────────────────────────── ││ pure    0    最早期初始化,不依賴任何其他子系統(tǒng)    ││ core    1    內(nèi)核核心子系統(tǒng)初始化           ││ postcore  2    核心子系統(tǒng)之后,架構(gòu)特定初始化之前    ││ arch    3    RK3576架構(gòu)特定初始化           ││ subsys   4    外設(shè)子系統(tǒng)初始化(PCI、USB、SD等)    ││ fs     5    文件系統(tǒng)子系統(tǒng)初始化(ext4、tmpfs等)  ││ device   6    硬件設(shè)備驅(qū)動初始化(RK3576外設(shè)驅(qū)動)  ││ late    7    最后階段初始化,依賴所有前置子系統(tǒng)    ││                                 ││ 使用示例:                           ││ staticint__initmy_driver_init(void){ ... }         ││ device_initcall(my_driver_init);// 驅(qū)動加入6級初始化      │└─────────────────────────────────────────────────────────────────┘

實現(xiàn)原理:通過宏將初始化函數(shù)放入內(nèi)核鏡像的特定段(如.initcall6.init),do_initcalls()遍歷各段依次執(zhí)行函數(shù),保證順序性。

關(guān)鍵代碼片段

定義了系統(tǒng)狀態(tài)機、啟動命令行、init進程參數(shù)等核心全局變量,是內(nèi)核啟動的基礎(chǔ)配置:

// 1. 系統(tǒng)啟動狀態(tài)機,標識內(nèi)核當前啟動階段enumsystem_statessystem_state __read_mostly;// 狀態(tài):SYSTEM_BOOTING(啟動中)、SYSTEM_SCHEDULING(調(diào)度器就緒)、SYSTEM_FREEING_INITMEM(釋放init內(nèi)存)、SYSTEM_RUNNING(正常運行)// 2. 啟動命令行處理,存儲U-Boot傳遞的啟動參數(shù)char__initdata boot_command_line[COMMAND_LINE_SIZE];char*saved_command_line;   // 保存原始命令行staticchar*static_command_line; // 用于參數(shù)解析的命令行// 3. init進程相關(guān)參數(shù),定義默認啟動程序和環(huán)境變量staticchar*execute_command;     // init=參數(shù)指定的自定義程序staticchar*ramdisk_execute_command ="/init"; // initrd/initramfs中的默認initstaticconstchar*argv_init[MAX_INIT_ARGS+2] = {"init",NULL, };constchar*envp_init[MAX_INIT_ENVS+2] = {"HOME=/","TERM=linux",NULL, };

4.2 init_task.c - 0號進程的“身份證”

文件定位:kernel-6.1/init/init_task.c

核心概念

定義了init_task結(jié)構(gòu)體,即Linux內(nèi)核的第一個進程(PID 0),也稱為idle進程或swapper進程。它是所有進程的祖先,內(nèi)核中所有進程均通過fork從它衍生,同時也是CPU空閑時執(zhí)行的進程,負責進入低功耗狀態(tài)。

wKgZO2nTHQKARVtjAABDfIs94bA592.jpg

核心數(shù)據(jù)結(jié)構(gòu)

init_task是struct task_struct類型的全局變量,包含進程調(diào)度、內(nèi)存管理、文件系統(tǒng)、信號處理等所有核心屬性,是內(nèi)核進程的“模板”,關(guān)鍵代碼如下:

// 初始信號結(jié)構(gòu),為PID 0提供基礎(chǔ)信號處理能力staticstructsignal_struct init_signals = {  .nr_threads =1,  .thread_head = LIST_HEAD_INIT(init_task.thread_node),  .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(init_signals.wait_chldexit),  .shared_pending = {    .list = LIST_HEAD_INIT(init_signals.shared_pending.list),    .signal = {{0}}  },  .rlim = INIT_RLIMITS, // 初始資源限制  .pids = {    [PIDTYPE_PID] = &init_struct_pid,    [PIDTYPE_TGID] = &init_struct_pid,    [PIDTYPE_PGID] = &init_struct_pid,    [PIDTYPE_SID] = &init_struct_pid,  },};// 核心:初始任務(wù)結(jié)構(gòu)體,定義PID 0的所有屬性structtask_struct init_task = {  .__state =0,          // 任務(wù)狀態(tài):運行中  .stack = init_stack,      // 指向初始棧空間  .usage = REFCOUNT_INIT(2),   // 引用計數(shù)  .flags = PF_KTHREAD,      // 標記為內(nèi)核線程
 // 調(diào)度相關(guān):默認普通分時調(diào)度,優(yōu)先級100  .prio = MAX_PRIO -20,  .static_prio = MAX_PRIO -20,  .normal_prio = MAX_PRIO -20,  .policy = SCHED_NORMAL,
 // CPU親和性:允許在所有CPU上運行(適配RK3576多核)  .cpus_ptr = &init_task.cpus_mask,  .cpus_mask = CPU_MASK_ALL,  .nr_cpus_allowed = NR_CPUS,
 // 內(nèi)存管理:內(nèi)核線程無用戶態(tài)內(nèi)存,借用init_mm  .mm = NULL,  .active_mm = &init_mm,
 // 進程關(guān)系:自身作為父進程(所有進程的祖先)  .real_parent = &init_task,  .parent = &init_task,  .group_leader = &init_task,
 // 文件系統(tǒng):綁定初始文件系統(tǒng)結(jié)構(gòu)  .fs = &init_fs,  .files = &init_files,
 // 信號處理與命名空間:綁定初始結(jié)構(gòu)  .signal = &init_signals,  .sighand = &init_sighand,  .nsproxy = &init_nsproxy,
 // 憑證與名稱:root權(quán)限,進程名"swapper"  .real_cred = &init_cred,  .cred = &init_cred,  .comm = INIT_TASK_COMM,  .thread = INIT_THREAD,     // RK3576架構(gòu)相關(guān)線程狀態(tài)};

init_task的生命周期

PID 0的生命周期貫穿內(nèi)核啟動全程,角色隨啟動階段動態(tài)變化:

1.匯編啟動階段:匯編代碼為init_task設(shè)置棧空間,完成基礎(chǔ)初始化;

2.C代碼初始化階段:start_kernel()中基于init_task完成各子系統(tǒng)初始化,此時它是內(nèi)核的“主進程”;

3.rest_init()階段:創(chuàng)建kernel_init(PID 1)和kthreadd(PID 2)后,init_task變?yōu)?b>idle進程;

4.運行階段:CPU無其他可運行進程時,執(zhí)行init_task的cpu_idle_loop(),進入低功耗狀態(tài),RK3576的每個CPU核心都有一個專屬的idle進程(swapper/n,n為CPU編號)。

4.3 calibrate.c - BogoMIPS計算的秘密

文件定位:kernel-6.1/init/calibrate.c

核心概念:BogoMIPS

BogoMIPS =Bogo(假的)+MIPS(每秒百萬條指令),并非CPU的實際性能指標,而是一個延遲校準值,用于計算udelay()、ndelay()等內(nèi)核延遲函數(shù)的循環(huán)次數(shù),保證延遲的準確性。

其核心計算目標是loops_per_jiffy(每個jiffies的循環(huán)次數(shù)),jiffies是內(nèi)核基本時間單位,通常1 jiffies = 1/HZ 秒(RK3576默認HZ=1000,即1ms)。

校準原理與優(yōu)先級

內(nèi)核提供5種校準方式,按精度從高到低、優(yōu)先級從高到低執(zhí)行,確保在不同硬件環(huán)境下都能得到準確的loops_per_jiffy:

1.預(yù)設(shè)值:用戶通過lpj=啟動參數(shù)指定,直接使用無需校準;

2.精確值:從定時器頻率計算得到lpj_fine,適配硬件定時器的高精度;

3.已知值:多核系統(tǒng)中,直接使用其他CPU已校準的結(jié)果;

4.直接校準:架構(gòu)支持read_current_timer時,通過硬件定時器直接計算;

5.收斂校準:通用方法,通過二分搜索調(diào)整lpj,精確到1/256 jiffies。

收斂校準核心算法:等待jiffies變化→執(zhí)行l(wèi)pj*band次空循環(huán)→檢查jiffies是否變化→過快則減少lpj,過慢則增加lpj→反復迭代直至達到精度要求。

關(guān)鍵代碼與計算示例

// 全局變量:存儲校準結(jié)果和預(yù)設(shè)值unsignedlongloops_per_jiffy = (1<<12); ?// 初始猜測值:4096unsigned?long?lpj_fine; ? ? ? ? ? ? ? ? ? ?// 硬件定時器計算的精確值unsigned?long?preset_lpj; ? ? ? ? ? ? ? ? ?// 用戶通過lpj=指定的預(yù)設(shè)值// 核心校準函數(shù)void?calibrate_delay(void){? ??unsigned?long?lpj;? ??// 按優(yōu)先級選擇校準方式? ??if?(preset_lpj) lpj = preset_lpj;? ??else?if?(lpj_fine) lpj = lpj_fine;? ??else?if?((lpj =?calibrate_delay_is_known())) ;? ??else?if?((lpj =?calibrate_delay_direct()) !=?0) ;? ??else?lpj =?calibrate_delay_converge();?// 通用兜底方案
? ? loops_per_jiffy = lpj;? ??// 打印BogoMIPS值,內(nèi)核啟動日志中可查看? ??pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)n",? ? ? ? lpj/(500000/HZ), (lpj/(5000/HZ)) %?100, lpj);}

BogoMIPS計算示例(RK3576默認HZ=1000)

若測得loops_per_jiffy=500000,則:

BogoMIPS= lpj / (500000/ HZ) =500000/ (500000/1000) =1000.00

表示RK3576的CPU每毫秒可執(zhí)行約50萬次簡單空循環(huán),延遲函數(shù)將基于此值計算循環(huán)次數(shù)。

4.4 do_mounts.c -根文件系統(tǒng)掛載核心

文件定位:kernel-6.1/init/do_mounts.c

核心職責

作為根文件系統(tǒng)掛載的核心,負責解析root=啟動參數(shù)、等待設(shè)備就緒自動探測文件系統(tǒng)類型掛載根文件系統(tǒng),是內(nèi)核空間進入用戶空間的關(guān)鍵一步,若掛載失敗,內(nèi)核會直接panic。

root=參數(shù)解析流程

name_to_dev_t()函數(shù)負責解析root=參數(shù),支持多種設(shè)備指定方式,適配RK3576的EMMC、SD卡、NFS、USB等多種根文件系統(tǒng)載體,解析順序如下:

┌─────────────────────────────────────────────────────────────────┐│         name_to_dev_t() 解析流程            │├─────────────────────────────────────────────────────────────────┤│ 輸入:root=參數(shù)值(如root=/dev/mmcblk0p1、root=PARTUUID=xxx)  ││ 1. 特殊設(shè)備名:/dev/nfs→網(wǎng)絡(luò)根、/dev/cifs→SMB根、/dev/ram→RAM盤 ││ 2. PARTUUID=xxx:通過分區(qū)UUID查找設(shè)備,支持PARTNROFF偏移    ││ 3. PARTLABEL=xxx:通過GPT分區(qū)標簽查找設(shè)備,無需記住設(shè)備名    ││ 4. /dev/xxx:直接指定設(shè)備名(如/dev/mmcblk0p1、/dev/sda1)   ││ 5. 設(shè)備號/16進制:主設(shè)備號:次設(shè)備號(如8:1)或16進制編碼(如b301)│└─────────────────────────────────────────────────────────────────┘

根文件系統(tǒng)核心掛載流程

prepare_namespace()是掛載根文件系統(tǒng)的總函數(shù),整合了設(shè)備等待、initrd/initramfs處理、實際掛載等所有邏輯,流程如下:

wKgZO2nTHQKAM0Q0AAELbjHbnG4564.jpg

1.rootdelay處理:若指定rootdelay=N,等待N秒再執(zhí)行掛載,解決設(shè)備探測延遲問題;

2.wait_for_device_probe():等待異步設(shè)備探測完成,確保根設(shè)備已被內(nèi)核識別;

3.md_run_setup():若配置RAID,完成RAID陣列初始化;

4.解析root=參數(shù):將解析結(jié)果賦值給ROOT_DEV,標識根設(shè)備;

5.initrd_load():若存在initrd,加載并執(zhí)行其內(nèi)部的/linuxrc;

6.rootwait處理:若指定rootwait,循環(huán)等待根設(shè)備出現(xiàn),直到設(shè)備就緒;

7.mount_root():實際掛載根文件系統(tǒng),自動探測ext4、tmpfs等文件系統(tǒng)類型,支持NFS/CIFS/塊設(shè)備;

8.devtmpfs_mount():掛載devtmpfs到/dev,創(chuàng)建設(shè)備節(jié)點;

9.init_chroot("."):將當前目錄設(shè)置為新的根目錄,完成根文件系統(tǒng)切換。

關(guān)鍵代碼:自動文件系統(tǒng)探測

內(nèi)核會自動獲取所有支持的塊設(shè)備文件系統(tǒng)類型,依次嘗試掛載,直到成功,確保無需手動指定文件系統(tǒng)類型,關(guān)鍵代碼如下:

// 自動探測并掛載塊設(shè)備根文件系統(tǒng)void__initmount_block_root(char*name,intflags){ char*fs_names; intnum_fs, i;
 // 獲取內(nèi)核支持的所有塊設(shè)備文件系統(tǒng)類型 if(root_fs_names)    num_fs = split_fs_names(fs_names, PAGE_SIZE, root_fs_names); else    num_fs = list_bdev_fs_names(fs_names, PAGE_SIZE);
 // 依次嘗試每種文件系統(tǒng)類型,掛載成功則直接返回 for(i =0, p = fs_names; i < num_fs; i++, p += strlen(p)+1) {? ? ? ? err = do_mount_root(name, p, flags, root_mount_data);? ? ? ??if?(err ==?0)? ? ? ? ? ??return;? ? }? ??// 所有類型嘗試失敗,內(nèi)核panic? ? panic("VFS: Unable to mount root fs on %s", b);}// 實際執(zhí)行掛載操作static?int?__init?do_mount_root(const?char?*name,?const?char?*fs,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const?int?flags,?const?void?*data){? ? ret = init_mount(name,?"/root", fs, flags, data_page);? ??if?(ret)?goto?out;
? ? init_chdir("/root");? ? s = current->fs->pwd.dentry->d_sb;  ROOT_DEV = s->s_dev; // 打印掛載成功日志,包含文件系統(tǒng)類型和設(shè)備號  printk(KERN_INFO"VFS: Mounted root (%s filesystem)%s on device %u:%u.n",     s->s_type->name, sb_rdonly(s) ?" readonly":"",     MAJOR(ROOT_DEV), MINOR(ROOT_DEV));}

4.5 initramfs.c -早期用戶空間的載體

文件定位:kernel-6.1/init/initramfs.c

核心概念:initramfs

initramfs(initial RAM filesystem)是臨時的內(nèi)存根文件系統(tǒng),在真正的根文件系統(tǒng)(如EMMC中的ext4)可用之前加載到內(nèi)存中,相當于系統(tǒng)啟動的“臨時指揮部”。

其核心作用是解決驅(qū)動依賴問題:若根文件系統(tǒng)所在的設(shè)備(如NVMe、SATA)需要特定驅(qū)動才能識別,而該驅(qū)動未編譯進內(nèi)核,可將驅(qū)動放入initramfs,先啟動initramfs加載驅(qū)動,再識別并掛載真實根文件系統(tǒng)。

wKgZO2nTHQKASvBdAADbLSmcErE148.jpg

initramfs的核心用途

1.加載根設(shè)備所需的驅(qū)動(SATA、NVMe、USB、網(wǎng)絡(luò)等);

2.解密LUKS加密的根文件系統(tǒng)分區(qū);

3.組裝軟件RAID/LVM邏輯卷;

4.支持網(wǎng)絡(luò)啟動,從NFS/iSCSI掛載根文件系統(tǒng);

5.提供系統(tǒng)救援模式,緊急修復根文件系統(tǒng)。

核心格式:CPIO(Newc)

initramfs采用CPIO Newc格式存儲,支持無壓縮或gzip/xz/bzip2壓縮,單個CPIO文件項由110字節(jié)固定頭部+文件名+文件數(shù)據(jù)+4字節(jié)對齊填充組成,結(jié)構(gòu)如下:

┌─────────────────────────────────────────────────────────────────┐│         initramfsCPIO格式解析(Newc)        │├─────────────────────────────────────────────────────────────────┤│ 固定頭部(110字節(jié),ASCII十六進制):              ││ 偏移 長度 字段     格式    示例值          ││0  6  c_magic    字符串  "070701"(Newc標識)   ││6  8  c_ino     十六進制 "00000001"(inode號)   ││14 8  c_mode    十六進制 "0000755"(可執(zhí)行權(quán)限)  ││22 8  c_uid     十六進制 "00000000"(root用戶)   ││30 8  c_gid     十六進制 "00000000"(root組)    ││38 8  c_nlink    十六進制 "00000001"(硬鏈接數(shù))   ││46 8  c_mtime    十六進制 "65432100"(時間戳)    ││54 8  c_filesize  十六進制 "00001234"(數(shù)據(jù)長度)   ││62-10240 設(shè)備號/校驗和 十六進制 "00000000"(默認值)   ││94 8  c_namesize  十六進制 "0000000b"(文件名長度)  ││102 8  c_check    十六進制 "00000000"(校驗和)    ││                                ││ 數(shù)據(jù)區(qū):                            ││110 可變  文件名    字符串  "./init"(以0結(jié)尾)    ││ 對齊 可變  文件數(shù)據(jù)   二進制   驅(qū)動/可執(zhí)行程序/腳本   ││ 對齊 -   填充    0x00   按4字節(jié)對齊,補全空位   ││                                ││ 結(jié)束標記:文件名為"TRAILER!!!"的空文件項,標識CPIO歸檔結(jié)束  │└─────────────────────────────────────────────────────────────────┘

核心流程:解包與執(zhí)行

populate_rootfs()是initramfs的核心解包函數(shù),屬于fs_initcall層級,在文件系統(tǒng)子系統(tǒng)初始化后執(zhí)行,流程如下:

1.檢查內(nèi)置initramfs:若編譯時將initramfs嵌入內(nèi)核(initramfs_start非空),直接解包到內(nèi)存;

2.處理外部initrd:若存在外部initrd(initrd_start非空),解包initrd鏡像;

3.創(chuàng)建默認設(shè)備:解包完成后,創(chuàng)建/dev、/proc、/sys等核心目錄和設(shè)備節(jié)點;

4.執(zhí)行/init:內(nèi)核切換到initramfs的根目錄,優(yōu)先執(zhí)行/init程序,由該程序負責加載驅(qū)動、識別并掛載真實根文件系統(tǒng);

5.切換真實根:若/init執(zhí)行完畢,內(nèi)核自動嘗試掛載root=指定的真實根文件系統(tǒng),完成切換。

核心代碼

// 解包initramfs到內(nèi)存根文件系統(tǒng)staticint__initpopulate_rootfs(void){ char*err; // 解包內(nèi)置initramfs(編譯時嵌入內(nèi)核) if(initramfs_start && !initrd_start) {    err = unpack_to_rootfs((char*)initramfs_start,               initramfs_end - initramfs_start,0);   if(err) panic("unpacking initramfs failed: %s", err);  } // 解包外部initrd鏡像 if(initrd_start) {    unsignedlonglen = initrd_end - initrd_start;    err = unpack_to_rootfs((char*)initrd_start, len,1);   if(err) pr_warn("unpacking initrd failed: %sn", err);  } // 創(chuàng)建核心目錄和設(shè)備節(jié)點,保證基礎(chǔ)運行環(huán)境  create_default_devices(); return0;}rootfs_initcall(populate_rootfs);// 加入fs_initcall層級

4.6 noinitramfs.c -無initramfs時的兜底方案

文件定位:kernel-6.1/init/noinitramfs.c

核心功能

當內(nèi)核未配置initramfs(CONFIG_NO_INITRAMFS=y)時,創(chuàng)建最小化的根文件系統(tǒng)(rootfs),基于tmpfs實現(xiàn),保證即使無外部根文件系統(tǒng),內(nèi)核也能進入緊急shell,避免直接panic。

核心代碼

// 創(chuàng)建最小化rootfs,作為無initramfs時的兜底staticint__initdefault_rootfs(void){ structvfsmount *mnt; // 掛載基于tmpfs的rootfs  mnt = vfs_kern_mount(&rootfs_fs_type, SB_KERNMOUNT,"rootfs", NULL); if(IS_ERR(mnt)) panic("Can't create rootfs"); // 將rootfs設(shè)置為當前根目錄  init_task.fs->root = dget(mnt->mnt_root);  init_task.fs->pwd = dget(mnt->mnt_root);  init_task.fs->mnt = mntget(mnt);  mntput(mnt); // 創(chuàng)建核心目錄:/dev(設(shè)備)、/root(root家目錄)  mkdir((constchar__user __force *)"/dev",0755);  mkdir((constchar__user __force *)"/root",0700); return0;}rootfs_initcall(default_rootfs);// 加入fs_initcall層級

4.7 do_mounts_rd.c & do_mounts_initrd.c - RAM磁盤專屬處理

這兩個文件是RAM磁盤和initrd的專屬處理模塊,互補配合,支撐傳統(tǒng)initrd的加載和執(zhí)行,是initramfs的早期替代方案。

4.7.1 do_mounts_rd.c:RAM磁盤基礎(chǔ)處理

?核心功能:初始化RAM磁盤設(shè)備,解析rd=啟動參數(shù)(如rd=/dev/ram0),加載傳統(tǒng)RAM磁盤鏡像;

?關(guān)鍵函數(shù):rd_load()-從指定介質(zhì)(SD/EMMC/USB)加載RAM磁盤鏡像到內(nèi)存;

?RK3576適配:支持從EMMC、SD卡、USB等多種介質(zhì)加載RAM磁盤,適配嵌入式場景。

4.7.2 do_mounts_initrd.c:initrd專用處理

?核心功能:處理外部initrd鏡像,掛載并執(zhí)行其內(nèi)部的/linuxrc程序;

?關(guān)鍵函數(shù):handle_initrd()-核心處理函數(shù),流程為:將initrd解壓到ramdisk→掛載ramdisk為根文件系統(tǒng)→執(zhí)行/linuxrc→/linuxrc執(zhí)行完畢后切換到真實根文件系統(tǒng);

?與initramfs的區(qū)別:initrd是塊設(shè)備鏡像,需要文件系統(tǒng)驅(qū)動(如ext2)才能解析;initramfs是CPIO歸檔,無需額外驅(qū)動,是現(xiàn)代內(nèi)核的推薦方案。

4.8 version.c & version-timestamp.c -內(nèi)核版本與編譯信息

4.8.1 version.c:內(nèi)核版本核心定義

?核心功能:定義內(nèi)核版本字符串、編譯信息、UTS命名空間,是cat /proc/version、uname -a等命令的信息來源;

?關(guān)鍵代碼:

// 內(nèi)核啟動banner,啟動日志中第一個版本信息const char linux_banner[] = "Linux version "UTS_RELEASE" ("LINUX_COMPILE_BY"@"  LINUX_COMPILE_HOST") ("LINUX_COMPILER") "UTS_VERSION"n";///proc/version對應(yīng)的版本字符串const char linux_proc_banner[] = "Linux version%s("LINUX_COMPILE_BY"@"  LINUX_COMPILE_HOST") ("LINUX_COMPILER")%sn";//UTS命名空間,包含主機名、內(nèi)核版本、架構(gòu)等信息struct uts_namespace init_uts_ns = {  .name = {    .sysname  = UTS_SYSNAME,  //"Linux"    .nodename  ="(none)",   //主機名,可通過hostname=啟動參數(shù)設(shè)置    .release  = UTS_RELEASE,  //內(nèi)核版本,如"6.1.0-rockchip"    .version  = UTS_VERSION,  //編譯版本號,如"#1 SMP PREEMPT"    .machine  = UTS_MACHINE,  //架構(gòu),RK3576為"aarch64"    .domainname = UTS_DOMAINNAME,//NIS域名,默認"(none)"  },};

4.8.2 version-timestamp.c:編譯時間戳

?核心功能:記錄內(nèi)核的編譯時間和日期,由Makefile自動生成,無需手動修改;

?生成邏輯:編譯時由scripts/mkcompile_h腳本生成,定義LINUX_COMPILE_TIME(編譯時間)和LINUX_COMPILE_DATE(編譯日期)兩個宏;

?示例內(nèi)容:

#defineLINUX_COMPILE_TIME"1536"#defineLINUX_COMPILE_DATE"Apr 06 2026"

4.9 Kconfig & Makefile -編譯配置與規(guī)則

4.9.1 Kconfig:init目錄編譯配置項

定義init目錄相關(guān)的內(nèi)核編譯開關(guān),可通過make menuconfig配置,RK3576嵌入式場景中常用的關(guān)鍵配置項如下:

配置項 核心含義 RK3576默認值
CONFIG_INITRAMFS_SOURCE 指定initramfs源文件/目錄路徑 filesystem/rootfs.cpio.gz
CONFIG_BLK_DEV_RAM 啟用RAM磁盤設(shè)備支持 y
CONFIG_INITRD 啟用initrd支持 y
CONFIG_NO_INITRAMFS 禁用initramfs,使用兜底rootfs n
CONFIG_INIT_ENV_ARG_LIMIT init進程的參數(shù)數(shù)量限制 32
CONFIG_INIT_DEBUG 啟用啟動調(diào)試輸出,打印詳細日志 n(調(diào)試時設(shè)為y)
CONFIG_CALIBRATE_DELAY 啟用BogoMIPS延遲校準 y
CONFIG_INITCALL_ASYNC 異步執(zhí)行initcall,加快啟動速度 y(RK3576優(yōu)化)

4.9.2 Makefile:init目錄編譯規(guī)則

定義init目錄的文件編譯依賴、生成邏輯,自動處理版本時間戳等動態(tài)生成文件,核心規(guī)則如下:

# 基礎(chǔ)編譯文件:所有場景都編譯的核心文件obj-y := main.o init_task.o calibrate.o version.o# 條件編譯文件:根據(jù)Kconfig配置開關(guān)編譯obj-$(CONFIG_INITRAMFS)+= initramfs.oobj-$(CONFIG_BLK_DEV_RAM)+= do_mounts_rd.oobj-$(CONFIG_INITRD)+= do_mounts_initrd.oobj-$(CONFIG_SYSFS)+= do_mounts.oobj-$(CONFIG_NO_INITRAMFS)+= noinitramfs.o# 版本時間戳文件自動生成:由scripts/mkcompile_h腳本創(chuàng)建version-timestamp.o: .version.timestamp.version.timestamp:  @$(CONFIG_SHELL)$(srctree)/scripts/mkcompile_h$@   $(KERNELRELEASE)$(CONFIG_SMP)$(PREEMPT)

?編譯方式:單獨編譯init目錄可執(zhí)行make init/;

?生成產(chǎn)物:編譯后生成init/built-in.o,鏈接到內(nèi)核鏡像中。

五、RK3576 Linux 6.1完整啟動流程(從上電到用戶空間)

結(jié)合init目錄的核心邏輯,RK3576的Linux內(nèi)核啟動是一個硬件→Bootloader→內(nèi)核匯編→內(nèi)核C代碼→根文件系統(tǒng)→用戶空間的完整流程,各階段無縫銜接,init目錄在內(nèi)核C代碼→根文件系統(tǒng)階段起核心作用,完整流程如下:

階段1:硬件啟動與Bootloader執(zhí)行(ROM → U-Boot)

1.RK3576上電,片上ROM加載MiniLoader,初始化DDR、EMMC等基礎(chǔ)硬件;

2.MiniLoader加載U-Boot到DDR,U-Boot完成板級初始化(網(wǎng)卡、串口、SD卡);

3.U-Boot加載內(nèi)核鏡像(Image)和設(shè)備樹(rk3576.dtb)到指定內(nèi)存地址;

4.U-Boot執(zhí)行bootcmd,傳遞啟動參數(shù)(如root=/dev/mmcblk0p1 init=/sbin/init),跳轉(zhuǎn)到內(nèi)核匯編入口。

階段2:內(nèi)核匯編啟動(arch/arm64/kernel/head.S)

1.設(shè)置ARM64異常向量表、內(nèi)核棧、MMU(一級頁表),開啟地址映射;

2.解析U-Boot傳遞的啟動參數(shù)和設(shè)備樹,傳遞給setup_arch();

3.調(diào)用setup_arch()完成RK3576架構(gòu)特定初始化,跳轉(zhuǎn)到start_kernel()(init/main.c),進入C代碼初始化階段。

階段3:內(nèi)核C代碼初始化(init/main.c核心)

1.start_kernel()執(zhí)行基礎(chǔ)環(huán)境初始化:棧檢測、CPU標識、中斷關(guān)閉、內(nèi)存管理、調(diào)度器、中斷、控制臺、VFS等;

2.執(zhí)行do_initcalls(),按8級優(yōu)先級初始化RK3576的所有硬件驅(qū)動和子系統(tǒng);

3.調(diào)用rest_init(),創(chuàng)建kernel_init線程(PID 1,第一個用戶態(tài)進程的父進程)和kthreadd線程(PID 2,內(nèi)核線程管理進程);

4.PID 0(init_task)變?yōu)閕dle進程,CPU空閑時執(zhí)行低功耗邏輯。

階段4:根文件系統(tǒng)掛載(init/do_mounts*.c + initramfs.c)

1.kernel_init線程調(diào)用prepare_namespace(),解析root=啟動參數(shù),等待根設(shè)備就緒;

2.若配置initramfs/initrd,解包并執(zhí)行/init(或/linuxrc),加載根設(shè)備所需驅(qū)動;

3.自動探測文件系統(tǒng)類型,掛載root=指定的真實根文件系統(tǒng)(EMMC/SD/NFS);

4.掛載devtmpfs到/dev,創(chuàng)建設(shè)備節(jié)點,完成根文件系統(tǒng)切換。

階段5:用戶空間啟動

1.內(nèi)核執(zhí)行/sbin/init(或init=指定的程序),進入用戶空間;

2.init進程執(zhí)行系統(tǒng)初始化腳本(如/etc/rc.d),啟動網(wǎng)絡(luò)、外設(shè)、服務(wù)等;

3.啟動登錄終端或圖形界面,RK3576開發(fā)板進入可操作狀態(tài),啟動完成。

六、RK3576平臺專屬優(yōu)化

Linux 6.1內(nèi)核針對RK3576的硬件特性做了多項專屬優(yōu)化,主要集中在init目錄中,大幅提升啟動速度和硬件適配性,核心優(yōu)化點如下:

6.1命令行分段打印優(yōu)化

針對RK3576啟動參數(shù)可能過長的問題,在main.c中添加架構(gòu)專屬處理,將超長命令行分段打印,避免日志截斷:

#ifdefCONFIG_ARCH_ROCKCHIP{ constchar*s = saved_command_line; constchar*e = &saved_command_line[strlen(saved_command_line)]; intn =pr_notice("Kernel command line: %sn", saved_command_line);  n -=strlen("Kernel command line: ");  s += n; // 命令行過長時分段打印 while(n >0&& s < e) {? ? ? ? n =?pr_cont("%sn", s);? ? ? ? s += n;? ? }}#else? ??pr_notice("Kernel command line: %sn", saved_command_line);#endif#ifdef?CONFIG_ARCH_ROCKCHIP{? ??const?char?*s = saved_command_line;? ??const?char?*e = &saved_command_line[strlen(saved_command_line)];? ??int?n =?pr_notice("Kernel command line: %sn", saved_command_line);? ? n -=?strlen("Kernel command line: ");? ? s += n;? ??// 命令行過長時分段打印? ??while?(n >0&& s < e) {? ? ? ? n =?pr_cont("%sn", s);? ? ? ? s += n;? ? }}#else? ??pr_notice("Kernel command line: %sn", saved_command_line);#endif

6.2 Thunder Boot啟動加速

啟用CONFIG_ROCKCHIP_THUNDER_BOOT后,將memblock內(nèi)存塊的釋放推遲到后臺線程執(zhí)行,減少啟動過程中的阻塞,提升啟動速度:

#ifdefCONFIG_ROCKCHIP_THUNDER_BOOT_DEFER_FREE_MEMBLOCK kthread_run(defer_free_memblock,NULL,"defer_mem");#endif

6.3硬件解壓縮支持

在initramfs.c中適配RK3576的硬件解壓縮模塊,利用硬件加速initramfs的解包過程,大幅提升解壓縮速度:

#ifdefined(CONFIG_ROCKCHIP_THUNDER_BOOT) && defined(CONFIG_ROCKCHIP_HW_DECOMPRESS)  wait_initrd_hw_decom_done();#endif

6.4異步initcall執(zhí)行

啟用CONFIG_INITCALL_ASYNC,并行執(zhí)行無依賴的initcall初始化函數(shù),減少串行初始化的時間消耗,RK3576默認啟用該配置。

七、調(diào)試實戰(zhàn):init目錄相關(guān)問題排查技巧

針對RK3576內(nèi)核啟動過程中init目錄相關(guān)的問題(如根文件系統(tǒng)掛載失敗、initcall執(zhí)行異常、啟動速度慢),提供以下實戰(zhàn)調(diào)試技巧,快速定位問題。

7.1啟動參數(shù)調(diào)試:添加關(guān)鍵參數(shù)

通過U-Boot修改bootargs,添加調(diào)試參數(shù),開啟詳細日志或強制進入緊急shell,核心調(diào)試參數(shù)如下:

?initcall_debug:打印每個initcall函數(shù)的執(zhí)行時間,定位慢啟動的初始化函數(shù);

?init=/bin/sh:跳過正常的/sbin/init,直接進入緊急shell,排查根文件系統(tǒng)掛載后的環(huán)境問題;

?rootdelay=10:延遲10秒掛載根文件系統(tǒng),解決RK3576設(shè)備探測延遲導致的掛載失??;

?rootwait:循環(huán)等待根設(shè)備出現(xiàn),直到設(shè)備就緒,適用于熱插拔設(shè)備作為根文件系統(tǒng);

?debug:開啟內(nèi)核全局調(diào)試輸出,打印更多啟動日志;

?earlyprintk:啟用早期打印,在控制臺初始化前就輸出日志,排查早期啟動崩潰問題;

?lpj=500000:預(yù)設(shè)loops_per_jiffy值,跳過BogoMIPS校準,節(jié)省啟動時間。

7.2關(guān)鍵日志分析:過濾核心信息

通過dmesg過濾init目錄相關(guān)的核心日志,快速定位問題,常用過濾命令如下:

# 查看所有initcall函數(shù)的執(zhí)行日志,包括執(zhí)行時間dmesg |grep-i initcall# 查看根文件系統(tǒng)掛載日志,確認是否掛載成功、文件系統(tǒng)類型dmesg |grep-i"VFS: Mounted root"# 查看BogoMIPS校準結(jié)果,確認延遲校準是否正常dmesg |grep-i bogo# 查看啟動命令行,確認U-Boot傳遞的參數(shù)是否正確dmesg |grep-i"Kernel command line"# 查看initramfs/initrd解包日志,排查解包失敗問題dmesg |grep-i initramfs|initrd

7.3內(nèi)核編譯與反匯編調(diào)試

?單獨編譯init目錄:修改init目錄代碼后,無需全量編譯內(nèi)核,執(zhí)行make init/即可快速編譯;

?開啟調(diào)試配置:設(shè)置CONFIG_INIT_DEBUG=y,重新編譯內(nèi)核,開啟init目錄的詳細調(diào)試輸出;

?反匯編分析:對init/main.o進行反匯編,分析start_kernel()的執(zhí)行流程,命令如下:

objdump -D init/main.o>main.S

?內(nèi)核鏡像分析:查看內(nèi)核鏡像中initcall相關(guān)段的分布,確認初始化函數(shù)是否正確加入,命令如下:

readelf-S vmlinux | grep initcall

7.4常見問題排查

1.根文件系統(tǒng)掛載失?。╬anic: VFS: Unable to mount root fs)

?檢查root=參數(shù)是否正確,設(shè)備名是否與RK3576的實際設(shè)備匹配;

?添加rootdelay=10或rootwait,解決設(shè)備探測延遲;

?確認內(nèi)核已編譯該文件系統(tǒng)的驅(qū)動(如ext4、nfs)。

2.initramfs解包失敗

?檢查initramfs的CPIO格式是否為Newc,是否壓縮過度;

?確認內(nèi)核配置CONFIG_INITRAMFS_SOURCE指向正確的文件;

?查看dmesg日志,確認解包失敗的具體原因(如文件損壞、內(nèi)存不足)。

3.啟動速度過慢

?添加initcall_debug,定位執(zhí)行時間過長的initcall函數(shù);

?啟用CONFIG_INITCALL_ASYNC,并行執(zhí)行無依賴的初始化函數(shù);

?預(yù)設(shè)lpj=值,跳過BogoMIPS校準;

?精簡initramfs,只保留根設(shè)備所需的核心驅(qū)動。

八、核心要點回顧

1.init目錄是內(nèi)核啟動的“總控中心”:從start_kernel()到根文件系統(tǒng)掛載,再到用戶進程啟動,所有核心邏輯均由init目錄統(tǒng)籌;

2.main.c是核心中的核心:定義start_kernel()入口,通過do_initcalls()按8級優(yōu)先級初始化所有子系統(tǒng)和驅(qū)動;

3.init_task(PID 0)是所有進程的祖先:啟動初期是主進程,后期變?yōu)閕dle進程,CPU空閑時執(zhí)行低功耗邏輯;

4.initcall機制是初始化的“骨架”:8級優(yōu)先級確保依賴項先初始化,RK3576的所有硬件驅(qū)動均通過該機制啟動;

5.根文件系統(tǒng)掛載是跨空間的關(guān)鍵:do_mounts.c解析root=參數(shù),自動探測文件系統(tǒng),initramfs解決驅(qū)動依賴問題;

6.RK3576專屬優(yōu)化提升啟動性能:命令行分段打印、Thunder Boot、硬件解壓縮、異步initcall,大幅縮短啟動時間;

7.BogoMIPS是校準值非性能指標:用于計算延遲函數(shù)的循環(huán)次數(shù),而非CPU的實際運算能力。

九、參考資源

1.內(nèi)核官方文檔

?Documentation/admin-guide/init.rst:內(nèi)核初始化指南

?Documentation/admin-guide/initrd.rst:initrd/initramfs使用指南

?Documentation/admin-guide/bootconfig.rst:啟動參數(shù)配置指南

2.RK3576官方文檔

?RK3576 Technical Reference Manual(TRM):硬件手冊

?Rockchip Linux SDK開發(fā)指南:平臺適配指南

3.相關(guān)內(nèi)核源碼

?arch/arm64/kernel/setup.c:RK3576架構(gòu)特定初始化

?kernel/sched/core.c:進程調(diào)度器實現(xiàn)

?mm/page_alloc.c:內(nèi)存頁面分配器實現(xiàn)

?fs/vfs.c:虛擬文件系統(tǒng)核心邏輯

本文基于RK3576平臺Linux 6.1內(nèi)核源碼完成全維度解析,涵蓋init目錄的所有核心文件、機制和流程,若需針對某一具體函數(shù)、場景做更深入的拆解,可結(jié)合實際需求進一步分析。

審核編輯 黃宇

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

    關(guān)注

    88

    文章

    11807

    瀏覽量

    219510
  • rk3576
    +關(guān)注

    關(guān)注

    1

    文章

    292

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    RK3576 單板機 LinuxSDK 開發(fā)與系統(tǒng)定制手冊(二)

    本文為創(chuàng)龍科技RK3576 單板機 Linux 系統(tǒng)開發(fā)指南,涵蓋 SDK 搭建、內(nèi)核與引導程序開發(fā)、根文件系統(tǒng)修改、鏡像打包、分區(qū)配置及硬件資源調(diào)優(yōu)等全流程。提供命令實操、參數(shù)說明與故障處理,支持系統(tǒng)
    的頭像 發(fā)表于 04-16 15:39 ?135次閱讀
    <b class='flag-5'>RK3576</b> 單板機 LinuxSDK 開發(fā)與系統(tǒng)定制手冊(二)

    RK3576 單板機 LinuxSDK 開發(fā)與系統(tǒng)定制手冊(一)

    本文為創(chuàng)龍科技RK3576 單板機 Linux 系統(tǒng)開發(fā)指南,涵蓋 SDK 搭建、內(nèi)核與引導程序開發(fā)、根文件系統(tǒng)修改、鏡像打包、分區(qū)配置及硬件資源調(diào)優(yōu)等全流程。提供命令實操、參數(shù)說明與故障處理,支持系統(tǒng)
    的頭像 發(fā)表于 04-15 11:18 ?188次閱讀
    <b class='flag-5'>RK3576</b> 單板機 LinuxSDK 開發(fā)與系統(tǒng)定制手冊(一)

    迅為電子RK系列開發(fā)板SDK內(nèi)核正式升級至6.1 LTS版本

    迅為RK3568、RK3588、RK3576、RK3562系列開發(fā)板,SDK內(nèi)核5.10版本正
    的頭像 發(fā)表于 03-16 16:18 ?472次閱讀

    初次編譯rk3568(rk3576Linux 6.1內(nèi)核踩坑記錄:報錯終止到成功解決的完整流程

    很多剛接觸瑞芯微 rk 系列芯片開發(fā)的小伙伴,在初次編譯基于 Linux 6.1 內(nèi)核的系統(tǒng)時,很容易因為環(huán)境依賴問題卡殼。最近我在編譯 rk3576
    的頭像 發(fā)表于 02-06 16:47 ?3140次閱讀
    初次編譯<b class='flag-5'>rk</b>3568(<b class='flag-5'>rk3576</b>)<b class='flag-5'>Linux</b> 6.1<b class='flag-5'>內(nèi)核</b>踩坑記錄:<b class='flag-5'>從</b>報錯終止到成功解決的完整流程

    瑞芯微RK3576基于Linux平臺CUPS架構(gòu)標準打印機適配實戰(zhàn)教程

    RK3576是一款中高端八核Arm國產(chǎn)處理器,原廠配套LinuxKernel6.1內(nèi)核。觸覺智能旗下RK3576核心板/開發(fā)板、行業(yè)主板,率先適配支持開源鴻蒙、
    的頭像 發(fā)表于 01-16 17:45 ?725次閱讀
    瑞芯微<b class='flag-5'>RK3576</b>基于<b class='flag-5'>Linux</b>平臺CUPS架構(gòu)標準打印機適配實戰(zhàn)教程

    迅為如何在RK3576上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)

    迅為如何在RK3576開發(fā)板上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)
    的頭像 發(fā)表于 11-25 14:06 ?1950次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)

    如何米爾RK3576開發(fā)板上移植EtherCAT Igh

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微 RK3576開發(fā)板)的板端移植EtherCAT Igh方案的開發(fā)測試。摘自優(yōu)秀創(chuàng)作者-EPTmachine米爾基于瑞芯微RK3576
    發(fā)表于 09-26 16:02

    如何移植EtherCAT Igh--基于米爾RK3576開發(fā)板

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微RK3576開發(fā)板)的板端移植EtherCATIgh方案的開發(fā)測試。摘自優(yōu)秀創(chuàng)作者-EPTmachine米爾基于瑞芯微RK3576
    的頭像 發(fā)表于 09-26 08:04 ?1w次閱讀
    如何移植EtherCAT Igh--基于米爾<b class='flag-5'>RK3576</b>開發(fā)板

    【作品合集】米爾RK3576開發(fā)板測評

    測試 作者:魯治驛【米爾RK3576開發(fā)板免費體驗】測評綜合解析 【米爾RK3576開發(fā)板免費體驗】集成MQ-2煙霧傳感器和ADS1263模塊實現(xiàn)氣體監(jiān)測 【米爾RK3576開發(fā)板免費
    發(fā)表于 09-11 10:19

    【作品合集】靈眸科技EASY EAI Orin Nano(RK3576)開發(fā)板測評

    【EASY EAI Orin Nano(RK3576)開發(fā)板試用體驗】01-開箱報告及開發(fā)環(huán)境準備 【EASY EAI Orin Nano(RK3576)開發(fā)板試用體驗】02-拓展空間內(nèi)核
    發(fā)表于 09-09 09:59

    瑞芯微RK3576RK3576S有什么區(qū)別,性能參數(shù)配置與型號差異解析

    瑞芯微第二代8nm高性能AIOT平臺RK3576家族再添新成員-RK3576S,先說結(jié)論:相較主型號的RK3576/RK3576J,性能略有縮減,而功耗有所降低。主要應(yīng)用于商顯終端、智
    的頭像 發(fā)表于 08-14 23:57 ?2672次閱讀
    瑞芯微<b class='flag-5'>RK3576</b>與<b class='flag-5'>RK3576</b>S有什么區(qū)別,性能參數(shù)配置與型號差異<b class='flag-5'>解析</b>

    RK這2款旗艦芯片RK3588 PK RK3576,誰是最優(yōu)選

    ,了解兩者的區(qū)別十分重要,以下將從多個方面進行詳細對比。一、處理器性能解析(一)CPU 性能1. 核心架構(gòu)? RK3576:采用四核 Cortex - A72 和四核 Cortex - A53 架構(gòu)
    發(fā)表于 07-10 18:24

    Mpp支持RK3576

    想問下,https://github.com/rockchip-linux/mpp這里面支持RK3576么,看介紹沒有提到說支持RK3576 目前是買了個rk3576的機頂盒,搭載了安
    發(fā)表于 06-13 15:35

    RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?

    的成本結(jié)構(gòu)以及針對特定場景的深度優(yōu)化,正在成為中高端市場的熱門選擇。那么,RK3576 究竟有哪些優(yōu)勢?它是否真的能替代 RK3588?我們來做一個全面對比。 1. 核心性能對比:夠用且高效[td
    發(fā)表于 05-30 08:46

    RK3576 Android 14.0 SDK開發(fā)指南(第一集)

    RK3576 Android 14.0 SDK代碼編譯 SDK下載到本地后大概70多個G 下載后要做個校驗 解壓后內(nèi)核源碼 kernel代碼路徑說明 Android14支持6.1 版本
    發(fā)表于 05-20 08:43