arm linux 啟動流程分析

2021-07-09 03:16:18 字數 1698 閱讀 1411

arm linux啟動總體過程 bootloader---->>kernel---->>rootfs.

bootloader

一般的soc中一般會有一塊sdram(又叫墊腳石),當soc上電時,soc中固化的**會根據啟動方式從nand,emmc等不同儲存上,載入bootloader到sdram,進而執行。也就是說soc上電後首先執行的是我們的bootloader(如 u-boot、vivi)。(刨去soc中固化好的**)

那bootloader又要做什麼工作,毫無疑問他的最終目的就是為了載入核心,也就是說bootloader的一切工作都是為執行核心做準備的。

那具體做哪些工作呢?(以u-boot為例)那首先得找到u-boot的入口,由lds檔案可以看出,入口就在start.s檔案。做的事情比較多,但是大體上就是設定中斷向量表、設定cpu、進行一系列的初始化(ram、串列埠、nand flash、c執行環境等)等等,**流程都比較清楚,就不多說了。最後跳到了kernel。

kernel

先看一下kernel的組成結構:

可以看到,當核心原始檔編譯鏈結成 vmlinux 檔案以後還進行了幾個模組的編譯和鏈結。其中

(1)vmlinux 是elf格式的object檔案,這種檔案只是各個源**經過連線以後的得到的檔案,並不能在arm平台上執行。

(2)經過objcopy這個工具轉換以後,得到了二進位制格式檔案image,image檔案相比於vmlinux 檔案,除了格式不同以外,還被去除了許多注釋和除錯的資訊。

(3)image檔案經過壓縮以後得到了piggy.gz ,這個檔案僅僅是image的壓縮版,並無其他不同。

(4)接著編譯生成另外幾個模組檔案misc.o、big_endian.o、head.o、head-xscale.o,這幾個檔案組成乙個叫bootstrap loader的元件,又叫引導程式。編譯生成 piggy.o 檔案。

(5)最後piggy.o檔案和bootstrap loader 組成乙個bootable kernel image 檔案(可啟動檔案)。

那kernel的啟動流程就比較清晰了,看圖更清晰:

從上圖可以看出,系統一上電就開始執行bootloader。當bootloader 執行完以後,把控制權交給了引導程式的head.o 檔案裡的start 標號處,當引導程式完成引導工作以後就將控制權轉給真正的核心的head.o 檔案裡的start 標號處。這裡就是核心的入口點,最後核心的head.o將控制交給main.o 的start_kernel 函式。這樣,通過檢視相應的**就可以知道這些**到底完成了哪些工作。在這裡我們可以找到相應的**,分析一下,看它們到底完成哪些事。下面是我的分析結果:

head.o從bootloader接過控制權,並完成如下任務:

使能 i/d caches ,關閉中斷 , 建立c執行環境(即設定堆疊)由 head.o 和head-xscal.o 完成

解壓縮並重定位** ,由misc.o 完成

其他硬體相關的設定,如big.endian.o 為cpu設定大端模式

核心入口點:從引導程式接過控制權,完成如下任務

檢查有效的cpu 和cpu的資訊

建立初始化頁表入口

使能mmu

檢測錯誤並報告

跳轉到核心本身 main.c 檔案裡的 start_kernel()函式

從 kernel 的head.o接過控制權,開始核心的啟動,在這裡完成核心的初始化,如核心各個子系統的初始化。

ARM Linux啟動流程分析

linux核心啟動分三個階段 1 解壓縮 2 檢查架構相關 3 start kernel c 語言環境 關於以下幾篇文章一些名詞 我的理解 1 鏈結位址 虛擬位址 這是乙個虛擬位址,對於32位cpu 虛擬位址空間的範圍 0 4g 通過arch arm kernel vmlinux.lds中開始部分就...

Arm linux 啟動流程

了解完kernel啟動以前的彙編之後我們來看看正式的c語言啟動 也就是我們的start kernel函式了。start kernel相當大,裡面每乙個呼叫到的函式都足夠我們傷腦筋了,我這裡只是淺嘗輒止的描述一下函式的功能,從而對kernel啟動的過程有乙個比較直觀的了解。很多函式真正理解需要對lin...

Arm linux啟動流程

linux啟動 分為以下三部分 彙編編寫的體系結構相關的部分 c語言編譯的體系結構相關的部分 c語言編譯的體系結構無關的部分 核心映象的生成 核心啟動流程 1.彙編部分 核心啟動入口 核心編譯連線後生成的elf映像檔案是vmlinux,從核心源 頂層目錄的makefile中可以找到vmlinux的生...