boot對Linux核心的啟動
阿新 • • 發佈:2018-12-18
boot: 讀取kernel到記憶體 設定tag引數
kernel:
- 匹配機器id(從R1讀出)能否支援該機器單板。呼叫開發板相關的初始化函式。不同的開發板有不同的板級外設,所以初始化內容就不同。
當啟動核心時首先從環境變數中讀取機器ID,如果沒有就使用預設的機器ID。
2.讀出R2的值(是boot設定的tag引數的首地址),並解析tag引數。
3.載入驅動程式。如:flash,emmc等。
4.掛接根檔案系統。
5.執行應用程式。
啟動第一個應用程式inittab,根據第一個應用程式的配置rcS指令碼檔案,在啟動需要啟動的相應的應用程式。
下載核心程式:
nfs 32000000 192.168.xxx.xxx:/path //通過nfs協議下載核心到32000000
bootm 32000000 啟動在32000000的程式,也就是上一步下載到板子上的核心。
燒寫根檔案系統:
nfs
nand erase.part rootfs
nand write.jiffs2 30000000 260000 $filesize (filesize 是boot變數中得到的)
busybox:
ls bin/ -l
安裝庫:
進入工具鏈,查詢庫的路徑,並將裡面的動態庫檔案拷貝到目標板中。
在目標平臺中建立一個檔案目錄:
mkdir yyyyyy/lib
cp xxx/lib/*so* yyyyyy/lib –d
BootLoader:
啟動核心:把核心從flash讀入記憶體然後啟動。
1.能讀flash
2.初始化記憶體,時鐘,
啟動:
- 設定引數
- 跳轉執行
- 初始化硬體:看門狗,設定時鐘,設定SDRAM,初始化nand flash
- 如果BootLoader比較大,從定位SDRAM
- 把核心從nand flash 讀到SDRAM
- 設定要傳給核心的引數
- 跳轉到核心執行
#define S3C2440_MPLL_200MHZ ((0X5C << 12)|(0X01 << 4)|(0X02)) #define MEM_CTRL_BASE 0x48000000 #define SDRAM_BASE 0x30000000 .text .global _start _start *關看門狗---將看門狗地址0x53000000設定為0 ldr r0, =0x53000000 ;暫存器r0=0x53000000 mov r1,#0 ;將暫存器r1賦值為0 str r1,[r0] ;將r1中的值0賦值給r0中的地址0x53000000 *設定時鐘 ldr r0,=0x4c000014 mov r1,#0x03 ;時鐘的分屏係數 str r1,[r0] mrc p15, 0, r1, c1, c0, 0 ;讀出控制暫存器 orr r1, r1, #0xc0000000 ;設定為非同步模式 mcr p15, 0, r1, c1, c0, 0 ;寫入控制暫存器 ldr r0, =0x4c000004 ldr r1, =S3C2440_MPLL_200MHZ str r1,[r0] *初始化sdram ldr r0, =MEM_CTRL_BASE adr r1, sdram_config ;讀取sdram_config的當前地址 add r3, r0, #(13 *4) 1: ldr r2, [r1] , #4 str r2, [r0], #4 cmp r0, r3 bne 1b *從定位---把bootloader本身的程式碼從flash複製到它的連結地址 ldr sp, =0x34000000 mov r0, #0 bl copy_code_to_sdram *執行main ldr lr, =halt ldr pc, =main halt: b halt //bl main sdram_config: .long 0x22011110//bwscon .long 0x00000700//bankcon0 .long 0x00000700//bankcon1 .long 0x00000700//bankcon2 .long 0x00000700//bankcon3 .long 0x00000700//bankcon4 .long 0x00000700//bankcon5 .long 0x00018005//bankcon6 .long 0x00018005//bankcon7 .long 0x008c04f4//refresh .long 0x000000b1//banksize .long 0x00000030//mrsrb6 .long 0x00000030//mrsrb7 int isBootFromNorFlash(void) { volatile int *p = (volatile int *)0; int val; val = *p; *p = 0x1235678; if( *p == 0x12345678) { *p = val; return 0;//寫成功,nand 啟動 } else { return 1;//nor 不能像記憶體一樣寫 } } int copy_code_to_sdram(unsigned int *src, unsigned int *dest, unsigned int len) { int i = 0; if(isBootFromNorFlash()) { while(i < len) { *dest[i] = *src[i]; i++; } } else { nand_init(); nand_read(); } } void clean_bss(void) { extern int __bss_start, __bss_end; int *p = &__bss_start; for(; p < &__bss_end; p++) *p = 0; } void nand_init(void) { }