一.使內核支持yaffs2文件系統 1. 獲取yaffs 源碼 2.在內核中添加對yaffs 的支持

advertisement
一.使內核支持yaffs2文件系統
1. 獲取yaffs 源碼
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
2.在內核中添加對yaffs 的支持
解壓yaffs源碼進到yaffs2 的目錄下執行:
#./patch-ker.sh c /opt/FriendlyARM/mini2440/linux-2.6.25.8/
此時到內核源碼的「fs/」目錄下面您將看到新添加了一個名為「yaffs2」的目錄,同時fs/目錄下面的Makefile
文件和Kconfig 文件也添加了yaffs2 的配置和編譯條件。
如下所示:(
1)修改內核fs/Kconfig 增加一行:source "fs/yaffs2/Kconfig"
(2)修改內核fs/Makefile 增加一行ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3)在內核fs/目錄下創建yaffs2目錄 將yaffs2源碼目錄下面的Makefile.kernel文件複製為內核
fs/yaffs2/Makefie;
將yaffs2 源碼目錄的Kconfig文件複製到內核fs/yaffs2目錄下; 將yaffs2源碼目錄下
的*.c *.h文件複製到內核fs/yaffs2目錄下.
)
3. 在配置單中添加對yaffs 的支持
在命令行輸入:make menuconfig,進入配置單,然後配置如下所示:
File systems --->
<*> Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Filesystem in Userspace support
CD-ROM/DVD Filesystems --->
<*> ISO 9660 CDROM file system support
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows-95) fs support
(437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
<*> Userspace-driven configuration filesystem
Miscellaneous filesystems --->
<*> YAFFS2 file system support
-*- 512 byte / page devices
[*] Lets Yaffs do its own ECC
-*- 2048 byte (or larger) / page devices
[*] Disable lazy loading
[*] Turn off wide tnodes
[*] Force chunk erase check
-*- Native language support --->
--- Native language support
(iso8859-1) Default NLS Option
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> NLS ISO 8859-1 (Latin 1; Western European Languages)
<*> NLS UTF-8
配置好之後,保存,編譯出鏡像。
到此已以把yaffs 文件系統移植完畢了.
二.制做文件系統
1. 獲取BusyBox 源碼
http://www.busybox.net/downloads/
我用的是busybox-1.13.0.tar.bz2 。
2 修改並配置BusyBox
解壓busybox,使用命令#tar jxvf busybox-1.13.0.tar.bz2 –C /opt/FriendlyARM/mini2440/
然後進到源碼中,修改Makefile 文件
ARCH ? =arm
CROSS_COMPILE ?=/usr/local/arm/3.4.5/bin/arm-linux然後輸入:#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
然後退回到根配置單,選擇「Save Configuration to an Alternate File」選項,保存剛剛的配置為
mini2440busy_config(自己隨便取的名字),編譯時調用的是.config文件.
3 .編譯並安裝BusyBox
在命令行輸入:make;make install,編譯結束後會在busybox-1.13.0 根目錄下面生成一個名為「_install」
的目錄。
完成busybox 的編譯之後,我們就可以進行文件系統的構建了。
在「/opt/ FriendlyARM/mini2440/」目錄下面建立一個「root_2.6.25fs」的目錄,複製剛剛編譯出來的busybox
的「bin」
目錄、「sbin」目錄、「usr」目錄和「linuxrc」到「root_2.6.25fs」目錄下,然後新建「dev」、「etc」、
「home」、「lib」、「mnt」、「opt」、「proc」、「root」、「sys」、「tmp」、「var」和「web」目錄,
並在原有的「usr」目錄下面新建一個「lib」目錄。
4. 添加內容
「dev」目錄
下面的內容在內核掛載完畢文件系統後,系統會使用mdev 自動建立。
不過mdev 是調用init 進程來啟動的,在使用mdev 構建「dev」目錄前,init 進程需要用到「/dev/console」
和「/dev/null」這兩個設備文件,所以,我們需要在製作文件系統時靜態創建這兩個設備文件,方法如下:
#mknod console c 5 1
#mknod null c 1 3
如果不創建這兩個設備文件,在文件系統啟動時會出現錯誤信息.大概是不能初始化控制台。
「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」的文件,該文件內容為:
Embed_jiajintao,這句話就是我們在文件系統裡面看到那個「[root@ Embed_jiajintao /]」 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:jiajintao
501:x:501:jiajintao
【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:/:
jiajintao:$1$8GIZx6d9$L2ctqdXbYDzkbxNURpE4z/:502:502:Linux User,,,:/home/jiajintao:/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】:
Embed_jiajintao
「home」目錄
存放用戶文件的目錄,在這裡,我建立了一個名為「jiajintao」的目錄,前面的passwd 文裡面有個用戶名就
是對應jiajintao這個目錄
「lib」目錄
常用的庫文件,獲取庫文件的方法:
#cp -f /usr/local/arm/3.4.5/arm-linux/lib/*so* lib –a
這裡拷貝了常用的庫文件,如果需要特殊的庫,需要再從相應的位置複製過來。
「mnt」目錄
我們一般用來掛載的U 盤之類的外設,這裡建立兩個目錄「udisk」和「sd」,分別用來掛載U 盤和SD卡。
「opt」目錄
空
「proc」目錄
提供一些目錄和虛擬文件系統。
「root」目錄
超級用戶的目錄。
「sys」目錄
「tmp」目錄
存放臨時文件的目錄。
「var」目錄
存放臨時文件的目錄。
「web」目錄
存放web 服務器的相關文件的目錄,建議直接從以前制做好的文件系統中拷貝過來。
到此,文件系統的框架就基本搭好了,然後把它做出yaffs 文件系統格式的鏡像就可以使用了。使用如下命令
製作:
#mkyaffsimage_2 root_2.6.25.8/ root_yaffs2.img
燒到開發板裡,啟動信息如下:
VIVI version 0.1.4 (root@capcross) (gcc version 2.95.3 20010315 (release)) #0.1.4 Mon Oct 27 10:18:15
CST 2008
MMU table base address = 0x33DFC000
Succeed memory mapping.
DIVN_UPLL0
MPLLVal [M:7fh,P:2h,S:1h]
CLKDIVN:5h
+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan |
+---------------------------------------------+
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: Power off/on or press the reset button for 1 sec
in order to get a valid USB device address.
NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)
Could not found stored vivi parameters. Use default vivi parameters.
Press Return to start the LINUX/Wince now, any other key for vivi
Copy linux kernel from 0x00050000 to 0x30008000, size = 0x00200000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
MACH_TYPE = 782
NOW, Booting Linux......
Uncompressing
Linux...........................................................................................
.................... done, booting the kernel.
Linux version 2.6.25.8 (root@localhost.localdomain) (gcc version 3.4.5) #1 Tue May 5 20:26:19 CST
2009
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
Machine: SMDK2440
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
S3C24XX Clocks, (c) 2004 Simtec Electronics
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
irq: clearing pending status 02000000
irq: clearing subpending status 00000002
PID hash table entries: 256 (order: 8, 1024 bytes)
timer tcon=00000000, tcnt a4ca, tcfg 00000200,00000000, usec 00001e57
Console: colour dummy device 80x30
console [ttySAC0] enabled
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 61232KB available (3188K code, 295K data, 132K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 152 bytes
NET: Registered protocol family 16
S3C2410 Power Management, (c) 2004 Simtec Electronics
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
S3C244X: Clock Support, DVS off
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NetWinder Floating Point Emulator V0.97 (double precision)
JFFS2 version 2.2. (NAND) c 2001-2006 Red Hat, Inc.
fuse init (API version 7.9)
yaffs May 5 2009 20:22:12 Installing.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
Console: switching to colour frame buffer device 30x40
fb0: s3c2410fb frame buffer device
lp: driver loaded but no devices found
ppdev: user-space parallel port driver
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
dm9000 Ethernet Driver, V1.30
Uniform Multi-Platform E-IDE driver
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2440-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)
Scanning device for bad blocks
Creating 3 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "supervivi"
0x00050000-0x00250000 : "kernel_linux2.6.25"
0x00250000-0x03ffc000 : "yaffs2_root"
usbmon: debugfs is not available
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
mice: PS/2 mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2440-i2c s3c2440-i2c: slave address 0x10
s3c2440-i2c s3c2440-i2c: bus frequency set to 98 KHz
s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
TCP cubic registered
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 132K
Please press Enter to activate this console.
[root@Embed_jiajintao /]# ls
bin
home
lost+found proc
sys
var
dev
lib
mnt
root
tmp
web
etc
linuxrc opt
sbin
usr
[root@Embed_jiajintao /]#
Download