移植好uboot和基於initramfs根文件系統Linux內核的開發板的啓動過程

我們移植好uboot和Linux內核之後,當我們重啓之後,開發板首先做的事情就是將nandflash前4K的內容複製到SRAM中去,由於SRAM只有4K大小,所以我們必須將初始化CPU、內存、中斷、關閉開門狗以及nandflash中uboot拷貝到SDRAM中的的程序都放在這前4K的位置中去。

將程序編譯生成一個可執行文件的最後一個過程是鏈接,而鏈接生成的可執行文件又可以分成很多段。在GUN/GCC的工具鏈中,鏈接這個工作是鏈接器ld這個程序來完成的。而每個鏈接過程都由鏈接腳本(linker script,一般以lds作爲文件的後綴名)控制。對於.lds文件,它定義了整個程序編譯鏈接的過程,決定了一個可執行程序的各個段的存儲位置。而決定uboot的代碼的存儲的位置的是u-boot 鏈接文件arch/arm/cpu/arm920t/u-boot.lds

. = ALIGN(4);
.text :
{
arch/arm/cpu/arm920t/start.o (.text)
board/lingyun/fl2440/lowlevel_init.o (.text)
board/lingyun/fl2440/nand_read.o (.text)

*(.text)
}

我們可以看到文本段中的文件存儲的位置和順序,依次是start.o lowlevel_init.o nand_read.o

當我們啓動開發板後,可以看到secureCRT上的顯示內容


這個時候內核開始啓動了,這個內核是版本是linux3.0,根文件系統是initramfs。系統啓動之後首先要執行的是init這個進程,init進程會執行initab這個腳本下的命令,主要有

1.掛載nandflash分區:

null::wait:/bin/mount -osync,noatime,rw -t jffs2 /dev/mtdblock6 /apps

null::wait:/bin/mount -osync,noatime,rw -t jffs2 /dev/mtdblock7 /info

2.使輸出爲串口輸出,波特率爲115200,顯示爲VT100:

null::respawn:/sbin/getty -LttyS0 115200 vt100

3.執行/etc/init.d/rcS這個腳本,在/etc/init.d/rcS腳本中,我們可以看到:

for i in /etc/init.d/S??* ; do

            $i

done

這個就是說執行在/etc/init.d目錄下以S開頭至少有兩個字符的腳本,在/etc/init.d目錄下的腳本有:

S01_network   S04_dropbear  S99_rcsApp    rcS

S01_network 配置網卡啓動的腳本

S04_dropbear 配置遠程登錄的腳本

S99_rcsApp 創建支持/apps/etc目錄下的啓動腳本,這個腳本的內容爲

#

if (test -d /apps/etc/init.d)

    then

    for i in /apps/etc/init.d/S??* ; do

    $i

    done

fi

由於我們的根文件系統是initramfs,是在內存運行的,我們做了修改之後不會被保存,斷點重啓之後會消失,但是在內核啓動的時候,我們就將nandflash的分區/dev/mtblock7掛載到了/apps目錄下,所以我們可以將添加的其他腳本來存儲到/apps/etc/init.d/目錄下,這個就可以保存在nandflash中,下次啓動之後,依然可以使用。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章