Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1548472
  • 博文数量: 239
  • 博客积分: 1760
  • 博客等级: 上尉
  • 技术积分: 1595
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 23:53
文章分类

全部博文(239)

文章存档

2016年(1)

2015年(28)

2014年(53)

2013年(42)

2012年(50)

2011年(65)

分类: LINUX

2012-02-11 02:25:06

=====================阶段一:创建根文件系统所需文件======================
一、构建busybox并make install

然后修改_install/bin/busybox权限:
chmod 4755 _install/bin/busybox
(给予busybox任何人可读可执行,所有者可读可写可执行,4读,2写,1执行,7=4+2+1,5=4+1,三者分别是所有者,所有者组,其他组。最前面的4表示其他用户执行该文件时,权限同所有者)

进入到_install目录创建linux需要的一些目录:
mkdir -p dev etc home lib mnt proc root sys tmp usr var/lib/misc var/lock var/log var/run var/tmp
并修改权限:
chmod 1777 tmp
chmod 1777 var/tmp
(最前面1防止被其他用户删除)

在dev下创建console和null设备:
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
mknod -m 660 ttySAC0 c 204 64
mknod -m 660 ttySAC1 c 204 65
mknod -m 660 ttySAC2 c 204 66
(这两个设备用来供init启动时调用)

看busybox依赖那些so库
/develop/crosstools/arm-dhole-linux-gnueabi/bin/arm-linux-readelf -a busybox  | grep Shared
显示结果
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 说明依赖libm.so.6和libc.so.6
把交叉编译器里的library拷贝到_install/lib目录下,
我做的交叉编译器lib库是在
/develop/crosstools/arm-dhole-linux-gnueabi/arm-dhole-linux-gnueabi/sysroot/lib/
目录下,鉴于以后的应用程序可能会用到除libm.so.6和libc.so.6外的这些库,因此全部拷过去,
在_install下执行如下命令:
cp /develop/crosstools/arm-dhole-linux-gnueabi/arm-dhole-linux-gnueabi/sysroot/lib/*.so* lib -a

然后在_install/etc下创建一些配置文件:
文件fstab:
内容如下:
----------------------------------------------------------------->
 # /etc/fstab: static file system information.
 #
 #
 #
 # file system   mount       type    options           dump    pass
 #for mdev
 proc            /proc       proc    defaults          0       0
 sysfs           /sys        sysfs   defaults          0       0
 #make sure /dev /tmp /var are tmpfs(tmpfs use ram as media) thus can be r/w  
 tmpfs           /tmp        tmpfs   defaults          0       0
 tmpfs           /dev        tmpfs   defaults          0       0
 tmpfs           /var        tmpfs   defaults          0       0
  #usbfs        /proc/bus/usb  usbfs   defaults          0       0
-----------------------------------------------------------------<
说明: fstab中的文件系统会被mount -a挂载。

文件inittab:
内容如下:
----------------------------------------------------------------->
# see busybox/examples/inittab
# Boot-time system configuration/initialization script.
# This is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
#Start an "askfirst" shell on the console (whatever that may be)
#use respawn instead askfirst to make sure console always active
::respawn:-bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
-----------------------------------------------------------------<
说明: inittab会被init执行

文件init.d/rcS:(mkdir init.d;cd init.d)
内容如下:
----------------------------------------------------------------->
#!/bin/sh

#add setting here for auto start program
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#See docs/mdev.txt
#mount all fs in fstab,proc and sysfs are must for mdev
mount -a   

#create device nodes
echo /sbin/mdev > /proc/sys/kernel/hotplug

#seed  all device nodes
mdev -s

#create pts directory for remote login such as SSH and telnet
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts   

if [ -f /etc/hostname ]; then
/bin/hostname -F /etc/hostname
fi

if [ -e /sys/class/net/eth0 ]; then
ifconfig eth0 192.168.1.15
fi

echo "etc init.d rcS done"
-----------------------------------------------------------------<
说明: init.d/rcS会在开机时自动执行。

更改rcS和inittab的权限为777:
chmod 777 init.d/rcS
chmod 777 inittab

=============阶段二:制作ubifs文件系统=======================================
1、制作mkfs.ubifs
yum install zlib-devel.i686
yum install lzo-devel.i686        compr_lzo.c:29:23: error: lzo/lzo1x.h: No such file or directory
yum install uuid-devel.i686
yum install uuid-dce-devel.i686
yum install libacl-devel.i686    sys/acl.h: No such file or directory
yum install libuuid-devel.i686    uuid/uuid.h: No such file or directory
make #编译pc上用的工具,我只要mkfs.ubifs

2、把_install做成ubifs文件系统:
根据下面的log
----------------------------------------------------------------->
mtd: Giving out device 2 to dhole rootfs
UBI: attaching mtd2 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI error: ubi_io_read: error -74 (ECC error) while reading 64 bytes from PEB 0:0, read 64 bytes
-----------------------------------------------------------------<
得出如下命令:
./mkfs.ubifs -r /develop/project/busybox-1.19.3/_install/ -m 2048 -e 129024 -c 2008 -o ubifs.img    #2008块*128KiB*2KiB
./ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
ubinize.cfg配置文件内容如下:
----------------------------------------------------------------->
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
-----------------------------------------------------------------<
其中-m表示页面大小,-e表示逻辑擦除块大小,-c表示最大的逻辑擦除块数量,具体的可以通过barebox执行ubiattach的时候看到。

3、内核支持
    (1)、配置内核支持UBIFS
    Device Drivers   --->Memory Technology Device (MTD) support  --->UBI - Unsorted block  images  --->Enable UBI
    (2)、配置mtd支持UBI接口
    File  systems  --->Miscellaneous filesystems  --->UBIFS file system  support配置内核支持UBIFS文件系统

有关ubifs的详细介绍,请参考:



=================阶段三=========================================================
///////////////////u-boot 烧写ubifs.img/////////////////////////////////////////
1、使用默认的分区对nand进行分区
mtdpart default

2、查看分区表
mtdpart
结果如下:
----------------------------------------------------------------->
device nand0 , # parts = 3
 #: name                size            offset          mask_flags
 0: uboot               0x00100000      0x00000000      0
 1: kernel              0x00400000      0x00100000      0
 2: root                0x0fb00000      0x00500000      0

active partition: nand0,0 - (uboot) 0x00100000 @ 0x00000000

defaults:
mtdids  : nand0=nandflash0
mtdparts: mtdparts=nandflash0:1m(uboot),4m(kernel),-(root)
-----------------------------------------------------------------<

4、擦除uboot的root分区
nand erase.part root
结果如下:
----------------------------------------------------------------->

NAND erase.part: device 0 offset 0x500000, size 0xfb00000
Skipping bad block at  0x01a80000                                          
Skipping bad block at  0x03f40000                                          
Erasing at 0xffe0000 -- 100% complete.
OK
-----------------------------------------------------------------<

5、用ubi格式格式化root分区
ubi part root    设置root(u-boot)分区为当前分区,后面所有的命令ubi都基于root分区操作
结果如下:
----------------------------------------------------------------->
Creating 1 MTD partitions on "nand0":
0x000000500000-0x000010000000 : "mtd=2"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name:            "mtd=2"
UBI: MTD device size:            251 MiB
UBI: number of good PEBs:        2006
UBI: number of bad PEBs:         2
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     0
UBI: available PEBs:             1982
UBI: total number of reserved PEBs: 24
UBI: number of PEBs reserved for bad PEB handling: 20
UBI: max/mean erase counter: 1/0
-----------------------------------------------------------------<

6、创建linux用的rootfs分区,"rootfs"这个名字必须和内核中的名字一样
ubi create rootfs
结果如下:
----------------------------------------------------------------->
No size specified -> Using max size (255725568)
Creating dynamic volume root of size 255725568
-----------------------------------------------------------------<

7、把ubifs.img烧写到flash中
tftp 0x31000000 ubifs.img
ubi write 0x31000000 rootfs 0x607800    #注意命令执行顺序,否则没用rootfs为linux中用的的分区名字

11、修复错误"ubi_io_write: error -5 while writing 512 bytes to PEB 5:512"
make menuconfig
#去除选项,此处有问题的描述
Device Drivers  ---> Memory Technology Device (MTD) support  ---> NAND Device Support  ---> Verify NAND page writes
由于我移植的u-boot还没有实现硬件校验,而软件校验和硬件校验的结果不同,造成linux驱动读写ubifs文件系统失败,所以暂时先屏蔽nand 硬件校验
Device Drivers  ---> Memory Technology Device (MTD) support  ---> NAND Device Support  ---> Samsung S3C NAND Hardware ECC
这样内核就可以顺利的启动到下面的log处,但还是没有成功引导进入shell
----------------------------------------------------------------->
......
UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: file system size:   254306304 bytes (248346 KiB, 242 MiB, 1971 LEBs)
UBIFS: journal size:       9033728 bytes (8822 KiB, 8 MiB, 71 LEBs)
UBIFS: media format:       w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root:  0 bytes (0 KiB)
VFS: Mounted root (ubifs filesystem) on device 0:13.
Freeing init memory: 136K
Kernel panic - not syncing: Attempted to kill init!
[] (unwind_backtrace+0x0/0xf0) from [] (panic+0x58/0x188)
[] (panic+0x58/0x188) from [] (do_exit+0x5dc/0x6c4)
[] (do_exit+0x5dc/0x6c4) from [] (do_group_exit+0x3c/0xbc)
[] (do_group_exit+0x3c/0xbc) from [] (get_signal_to_deliver+0x1bc/0x490)
[] (get_signal_to_deliver+0x1bc/0x490) from [] (do_signal+0x90/0x4e8)
[] (do_signal+0x90/0x4e8) from [] (do_notify_resume+0x60/0x6c)
[] (do_notify_resume+0x60/0x6c) from [] (work_pending+0x24/0x28)
在此处死了
-----------------------------------------------------------------<
而上面的错误是由于交叉编译器的错误,导致编译出来的busybox执行失败,一般是交叉编译器生出了cpu不支持的指令。
解决方案重做交叉编译器
阅读(6413) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~