mini2440 移植linux2.6.30.10 及yaffs2文件系統 2011-03-12 10:17:18


研究了四天linux內核移植和文件系統製作,總算移植成功,在這裏和大家分享一下,我是一個初學者,有不對的地方,請大家指點。
參考網友的資料:
http://blog.chinaunix.net/u3/104564/sho ... 91186.html
http://www.ourdev.cn/bbs/bbs_content.js ... bs_id=1032
http://blog.sina.com.cn/s/blog_5fe42fc90100cp4z.html

一,準備工作
1,內核版本:2.6.30.10
busybox 1.13.0 
編譯器:arm-linux-3.4.1
文件系統:yaffs2
平臺:mini2440 
2,移植linux
1)Linux 2.6.30.10的下載地址:
http://www.kernel.org/
 

2)yaffs2文件系統的下載地址:
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
 
點擊Download GNU tarball,下載cvs-root.tar.gz
3)busybox的下載地址:
http://www.busybox.net/downloads/
 
我用的是busybox-1.13.0.tar.bz2 
4)下載mkyaffs2image
http://www.arm9.net/download-mkyaffs2image.asp
 



二、移植內核
1,解壓內核源碼包
# tar jxvf linux-2.6.30.10.tar.bz2 -C /opt/FriendlyARM/mini2440/

2,進入內核目錄
# cd /opt/FriendlyARM/mini2440/linux-2.6.30.10

3,修改頂層Makefile
# gedit Makefile
在193行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改爲
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-

4,修改機器碼
# gedit arch/arm/tools/mach-types
在379行
s3c2440 ARCH_S3C2440 S3C2440 362
修改爲
s3c2440 ARCH_S3C2440 S3C2440 782
與supervivi傳入的機器碼參數一致即可!

5,修改時鐘頻率
# gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在160行

static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
//s3c24xx_init_clocks(16934400); //註釋這句,加入下一句
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

6,修改Nand Flash分區
# gedit arch/arm/plat-s3c24xx/common-smdk.c
在109行

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "supervivi",
.size = 0x00030000,
.offset = 0,
},
[1] = {
.name = "Kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};

7,加入對yaffs2文件系統的支持

1,解壓yaffs2文件系統源碼包
# tar zxvf cvs-root.tar.gz -C /opt/FriendlyARM/mini2440/

2,進入yaffs2源碼目錄
# cd /opt/FriendlyARM/mini2440/cvs/yaffs2

3,打補丁
# ./patch-ker.sh c ../../linux-2.6.30.10
Updating ../../linux-2.6.30.10/fs/Kconfig
Updating ../../linux-2.6.30.10/fs/Makefile

8,配置內核
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
1,機器類型只選以下三項:

System Type ---> S3C2410 Machines ---> [*] SMDK2410/A9M2410
S3C2440 Machines ---> [*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module

2,我用得編譯器是3.4.1沒有配置Kernel Feature


3,File systems ---> [*] Miscellaneous filesystems ---> <*> YAFFS2 file system support

4,Boot options-
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 

9,重新編譯內核
# make zImage
注意:如果是重新編譯內核需要遵守以下步驟:
1、make dep
make dep的意思就是說:如果你使用程序A(比如支持特殊設備),而A需用到B(比如B是A的一 個模塊/子程序)。而你在做 make config的時候將一個設備的驅動 由內核支持改爲module,或取消支持,這將可能影響到B的一個參數的設置,需重新編譯B,重新編譯或連接A....如果程序數量非常多, 你是很難手工完全做好此工作的。make dep實際上讀取配置過程生成的配置文件,來創建對應於配置的依賴關係樹,從而決定哪些需要編譯而那些不需要編譯。所以,你要make dep。
2、make clean
清除一些以前留下的文件,比如以前編譯生成的目標文件,這一步必須要進行。否則,即使內核配置改動過,編譯內核時還是將原來生成的目標文件進行連接,而不生成改動後的文件。
3、make zImage
Linux 內核有兩種映像:一種是非壓縮內核,叫 Image,另一種是它的壓縮版本,叫zImage。根據內核映像的不同,Linux內核的啓動在開始階段也有所不同。zImage是Image經過壓縮 形成的,所以它的大小比 Image小。但爲了能使用zImage,必須在它的開頭加上解壓縮的代碼,將 zImage解壓縮之後才能執行,因此它的執行速度比Image要慢。但考慮到嵌入式系統的存儲空容量一般比較小,採用zImage可以佔用較少的存儲空 間,因此犧牲一點性能上的代價也是值得的,所以一般的嵌入式系統均採用壓縮內核的方式。
編譯完成後,會在內核目錄arch/arm/boot/下生成zImage內核映像文件。


三,製作yaffs2文件系統

1,修改並配置BusyBox
解壓busybox
#tar jxvf busybox-1.13.0.tar.bz2 –C /opt/FriendlyARM/mini2440/
2,然後進到源碼中,修改Makefile 文件
ARCH ? =arm
CROSS_COMPILE ?=arm-linux-
3,#make menuconfig,進入配置單:
然後配置如下:(沒有列出的選項,可以採用默認,也可以根據自己的需要添加。)
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
Busybox Library Tuning --->
(
[*] vi-style line editing commands
[*] Fancy shell prompts
Linux Module Utilities --->
(/lib/modules) Default directory containing modules
(modules.dep) Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
--- Options common to multiple modutils
4,編譯並安裝BusyBox
在命令行輸入:make;make install,編譯結束後會在busybox-1.13.0根目錄下面生成一個名爲“_install”的目錄。
完成busybox 的編譯之後,我們就可以進行文件系統的構建了。
5,在“/opt/ FriendlyARM/mini2440/”目錄下面建立一個“root_yaff2”的目錄,複製剛剛編譯出來的_install下的“bin”
目 錄、“sbin”目錄、“usr”目錄和“linuxrc”到“root_2.6.25fs”目錄下,然後新建“dev”、“etc”、“home”、 “lib”、“mnt”、“opt”、“proc”、“root”、“sys”、“tmp”、“var”和“web”目錄,並在原有的“usr”目錄下面 新建一個“lib”目錄。
6,添加內容
1)“dev”目錄
下面的內容在內核掛載完畢文件系統後,系統會使用mdev 自動建立。
不過mdev 是調用init 進程來啓動的,在使用mdev 構建“dev”目錄前,init 進程需要用到“/dev/console”和“/dev/null”這兩個設備文件,所以,我們需要在製作文件系統時靜態創建這兩個設備文件,方法如下:
#mknod console c 5 1
#mknod null c 1 3
如果不創建這兩個設備文件,在文件系統啓動時會出現錯誤信息.大概是不能初始化控制檯。

2)“etc”目錄
用來存放系統的配置文件。
在“etc”目錄下面有如下常用的文件:
fstab:指明需要掛載的文件系統;
group:用戶組;
inittab:init 進程的配置文件;
passwd:密碼文件;
profile:用戶環境配置文件;
mdev.conf:因爲2.6.18 版本開始linux 放棄使用devfs 而採用udev(mdev 是udev 的簡化版本),這裏的
mdev.conf 文件可以是空,也可以按照一定規則來編寫,這裏我採用了爲空;
resolv.conf:存放DNS 信息的文件,訪問外網時需要DNS 的信息。
常用的目錄有:
init.d 目錄:啓動文件目錄,該目錄下面有個“rcS”的文件,裏面存放了系統啓動時配置以及自啓動加載
的進程等;
sysconfig 目錄:在我們的文件系統裏面,該目錄下面存放了名爲“HOSTNAME”的文件,該文件內容爲:
tianchunlong,這句話就是我們在文件系統裏面看到那個“[root@ tianchunlong /]” rc.d 目錄:在我們的文件系統裏面用來存放一些自啓動所要調用的腳步等;
boa 目錄:我們的文件系統特有的目錄,用來存放web 服務器的配置腳本。
下面分別列出“etc”下面各個文件的內容。
【fstab】:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
【group】:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:tianchunlong
501:x:501:tianchunlong
【inittab】:參考busybox 源碼下面的“examples/inittab”文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
注 意:上面紅色部分在busybox 的參考文件中是ttySAC0,而在s3c24xx 系列芯片的串口驅動裏面我們用了s3c2410_serial 做爲設備名(在內核源碼的“drivers/serial/s3c2410.c”文件的949 行),然後我們又是用的串口0 作爲控制檯的,所以這裏我們使用s3c2410_serial0。
【passwd】:
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
tianchunlong:$1$8GIZx6d9$L2ctqdXbYDzkbxNURpE4z/:502:502:Linux User,,,:/home/tianchunlong:/bin/sh

【profile】:
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
【mdev.conf】:
暫時空
【resolv.conf】:
nameserver 202.96.128.166
【init.d/rcS】:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
注意:在上面紅色部分是關於mdev 的使用,請參考busybox 的“docs/mdev.txt”文件。
最後還要改變它的屬性使它能夠執行。chmod +x etc/init.d/rcS
【rc.d/init.d/httpd】:
#!/bin/sh
base=boa
# See how we were called.
case "$1" in
start)
/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
【boa/boa.conf】:

【sysconfig/HOSTNAME】:
tianchunlong

3)“home”目錄
存放用戶文件的目錄,在這裏,我建立了一個名爲“tianchunlong”的目錄,前面的passwd 文裏面有個用戶名就是對應tianchunlong這個目錄
“lib”目錄
常用的庫文件,獲取庫文件的方法:
#cp -f -a /usr/local/arm/3.4.5/arm-linux/lib/*so* ./lib 
這裏拷貝了常用的庫文件,如果需要特殊的庫,需要再從相應的位置複製過來。
4)“mnt”目錄
我們一般用來掛載的U 盤之類的外設,這裏建立兩個目錄“udisk”和“sd”,分別用來掛載U 盤和SD卡。
5)“opt”目錄

6)“proc”目錄
提供一些目錄和虛擬文件系統。
7)“root”目錄
超級用戶的目錄。
8)“sys”目錄
9)“tmp”目錄
存放臨時文件的目錄。
10)“var”目錄
存放臨時文件的目錄。
11)“web”目錄
存放web 服務器的相關文件的目錄,建議直接從以前製做好的文件系統中拷貝過來。
12)“lib”目錄
講mini2440的根文件系統root_qtopia.tar.gz解壓講lib目錄下的所以庫函數拷貝到lib目錄下。

7,到此,文件系統的框架就基本搭好了,然後把它做出yaffs 文件系統格式的鏡像就可以使用了。使用如下命令製作:
#mkyaffs2image root_yaffs2/ root_yaffs2.img
燒寫到開發板即可進入控制檯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章