bootloader的目標:啟動核心
1、從flash上把核心讀入記憶體
a、能讀flash
b、初始化記憶體 時鐘 其他
2、啟動
a、設定引數
b、跳轉執行
最簡單的bootloader的編寫步驟:
1. 初始化硬體:關看門狗、設定時鐘、設定sdram、初始化nand flash
2. 如果bootloader比較大,要把它重定位到sdram
3. 把核心從nand flash讀到sdram
4. 設定"要傳給核心的引數"
5. 跳轉執行核心
位址的確定:
mov r0, #0 //傳引數
ldr r1, =_start //這個是鏈結位址即就是第乙個標號
ldr r2, =__bss_start//
sub r2, r2, r1
bl copy_code_to_sdram
下面是從以下部落格摘錄
解釋:.globl _start
.globl指示告訴彙編器,_start這個符號要被鏈結器用到,所以要在目標檔案的符號表中標記它是乙個全域性符號(在第 5.1 節 「目標檔案」詳細解釋)。
_start就像c程式的main函式一樣特殊,是整個程式的入口,鏈結器在鏈結時會查詢目標檔案中的_start符號代表的位址,把它設定為整個程式的入口位址,
所以每個匯程式設計序都要提供乙個_start符號並且用.globl宣告。如果乙個符號沒有用.globl宣告,就表示這個符號不會被鏈結器用到。
解釋:_bss_start:
.word __bss_start
word expression就是在當前位置放乙個word型的值,這個值就是expression
舉例來說,
_rwtcon:
.word 0x15300000
就是在當前位址,即_rwtcon處放乙個值0x15300000
感覺一定要理解一些基本的概念,然後在看懂彙編的基礎上,再分析uboot的流程。
gnu as語法即at&t彙編語法,uboot用到的語法。
2.標籤的含義
as**
.globl _start
_start: b reset
標籤就是在某行程式**前作乙個標記,標籤代表的是這行**的位址。
as**
.globl _armboot_start
_armboot_start:
.word _start
.word expression就是在當前位置放乙個word型的值,這個值就是expression ,此處的含義就是建立乙個全域性標籤_armboot_start,
在這個位置上放置_start的值(可以這樣理解,_armboot_start是乙個位址,這個位址中的內容是_start),則下面的語句會把位址_armboot_start處
的內容(_start)裝載到r2中。
as**
ldr r2, _armboot_start
這樣做的目的是因為ldr指令的格式為:ldr rd, 《位址》。
3..word 0x0badc0de
含義:保留乙個字,初始化一下。實際的值應該在執行時計算出來。(badcode嗎,呵呵)。
ldr r1, _rwtcon
_rwtcon:
.word 0x15300000
這兩個語句是不是說把位址0x1530 0000 上的內容傳遞到r1? 而不是把0x1530 0000 放到r1 ?
不是把位址0x1530 0000 上的內容傳遞到r1,是把位址_rwtcon上的內容放到r1,而位址_rwtcon上的內容是0x15300000。實際上就是把r1設定為0x15300000
------------------------------------------
.word和0x1530 0000有什麼關係?.word就是把expression上的值取出來? expression代表位址?
.word expression就是在當前位置放乙個word型的值,這個值就是expression
舉例來說,
_rwtcon:
.word 0x15300000
就是在當前位址,即_rwtcon處放乙個值0x15300000
arm彙編標號 globel和 word解釋
bootloader的目標 啟動核心 1 從flash上把核心讀入記憶體 a 能讀flash b 初始化記憶體 時鐘 其他 2 啟動 a 設定引數 b 跳轉執行 最簡單的bootloader的編寫步驟 1.初始化硬體 關看門狗 設定時鐘 設定sdram 初始化nand flash 2.如果bootl...
ARM彙編中的標號
arm彙編中的標號 標號 label 是為一組機器指令所起名字,表示程式中的指令或者資料位址的符號。標號可有可無,只有當需要用符號位址來訪問該語句時,才給此語句賦予標號。通過在目標位址的前面放上乙個標號,可以在指令中使用標號來代替直接使用位址。標號是程式目標標誌,總是和某位址相聯絡,供轉移或迴圈指令...
ARM彙編中的標號
1 標號 在arm 彙編中,標號代表乙個位址,段內標號的位址在彙編時確定,而段外標號的位址值在連線時確定。根據標號的生成方式,可以有以下3 鐘 基於pc 的標號 基於pc 的標號時位於目標指令前的標號或程式中的資料定義偽指令前的標號,這種標號在彙編時將被處理成pc 值加上或減去乙個數字常量。它常用於...