一.使內核支持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 /]#