Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567378
  • 博文数量: 127
  • 博客积分: 1169
  • 博客等级: 少尉
  • 技术积分: 1298
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-16 14:29
个人简介

空白

文章分类

全部博文(127)

分类: LINUX

2012-04-14 15:50:09

linux-2.6.31.1支持yaffs2文件系统以及yaffs2文件系统的制作

下面操作的前提是:内核支持nand flash
一. 下载yaffs2源码,(我将源码反正/opt目录下),并解压源码,进入源码目录
 # tar xzvf yaffs2.tar.gz
 # cd yaffs2

二. 为内核添加yaffs2文件系统补丁,执行:
 # ./patch-ker.sh  c m  /..../linux-2.6.31.1  <----c m后面接的是内核源码所在的目录
执行完后,在内核源码fs目录下就多了一个yaffs2目录,同时Makefile和Kconfig文件也增加了对yaffs2的配置和编译条件。
三. 配置内核对yaffs2的支持
这里的配置根据自己的需求,把不用的文件系统都去掉。
 #make menuconfig
找到下面的配置:
    File systems  --->
       DOS/FAT/NT     Filesystems  --->
           <*>   MSDOS   fs support
           <*>   VFAT    (Windows95)   fs support
       Miscellaneous  filesystems --->
           <*>   YAFFS2    file system  support
           [*]  Autoselect yaffs2  format
    配置语言选项:
       Native  Language   support  --->
           (iso8859-1)  Default NLS   Option
           <*>   Codepage   437(United  States, Canada)
           <*>   Simplified Chinese  charset(CP936,  GB2312)
           <*>   NLS   ISO8859-1   (Latin 1;  Western   European  Language)
           <*>   NLS   UTF-8
现在内核已经支持NandFlash和yaffs2文件系统,重新编译内核:
 #make zImage
将编译好的内核烧入NandFlash后,再烧入yaffs2文件系统,就可以了。

四. 制作yaffs2根文件系统
    1. 环境
    (1) 交叉编译器版本: arm-linux-gcc 4.3.3
    (2) Linux环境:redhat enterprise 5.5 (2.6.18-194.el5)
    (3) 开发板:TQ2440
    
    2. 编译busybox
    (1) 获取busybox源码,放在/opt目录下,解压,进入busybox源码目录
        #tar jxvf busybox-1.17.2.tar.bz2
        #cd busybox-1.17.2
        #vi Makefile
        将164行改为CROSS_COMPILE = arm-linux-
        将190行改为ARCH = arm
        保存退出进入配置菜单
        #make menuconfig    采用默认配置保存推出
        #make
        #make install
    通过上面的步骤,在busybox-1.17.2的根目录下出现了一个_install目录,
    在该目录下又有三个目录文件bin sbin usr和一个链接文件 linuxrc。
    
    3. 创建根文件系统必要的目录
    (1)在/opt目录下创建root_fs目录
    #mkdir root_fs
    #cd root_fs
    (2)将busybox-1.17.2的根目录下_install中的bin sbin usr和linuxrc拷贝到root_fs
    #cp -rf /opt/busybox-1.17.2/_install/* /opt/root_fs
    (3)创建必要的目录
    #mkdir dev etc home lib mnt opt proc root sys tmp var
    (4)创建必要的二级目录
    #mkdir usr/lib usr/share
    #mkdir etc/rc.d
    #mkdir var/lib var/lock var/run var/tmp
    
    4. 创建必要的文件
    (1) 获取库文件,(交叉编译工具下的库文件)到root_fs/lib目录中
    #cp -rf /opt/arm/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a
    (2) 将主机etc目录下的passwd、group、shadow文件拷贝到root_fs/etc目录下
    #cp -f /etc/passwd /etc/group /etc/shadow etc
    将目录/opt/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到root_fs/etc下。
    在这个目录下有三个文件fstab, inittab, profile和一个目录init.d,在目录init.d中有一个文件rcS。
    #cp -rf /opt/busybox-1.17.2/examples/bootfloppy/etc/* etc
    在目录etc下创建文件mdev.conf。mdev是?v的一个简化版本,
    我们可以通过文件mdev.conf自定义一些设备节点的名称或链接来满足特定的需要,但在此处让它为空。
    #touh etc/mdev.conf
    (3)创建两个设备文件dev/console dev/null。
    在linux内核源码文件init/main.c中有打开设备文件dev/console的操作如下:
    static noinline int init_post(void)
    __releases(kernel_lock)
    {
        ………………………………
        if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
        printk(KERN_WARNING "Warning: unable to open an initial console.\n");
        ………………………………
    }
    内核启动执行到这里时mdev还没有构建dev目录,如果没有创建设备文件dev/console就将会打印警告
    Warning: unable to open an initial console。
    在内核启动的过程中要将产生的一些垃圾信息丢弃就需要空设备dev/null。
    #mknod dev/console c 5 1
    #mknod dev/null c 1 3
    
    5. 修改文件
     在启动过程中bootloader会传递参数init=/linuxrc给内核的main()函数,所以在文件系统被挂载后,
     运行的第一个程序是linuxrc,而linuxrc是一个指向/bin/busybox的链接文件,也就是说文件系统被挂在后运行的第一个程序是busybox。
     Busybox首先会解析文件/etc/inittab,这个文件中存放的是系统的配置信息,这些配置信息指明了接下来将要启动那些程序。
 -------------------------------------------------------------------------------------------------------
    (1)修改文件etc/inittab如下
    ::sysinit:/etc/init.d/rcS
    s3c2410_serial0::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r
    
    说明:
    /etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下
    :::
    :表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省 略,则使用与init进程一样的控制台。
    :对于Busybox init程序,这个字段滑意义,可以省略。
    :表示init程序如何控制这个子进程,
    : 要执行的程序,它可以是可执行程序,也可以是脚本
    
    文件etc/inittab配置条目说明如下:
    ::sysinit:/etc/init.d/rcS
    启动系统初始化文件/etc/init.d/rcS。字段sysinit表明文件/etc/init.d/rcS在系统启动后最先执行,
    并且只执行一次,init进程等待它结束才继续执行其它动作。(脚本文件名一般为rc,后缀S代表单用户运行级别脚本)
    tq2440_serial0::askfirst:-/bin/sh
    在串口s3c2410_serial0上启动askfirst动作的shell。
    S3C2410的串口名在/dev下是s3c2410_serialx。askfirst表明init进程先输出 “Please press Enter to actvie this console”,
    等用户输入回车键之后才启动-/bin/sh。
    ::ctrlaltdel:/sbin/reboot
    当按下Ctrl+Alt+Delete组合键时,init重启执行程序。字段ctrlaltdel表明当按下Ctrl+Alt+Delete组合键时,执行相应的进程。
    ::shutdown:/bin/umount -a -r
    告诉init在关机时运行umount命令卸载所有的文件系统,如果卸载失败,试图以只读方式重新挂载。
    字段shutdown表明在重启关闭系统命令时执行相应进程。   ------------------------------------------------------------------------------------------------------------------------------
    (2)当解析完文件etc/inittab后就将启动这些进程,首先要执行的是启动脚本etc/init.d/rcS。
    修改文件etc/init.d/rcS如下:

  1. #! /bin/sh
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. runlevel=S
  4. prevlevel=N
  5. umask 022
  6. export PATH runlevel prevlevel
  7. /bin/hostname CPEmbed

  8. /sbin/ifconfig lo 127.0.0.1 up
  9. /sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0
  10. /sbin/route add default gw 192.168.1.1 eth0

  11. echo "---------------mount all-----------------"
  12. /bin/mount -a

  13. mkdir /dev/pts
  14. /bin/mknod /dev/pts/0 c 136 0
  15. /bin/mknod /dev/pts/1 c 136 1
  16. /bin/mknod /dev/pts/2 c 136 2
  17. /bin/mknod /dev/pts/3 c 136 3
  18. /bin/mknod /dev/pts/4 c 136 4
  19. /bin/mknod /dev/pts/5 c 136 5
  20. /bin/mount -t devpts devpts /dev/pts

  21. echo /sbin/mdev>/proc/sys/kernel/hotplug
  22. mdev -s

  23. /usr/sbin/telnetd &
  24. /usr/sbin/vsftpd &

  25. echo "******************************************"
  26. echo "******************************************"
  27. echo "** Kernel version: linux-2.6.31.1 **"
  28. echo "** Date: 2012.04.12 **"
  29. echo "******************************************"
    说明如下:
    #! /bin/sh  用busybox的shell
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  //shell命令的搜索路径
    runlevel=S  //运行在单用户模式
    prevlevel=N //前一个级别为n表示没有前一个级别
    umask 022  //权限位掩码
    export PATH runlevel prevlevel //将设置的变量导出到环境中
    /bin/hostname CPembed //主机名,CPembed将出现在shell提示符中[root@CPembed/]#
    /sbin/ifconfig lo 127.0.0.1 up  //启动lo
    /sbin/ifconfig eth0 192.168.1.8 netmask 255.255.255.0 up //配置ip地址
    /sbin/route add default gw 192.168.1.1 eth0 //添加默认路由
    /bin/mount -a  //将文件etc/fstab中指明的文件系统挂载到对应挂载点上
    后面的8行是对telnetd的配置
    echo /sbin/mdev>/proc/sys/kernel/hotplug  //用mdev来处理内核的热插拔事件。
    当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的ACTION和DEVPATH,
    (这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,
    如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。
    mdev -s //建立dev目录。以‘-s’为参数调用位于/sbin 目录写的 mdev(其实是个链接,作用是传递参数给/bin目录下的busybox 程序并调用它),mdev扫描 /sys/class 和/sys /block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则 mdev 就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次“mdev -s”
    /usr/sbin/telnetd & //后台运行telnetd
    /usr/sbin/vsftpd &  //后台运行vsftpd
------------------------------------------------------------------------------------------------------------------------------
    (3)修改文件etc/fstab如下:
    #device    mount-point     type      option     dump   fsck   order
    proc          /proc        proc     defaults    0        0  
    none          /tmp        ramfs    defaults    0        0  
    sysfs         /sys          sysfs    defaults    0        0  
    mdev          /dev        ramfs    defaults    0        0  
    在系统启动初始化文件/etc/init.d/rcS中有执行挂载命令/bin/mount -a ,这便是将文件etc/fstab中指定 的文件系统挂载到对应的挂载点上。这些文件系统的挂在是执行mdev -s命令建立dev目录的前提------------------------------------------------------------------------------------------------------------------------------
    (4)在启动脚本etc/init.d/rcS执行完后将在串口s3c2410_serial0启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。
    文件/etc/profile修改如下:
    USER=" 'id -un' "  
    LOGNAME=$USER  
    PS1='[\u@\h \W]# '  
    PATH=$PATH  
    HOSTNAME='/bin/hostname'  
    export USER LOGNAME PS1 PATH

    具体说明:
    USER="id -un"  //获取用户名id-un与whoami命令有相同的功能
    PS1='[\u@\h \W]# '  //PS1指定sh提示符的格式在本环境下将是[root@cyembed /]#
    export USER LOGNAME PS1 PATH 将这些变量导出到环境。
    (5)在用户登录时将在/etc下寻找三个文件passwd ,shadow, group匹配相关信息。
    这三个文件修改如下:
    /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin

    /etc/group
    root:x:0:root
    bin:x:1:root,bin,daemon
    daemon:x:2:root,bin,daemon
    ftp:x:50:
    nobody:x:99:
    
    /etc/shadow    root:$6$hnswPTgxzFaZHlLl$WMMV0Av6O6c4RA4pwpVSgcKSiURhUlP5dxF3/MKEZlGzNXhoWMQeZA1rdf1z7VQbrrmOZe7YHw1rIQmAc8BNK/:14819:0:99999:7:::
    bin:*:14715:0:99999:7:::
    daemon:*:14715:0:99999:7:::
    ftp:*:14715:0:99999:7:::
    nobody:*:14715:0:99999:7:::
 ------------------------------------------------------------------------------------------------------------  
    6. 制作yaffs2根文件系统镜像
        用天嵌科技提供的yaffs2文件系统镜像制作工具mkyaffs2image,制作根文件系统镜像。
        #./mkyaffs2image root_fs root_fs.bin

    7. 将根文件系统镜像下载到nand flash并启动
        启动信息如下:

  1. Booting Linux ...
  2. Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00300000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......
  3. Uncompressing Linux................................................................................................................................ done, booting the kernel.
  4. Linux version 2.6.31.1 (root@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176) ) #16 Sat Apr 14 21:09:08 CST 2012
  5. CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
  6. CPU: VIVT data cache, VIVT instruction cache
  7. Machine: SMDK2440
  8. ATAG_INITRD is deprecated; please update your bootloader.
  9. Memory policy: ECC disabled, Data cache writeback
  10. CPU S3C2440A (id 0x32440001)
  11. S3C24XX Clocks, (c) 2004 Simtec Electronics
  12. S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
  13. CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
  14. Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
  15. Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
  16. PID hash table entries: 256 (order: 8, 1024 bytes)
  17. Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
  18. Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
  19. Memory: 64MB = 64MB total
  20. Memory: 60712KB available (3504K code, 288K data, 252K init, 0K highmem)
  21. NR_IRQS:85
  22. irq: clearing subpending status 00000002
  23. Console: colour dummy device 80x30
  24. console [ttySAC0] enabled
  25. Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
  26. Mount-cache hash table entries: 512
  27. CPU: Testing write buffer coherency: ok
  28. NET: Registered protocol family 16
  29. S3C Power Management, Copyright 2004 Simtec Electronics
  30. S3C2440: Initialising architecture
  31. S3C2440: IRQ Support
  32. S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics
  33. DMA channel 0 at c4808000, irq 33
  34. DMA channel 1 at c4808040, irq 34
  35. DMA channel 2 at c4808080, irq 35
  36. DMA channel 3 at c48080c0, irq 36
  37. S3C244X: Clock Support, DVS off
  38. bio: create slab <bio-0> at 0
  39. SCSI subsystem initialized
  40. usbcore: registered new interface driver usbfs
  41. usbcore: registered new interface driver hub
  42. usbcore: registered new device driver usb
  43. s3c-i2c s3c2440-i2c: slave address 0x10
  44. s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz
  45. s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
  46. NET: Registered protocol family 2
  47. IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
  48. TCP established hash table entries: 2048 (order: 2, 16384 bytes)
  49. TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
  50. TCP: Hash tables configured (established 2048 bind 2048)
  51. TCP reno registered
  52. NET: Registered protocol family 1
  53. NetWinder Floating Point Emulator V0.97 (extended precision)
  54. msgmni has been set to 118
  55. io scheduler noop registered
  56. io scheduler anticipatory registered (default)
  57. io scheduler deadline registered
  58. io scheduler cfq registered
  59. Console: switching to colour frame buffer device 60x34
  60. fb0: s3c2410fb frame buffer device
  61. lp: driver loaded but no devices found
  62. ppdev: user-space parallel port driver
  63. Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
  64. s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
  65. s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
  66. s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
  67. brd: module loaded
  68. loop: module loaded
  69. Uniform Multi-Platform E-IDE driver
  70. ide-gd driver 1.18
  71. ide-cd driver 5.00
  72. dm9000 Ethernet Driver, V1.31
  73. Now use the default MAC address: 08:90:90:90:90:90
  74. eth0: dm9000e at c4810300,c4814304 IRQ 51 MAC: 08:90:90:90:90:90 (MY2440)
  75. S3C24XX NAND Driver, (c) 2004 Simtec Electronics
  76. s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
  77. s3c24xx-nand s3c2440-nand: NAND hardware ECC
  78. NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
  79. Scanning device for bad blocks
  80. Bad eraseblock 1283 at 0x00000a060000
  81. Bad eraseblock 1539 at 0x00000c060000
  82. Bad eraseblock 1618 at 0x00000ca40000
  83. Bad eraseblock 1744 at 0x00000da00000
  84. Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
  85. 0x000000000000-0x000000100000 : "boot"
  86. 0x000000120000-0x000000520000 : "kernel"
  87. 0x000000520000-0x000010000000 : "yaffs2"
  88. usbmon: debugfs is not available
  89. ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
  90. s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
  91. s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
  92. s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
  93. usb usb1: configuration #1 chosen from 1 choice
  94. hub 1-0:1.0: USB hub found
  95. hub 1-0:1.0: 2 ports detected
  96. Initializing USB Mass Storage driver...
  97. usbcore: registered new interface driver usb-storage
  98. USB Mass Storage support registered.
  99. usbcore: registered new interface driver libusual
  100. usbcore: registered new interface driver usbserial
  101. USB Serial support registered for generic
  102. usbcore: registered new interface driver usbserial_generic
  103. usbserial: USB Serial Driver core
  104. USB Serial support registered for FTDI USB Serial Device
  105. usbcore: registered new interface driver ftdi_sio
  106. ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
  107. USB Serial support registered for pl2303
  108. usbcore: registered new interface driver pl2303
  109. pl2303: Prolific PL2303 USB to serial adaptor driver
  110. mice: PS/2 mouse device common for all mice
  111. S3C24XX RTC, (c) 2004,2006 Simtec Electronics
  112. s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
  113. s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
  114. S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
  115. s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
  116. s3c2440-sdi s3c2440-sdi: host detect has no irq available
  117. mapped channel 0 to 0
  118. s3c2440-sdi s3c2440-sdi: powered down.
  119. s3c2440-sdi s3c2440-sdi: initialisation done.
  120. s3c2440-sdi s3c2440-sdi: powered down.
  121. usbcore: registered new interface driver hiddev
  122. usbcore: registered new interface driver usbhid
  123. usbhid: v2.6:USB HID core driver
  124. Advanced Linux Sound Architecture Driver Version 1.0.18a.
  125. No device for DAI UDA134X
  126. No device for DAI s3c24xx-i2s
  127. S3C24XX_UDA134X SoC Audio driver
  128. UDA134X SoC Audio Codec
  129. asoc: UDA134X <-> s3c24xx-i2s mapping ok
  130. ALSA device list:
  131.   #0: S3C24XX_UDA134X (UDA134X)
  132. TCP cubic registered
  133. NET: Registered protocol family 17
  134. RPC: Registered udp transport module.
  135. RPC: Registered tcp transport module.
  136. s3c2410-rtc s3c2410-rtc: setting system clock to 2012-04-15 18:23:29 UTC (1334514209)
  137. yaffs: dev is 32505858 name is "mtdblock2" rw
  138. yaffs: passed flags ""
  139. VFS: Mounted root (yaffs filesystem) on device 31:2.
  140. Freeing init memory: 252K
  141. eth0: link down
  142. ---------------mount all-----------------
  143. ******************************************
  144. ******************************************
  145. ** Kernel version: linux-2.6.31.1 **
  146. ** Date: 2012.04.12 **
  147. ******************************************

  148. Please press Enter to activate this console.


五. 参考资料
天祥电子《linux2.6.31移植v1.5.pdf》
(yaffs2根文件系统制作)
阅读(2603) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~