天天看點

基于ZLG/BOOT的linux2.6核心移植(s3c2410)

  基于ZLG/BOOT的linux2.6核心移植(s3c2410)   

ZLG/BOOT是廣州緻遠arm實驗箱自帶的bootloader.我用的這款實驗箱自帶的linux核心還是2.4版本的,有點兒老了,所

以想移植個2.6上去.由于bootloder的移植燒寫也是比較麻煩的事,我決定暫時先用實驗箱自帶的ZLG/BOOT.

實際上使用ZLG/BOOT對于linux核心的移植是比較友善的, ZLG/BOOT的運作機制是這樣的:啟動或複位硬體

後,ZLG/BOOT會識别nandflsh上建立的啟動目錄,你隻需通過ftp将核心及根檔案系統下載下傳到nandflash中指定目錄

(a:\boot\)下.當你選擇啟動linux的選項,ZLG/BOOT會自動将該目錄下的linux核心(zImag)和根檔案系(init.img)以及

linux啟動參數檔案(param.bin)拷貝到記憶體(ram)中指定的位址,并跳至linux核心的首位址,開始運作linux.

在nandfllash的a:\boot\目錄下還有兩個重要檔案zlg_boot.init和param.bin,其中前者是可編輯檔案,可以通過

ftp上傳到主機(PC)後進行編輯修改,之後再下載下傳下去,但是後者是二進制檔案,隻能通過實驗箱帶的專門修改此檔案的

軟體來修改關鍵參數.實際移植過程中也可以不對這兩個檔案進行修改,但有幾需要注意的地方:

1,在zlg_boot.init中有這樣一段代碼:

load 0x30008000 a:\boot\zImag

load 0x30000100 a:\boot\parm.bin

load 0x33C00000 a:\boot\init.img

其作用是分别将liunx核心,啟動參數以及根檔案系統等幾個檔案拷貝到ram中相應的位址.這裡要注意的是這幾

個檔案名要與你實際下載下傳到a:\boot\目錄下的檔案名一緻,否則加載時找不到相應檔案.是以,移植過程中如果不修改

zlg_boot.init檔案,那麼你在制作核心和根檔案系統是一定要把檔案名定義為zImag(一般沒什麼問題)和init.img.

2,在parm.bin中可修改的參數如下:

root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8

以上是實驗箱原來自帶的參數,實際這些都是linux指令,用于告訴linux以下資訊:根檔案系統的加載位址,讀寫

屬性,檔案系統大小和控制台資訊--tty0表示控制台為液晶顯示器,ttyS0表示控制台為序列槽0.這裡要注意的是在2.6内

核中對序列槽0的表示已改成ttySAC0,如果移植2.6核心後繼續使用ttyS0,當linux啟動時就會在序列槽終端出現:

Uncompressing Linux.................................................................. done,

booting .

然後就卡住不動了.

其實上面param.bin中這些指令和linux核心配置時boot option選項中第三行的内容是同一個東西,在實際中是

raram.bin中的内容把boot option中的内容覆寫了,使得boot option中的内容不起作用.是以在移植過程中要麼修改

param.bin,要麼在核心中把param.bin屏蔽掉,使得boot option内容生效,并修改其内容.

網上大多數介紹inux2.6到s3c2410的移植過程對2.6核心主要有兩個方面的修改,一是修改nandflash分區以及

nand裝置啟動代碼的添加,用來引導核心以及根檔案系統的啟動;二是添加支援devfs的相關内容(有關devfs引用網友原

話"linux-2.6.13以前的核心都支援devfs,而之後版本的核心就把devfs這塊去掉了,雖然還能在核心源碼中找到對應

的源碼,你也可以把它加進核心"). 根據上面的介紹,基于ZLG/BOOT的核心移植可以簡單到不用對2.6核心源碼做任何

修改,配置編譯後用ZLG/BOOT直接下載下傳到指定目錄替代原來的2.4核心,就可啟動運作2.6核心了.不用對nanflsh進行分

區設定是因為,核心及根檔案系統的引導完全由ZLG/BOOT完成. 當然為了能在序列槽終端正常顯示linux啟動資訊,要對

啟動參數檔案parm.bin進行修改,即把ttyS0改為ttySAC0.這樣linux核心雖然啟動了,但是還存在兩個小小的問題:

1,啟動資訊中會出現4000多行的:Bad eraseblock at 0x*****,(2.6.22和2.6.20都有這現象),這可能是由于

ZLG/BOOT已經對nandflsh分區并寫保護了,當linux按自己的分區方式再次對nandflash進行擦除和分區時就出現了這種

情況.解決辦法是,在linux核心源碼中取消對nandflash裝置的啟動.網上說出現Bad eraseblock是因為沒去掉沒去掉

nand的ECC校驗,我試着修改過此處,并沒好使,是以真正原因應該就是我上面說的那樣.

2,linux啟動并輸出大量輸出資訊後會卡在這條資訊上;Warning: unable to open an initial console.這是由

于原來2.4核心及其使用的檔案系統都支援devfs,而現在的2.6核心不支援.解決辦法有兩個,一是換一個不支援devfs的

根檔案系統(具體制作方法下節會講),二是修改核心代碼及配置使之支援devfs.

下面我說一下詳細步驟:一些通用步驟援引了網友原文,關鍵步驟我會具體說明.

我在移植時用的是linux-2.6.22核心,寫這篇文檔時我又移植了linux-2.6.20來做驗證,下面将以linux-2.6.20為

平台資訊:目标闆           s3c2410

主機作業系統     redhat9.0

交叉編譯器      arm-linux-gcc3.4.1

1.   将Linux2.6.20核心源碼放到工作目錄下,并解壓。

#tar xzvf linux2.6.20.tar.gz

# cd linux2.6.20

    2.   修改核心源碼根目錄下的Makefile檔案

#vi Makefile

......

#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \

#                  -e s/arm.*/arm/ -e s/sa110/arm/ \

#                  -e s/s390x/s390/ -e s/parisc64/parisc/ \

#                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )

......

#ARCH        ?= $(SUBARCH)

#CROSS_COMPILE    ?=

ARCH        = arm

CROSS_COMPILE    = /usr/local/arm/3.4.1/bin/arm-linux-

注:CROSS_COMPILE根據自己所使用的交叉編譯器路徑設定。

**3.修改arch/arm/mach-s3c2410/common-smdk.c檔案,(linux2.6.22.19中的目錄為arch/arm/plat-

s3c24xx/common-smdk.c)

找到如下資料結構

static struct platform_device __initdata *smdk_devs[] = {

// &s3c_device_nand,   注釋掉或者删除該語句,防止linux對nandflash進行二次擦除和分區.

&smdk_led4,

&smdk_led5,

&smdk_led6,

&smdk_led7,

};

4. 如果想使你的核心支援devfs以及在啟動時并在/sbin/init運作之前能自動挂載/dev為devfs檔案系統。可以

編輯fs/Kconfig:

在menu "Pseudo filesystems"下面添加如下代碼:

config DEVFS_FS

bool "/dev file system support (OBSOLETE)"

default y     //注意t和y之間有個空格,否則執行make menuconfig 後會報錯:unexpected T_WORD

config DEVFS_MOUNT

bool "Automatically mount at boot"

default y

depends on DEVFS_FS

注意:如果繼續使用原來2.4版本用的ramdisk檔案系統,這第4步是必需得做的,同時還需要在檔案系統dev/目錄

下建立如下節點:

mknod -m 660 null c 1 3

mknod -m 660 console c 5 1

如果重新制作新ramdisk根檔案系統,根檔案系統可以和linux2.6核心同時都配置devfs或者都不配置,都

不配置時第4步就不用添加了.(建議重新制作,具體方法見下節内容)

5.解決序列槽0控制台資訊輸出問題,(否則會在此卡

住:UncompressingLinux.................................................................. done, booting

.) 以下兩種方法可以任選其一:

(1)修改核心代碼屏蔽掉ZLG/BOOT中設定啟動參數,并在配置時修改啟動參數.具體如下:

将核心中的arch/arm/kernel/setup.c檔案中的parse_tag_cmdline()函數中的内容注釋掉,禁止使用預設

的參數。這樣你隻要在配置核心Boot options選項的時候正确配置 也就OK了。而且還很友善,哪天你要引導2.4核心

了就可以直接把console=ttySAC0,115200改為console=ttyS0,115200就可以了,很是簡單!

(2)修該ZLG/BOOT中的param.bin檔案将其中的ttyS0改為ttySAC0,要通過專門修改param.bin的軟體來完成.(

建議用方法(1))

     6. 配置核心

在配置核心前,先拷貝s3c2410開發闆的預設配置到核心根目錄下,以簡化配置過程。

# cp arch/arm/configs/s3c2410_defconfig .config

# make menuconfig

   以下是在 s3c2410_defconfig 基礎上要配置的選項

General setup --->

[*] Configure standard kernel features (for small systems) --->

選上這項,否則檔案系統中的一些選項不會出現

System Type --->     

S3C2410 Machines --->

[*] SMDK2410/A9M2410    留下這項就夠了,其他全部“N”掉

“N”掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 裡的所有選項,都是和

2410無關的選項。

Boot options --->

将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string

改成   (root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8) Default kernel command

string 注:很重要,具體功能上面有解釋.

Userspace binary formats --->

< > Kernel support for a.out and ECOFF binaries (去除該選項,a.out和ECOFF是兩種可執行檔案的格式,

在ARM-Linux下一般都用ELF,是以這兩種基本用不上。)

Networking --->

Networking options --->

<*> Packet socket

[*]   Packet socket: mmapped IO

Device Drivers --->

“N”掉   Parallel port support ---> 裡的所有選項。

Plug and Play support --->裡的所有選項一定要“N”掉,不然編譯會出錯!!!!!!!!

Network device support --->

Ethernet (10 or 100Mbit) --->

“N”掉< > DM9000 support和< >   Generic Media Independent Interface device support

“N”掉 [ ]   Ethernet (1000 Mbit) --->和 [ ]   Ethernet (10000 Mbit) --->

Wireless LAN --->

[*] Wireless LAN (pre-802.11)

[*] Wireless LAN (IEEE 802.11)

USB Network Adapters --->

<*> Multi-purpose USB Networking Framework

<*> MMC/SD card support --->

Real Time Clock --->

“N”掉 [ ]   Set system time from RTC on startup and resume

#接下來做的是針對檔案系統的設定,我實驗時目标箱上要挂的根檔案系統是ramdisk故做如下配置

File systems -->

<*> Second extended fs support     #注意ext2相關的幾項一定要選上,因為我們使用的ramdisk檔案系統屬于

ext2格式,很多移植後使用cramfs的核心在配置時都把這項N掉了.                             

[*]   Ext2 extended attributes                                  

[*]     Ext2 POSIX Access Control Lists                         

[*]     Ext2 Security Labels                                    

[*]   Ext2 execute in place support  

<*> Ext3 journalling file system support

<*> Kernel automounter support

<*> Kernel automounter version 4 support (also supports v3)

<*> Filesystem in Userspace support

Pseudo filesystems -->

[*] Virtual memory file system support (former shm fs)

<*> Userspace-driven configuration filesystem (EXPERIMENTAL)

Miscellaneous filesystems -->

<*> YAFFS2 file system support

“N”掉[ ]Autoselect yaffs2 format 和

[ ]Cache short names in RAM ,因為這是給每頁大于1024B的NAND Flash設計的

<*> Journalling Flash File System v2 (JFFS2) support

(0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)

[*]   JFFS2 write-buffering support

[ ]   JFFS2 summary support (EXPERIMENTAL)

[ ]   JFFS2 XATTR support (EXPERIMENTAL)

[*]   Advanced compression options for JFFS2

[*]     JFFS2 ZLIB compression support

[*]     JFFS2 RTIME compression support

[*]     JFFS2 RUBIN compression support

JFFS2 default compression mode (priority) --->

Network File Systems -->

<*> NFS file system support

--以下最好選上,因為在挂載NFS時可能出現protocol不支援的情況--

[*]Provide NFSv3 client support

[*]Provide client support for the NFSv3 ACL protocol extension

[*]   Provide NFSv4 client support (EXPERIMENTAL)

[*]   Allow direct I/O on NFS files

-------------------------------------------------------------------------

<*> NFS server support

[*]   Provide NFSv3 server support

[*]Provide server support for the NFSv3 ACL protocol extension   

[*]     Provide NFSv4 server support (EXPERIMENTAL)       

---   Provide NFS server over TCP support                 

[*] Root file system on NFS

    儲存退出,産生.config檔案。

7.編譯核心

#make zImage   

從本質上講,基于ZLG/BOOT完成一個最簡單的linux2.6核心移植隻需把核心代碼注釋掉兩句話,然而我在做的過程

中是饒了很大圈子的,剛上來也是按網上的說明對nandflash進行分區,而ZLG/BOOT源碼中對nandflash的分區部分隻給

了二進制檔案,是以二者一直對應不起來,遇到了很多網上常見的問題,然而他們的解決方法卻很多不适合我,直到弄清

了ZLG/BOOT的工作機制,問題才迎刃而解.

過程中得到了網上不少資料的幫助,尤其是下面這個連結,在此表示感謝!  

參考文獻 : http://hi.baidu.com/operationsystem/blog/item/b96528c63e6db6d4d0006060.html

繼續閱讀