今天早上看了一上午的bootloader簡單原始碼,終於捋順了bootloader的執行過程,之前只是知道bootloader**會先被irom中的**拷貝到iram中一部分,然後執行這部分**,會把整個bootloader**拷貝到sdram中,最終在sdram執行剩下的**,而這段**會把kernel拷貝到sdram的某個位址,最終引導起來整個核心。但是我今天早上看**的時候看到乙個問題,我所有的**都是自己動手實現的,只要一步一步按照順序來,不就可以實現麼?為什麼還要拷貝來拷貝去的。感覺直接按照跳轉的方式,跳轉值進行指令的跳轉就行,但是想過之後,我意識到自己真是無知了。比如說在irom中執行的時候,會有一次跳轉到iram中某乙個位址,當然pc是肯定可以直接跳轉到指定的任何乙個位址,但是在這個位址中沒有存放指令碼,這時候,肯定是乙個有去無回的過程,不僅這樣,這個pc跳到這裡後,就會很迷茫,前不著村,後不著店的,不知道自己的所去所從,就會死到這裡。只有先把**拷貝到將要跳轉的位址中,pc指標才會順著跳轉後的指令繼續執行,也就是說每乙個指令都要負責人,確保執行完這個指令後,一定要有另乙個指令去接納pc。這樣pc才會一直活在我的**中。
下邊我就再把我更進一步了解到的bootloader執行過程再重新敘述一下:
我使用的是s5pv210晶元、k9k8g08u0a型號的nand flash
第一步:cpu啟動起來後,先來到0x00000000這個位址處(也就是
irom
的位址),此時會看到有一段**(這是irom中固定的**)在這裡,這段**會找到bootloader的第一段**(以下就稱為
bl1)存放的位址,由於
bl1存放在nand flash
中,不支援片上執行,所以
irom會把這段**拷貝到iram
中,但是在拷貝之前,irom會先把iram的起始4個位址分別寫上一定的內容(不過通常只寫0x00位址為bl1所佔空間的大小(一般是8k),而其他三個位址全寫為0),把bl1這段**拷貝到iram後,irom的使命就快要完成了,irom的最後乙個任務就是把
pc指標指向放bl1的那塊位址的起始位置
,然後就按照這個位址的指令開始執行。
第二步:這個時候開始執行bl1的**。這段**的功能是
初始化硬體
,比如串列埠,記憶體,顯示器,按鍵等等。
在初始化所有需要初始化的硬體後,bl1還會有乙個拷貝指令,就是要把
bootloader拷貝到sdram中
一般會把bootloader的**放到bladd(表示為bootloader在sdram中存放的位址)。
這時候bl1的使命也將要完成,於是,bl1會把
pc指標跳轉到bl2的位址
,此時所有要執行的**都在sdram中,這次的跳轉不會直接從這次拷貝的開始位址執行,而是跳過bl1**所佔的位址,從bl2開始執行。
第三步:執行bl2中的**。此時bl2**的功能主要是實現mtd裝置驅動初始化,電源、時鐘初始化,堆疊空間,以及各種必要的初始化,並且會提供乙個命令列,可以進行互動。在這之後會有乙個設定核心引數的過程,這些引數在記憶體中的存在方式也是以結構體儲存,以鍊錶進行關聯的,而這個 鍊錶有乙個固定的起始位址-0x3000_0100;每乙個結構體代表乙個資訊,並首尾相連,核心在需要這些引數時,就可以再對應的位址上取資料。這一步執行完畢後,就要把
kernel的**拷貝到sdram中的乙個指定位址
,並且會把這個位址強制轉換成乙個函式指標,並且向這個函式中傳遞一些引數,最終會到核心中執行核心**。這個時候,核心就會被引導到執行狀態。
Bootloader啟動過程
bootloader啟動過程 系統加電後,先執行第一階段彙編 進行相應的內部硬體初始化 暫存器 記憶體等 將第二階段c 複製到ram位址bloc abs base,然後跳轉到第二階段開始執行,在第二階段中,從彙編 跳轉到c 的main 函式,繼續如下工作 外圍硬體初始化 串列埠 usb等 將flas...
Boot Loader啟動過程
由於boot loader的實現依賴與cpu的體系結構,因此大多數的boot loader都分為stage1和stage2兩個階段 1,bootloader 的第一階段 stage1 工作流程 1.1,硬體裝置初始化通常包括如下步驟 按先後順序執行 復位 reset 設定cpu為超級保護模式 svc...
bootloader啟動過程詳細說明
今天早上看了一上午的bootloader簡單原始碼,終於捋順了bootloader的執行過程,之前只是知道bootloader 會先被irom中的 拷貝到iram中一部分,然後執行這部分 會把整個bootloader 拷貝到sdram中,最終在sdram執行剩下的 而這段 會把kernel拷貝到sd...