基于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