1. 程式人生 > >boot對Linux核心的啟動

boot對Linux核心的啟動

boot: 讀取kernel到記憶體 設定tag引數  

kernel:

  1. 匹配機器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.初始化記憶體,時鐘,

啟動:

  1. 設定引數
  2. 跳轉執行
  1. 初始化硬體:看門狗,設定時鐘,設定SDRAM,初始化nand flash
  2. 如果BootLoader比較大,從定位SDRAM
  1. 把核心從nand flash 讀到SDRAM
  2. 設定要傳給核心的引數
  3. 跳轉到核心執行
#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)
{
	
}