1.常用的器件及特性
- 內存
- SRAM:靜態內存 特點就是容量小、價格高,優點是不需要軟件初始化直接上電就能用
- DRAM:動態內存 特點就是容量大、價格低,缺點就是上電后不能直接使用,需要軟件初始化后才可以使用。
- 單片機中:內存需求量小,而且希望開發盡量簡單,適合全部用SRAM
- 嵌入式系統:內存需求量大,而且沒有NorFlash等可啟動介質
- PC機: 內存需求量大,而且軟件復雜,不在乎DRAM的初始化開銷,適合全部用DRAM
- 外存
- NorFlash:特點是容量小,價格高,優點是可以和CPU直接總線式相連,CPU上電后可以直接讀取,所以一般用作啟動介質。
- NandFlash(跟硬盤一樣):特點是容量大,價格低,缺點是不能總線式訪問,也就是說不能上電CPU直接讀取,需要CPU先運行一些初始化軟件,然后通過時序接口讀寫。
2.各類計算機的啟動方式
- PC:很小容量的BIOS(NorFlash)+ 很大容量的硬盤(類似於NandFlash)+ 大容量的DRAM
- 單片機: 很小容量的NorFlash + 很小容量的SRAM
- 嵌入式:因為NorFlash很貴,所以現在很多嵌入式系統傾向於不用NorFlash,直接使用外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM
- S5PV210啟動方式:外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM+SoC內置iROM
3.S5PV210的啟動步驟
在這張圖中可以看出S5PV210的啟動可大致分為五個步驟
- 1、iROM階段(BL0)
- 2、BL1階段
- 3、BL2階段
- 4、拷貝OS到SDRAM
- 5、啟動OS
samsung在S5PV210內部的IROM中固化了一段代碼,用於初始化時鍾,識別用戶選擇的啟動模式,並從相應的地方拷貝boot-loader第一階段代碼到SRAM中運行。此外samsung在S5PV210內部也集成了96KB的內部SRAM,由於SRAM不需要初始化,上電就能使用,因此可當作DRAM初始化之前的代碼運行空間。
4.iROM完成的工作
- 1、關閉看門狗;
- 2、初始化icache;
- 3、初始化棧;
- 4、初始化堆;
- 5、初始化塊設備拷貝函數;
- 6、初始化PLL,設置系統時鍾;
- 7、拷貝BL1到內部的SRAM區域;
- 8、檢查BL1的校驗和;
- 9、檢查是否是安全啟動模式;
- 10、跳轉到BL1的起始代碼處。
5.匯編啟動代碼
#define WTCON 0xE2700000 #define SVC_STACK 0xD0037D80 // 把_start鏈接屬性改為外部,這樣其他文件就可以看見_start了 .global _start _start: // 第1步:關看門狗(向WTCON的bit5寫入0即可),不是所有的BL0都關看門狗 ldr r0, =WTCON ldr r1, =0x0 str r1, [r0] // 第2步:設置SVC棧 默認使用滿減棧 ldr sp, =SVC_STACK // 第3步:開/關icache mrc p15,0,r0,c1,c0,0; // 讀出cp15的c1到r0中 //bic r0, r0, #(1<<12) // bit12 置0 關icache orr r0, r0, #(1<<12) // bit12 置1 開icache mcr p15,0,r0,c1,c0,0; // 第4步:調用入口函數 bl entry
6.鏈接腳本
- 什么是鏈接地址
鏈接地址是由程序員預知的或希望的程序執行地址,在編譯鏈接的過程中,通過Makefile中-Ttext xxx或者在鏈接腳本中指定的。 - 什么是運行地址
是程序執行,代碼所處的實際位置地址。 -
鏈接腳本究竟要做什么?
鏈接腳本其實是個規則文件,他是程序員用來指揮鏈接器工作的。
鏈接器會參考鏈接腳本,並且使用其中規定的規則來處理.o文件中那些段,將其鏈接成一個可執行程序。
鏈接腳本的關鍵內容有2部分:段名 + 地址(作為鏈接地址的內存地址)
鏈接腳本的內容:- SECTIONS {} 是整個鏈接腳本的全部
- . 點號在鏈接腳本中代表當前位置。
- =等號代表賦值,要用分號結尾
link.lds
SECTIONS { . = 0xd0020010; .text : { start.o * (.text) } .data : { * (.data) } .bss : { * (.bss) } }
7.Makefile
NAME=led BIN=$(NAME).bin ELF=$(NAME).elf OBJ=start.o led.o CC=arm-linux-gcc LD=arm-linux-ld CFLAGS=-march=armv5te -nostdlib LDFLAGS=-nostartfiles -nostdlib OBJCOPY=arm-linux-objcopy bin:elf $(OBJCOPY) -O binary $(ELF) $(BIN) cp $(BIN) ~/shared/image/ elf:$(OBJ) $(LD) -T link.lds $(LDFLAGS) $(OBJ) -o $(ELF) %.o:%.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJ) $(ELF) $(BIN)