模拟启动uboot和kernel
由于qemu模拟vexpress资料最多,所以使用vexpress-ca9开发板进行模拟。
为了方便研究uboot和kernel,所以使用版本为uboot-2013.10和linux-2.6.39。
vexpress-a9开发板
vexpress系列开发板采用了主板+子板的设计结构,主板提供各种外围接口,子板提供CPU运算
主板:
主板则提供电源,可以自定义选添加各逻辑子板以提供相关功能。
子板:
提供主系统CPU。
系统原理图
模拟uboot启动
mkdir qemu
cd qemu
cat > qemu_uboot.sh << EOF
#!/bin/bash
qemu-system-arm \
-nographic \
-M vexpress-a9 \
-m 512M \
-kernel u-boot-noip
EOF
cp uboot-2013.10/u-boot images/u-boot-noip
chmod +x qemu_uboot.sh
./qemu_uboot.sh
模拟kernel启动
创建虚拟磁盘
qemu-img create -f raw vexpress.img 100M
虚拟磁盘创建分区并修改
fdisk vexpress.img #使用n命令创建分区,各种下一步就行,使用w命令保存退出
losetup /dev/loop0 vexpress.img #挂载vexpress.img到/dev/loop0设备上
partx -u /dev/loop0 #使用partx命令让系统刷新系统的分区信息
mkfs.ext3 /dev/loop0p1 #制作ext3格式的文件系统
mkdir rootfs #建立一个rootfs目录用来作为挂载目录
mount -o loop /dev/loop0p1 ./rootfs #将生成的ext3格式的分区挂载到rootfs目录
拷贝必要文件到根文件系统
cp -raf busybox-1.22.0/_install/* rootfs/
cp -raf /opt/toolchain/arm-linux-gnueabi-4.5.1/lib rootfs/
rm rootfs/lib/*.a
arm-linux-strip rootfs/lib/*
mkdir -p rootfs/proc/
mkdir -p rootfs/sys/
mkdir -p rootfs/tmp/
mkdir -p rootfs/root/
mkdir -p rootfs/var/
mkdir -p rootfs/mnt/
mkdir -p rootfs/etc/
创建etc目录下文件
mkdir -p rootfs/etc/init.d
mkdir -p rootfs/etc/sysconfig
编辑rcS
cat > rootfs/etc/init.d/rcS << EOF
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
#mount -n -t usbfs none /proc/bus/usb
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
ifconfig lo 127.0.0.1
#ifconfig eth0 10.238.233.5
/bin/hostname -F /etc/sysconfig/HOSTNAME
EOF
编辑HOSTNAME
cat > rootfs/etc/sysconfig/HOSTNAME << EOF
vexpress
EOF
编辑fstab
vi rootfs/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
ramfs /dev ramfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
编辑inittab
cat > rootfs/etc/inittab << EOF
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
EOF
编辑profile
cat > rootfs/etc/profile << EOF
USER="root"
LOGNAME=\$USER
export HOSTNAME=\`/bin/hostname\`
export USER=root
export HOME=/root
export PS1="[\$USER@\$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:\$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
EOF
添加权限
chmod +x rootfs/etc/init.d/rcS
创建必要节点到根文件系统
mkdir -p rootfs/dev/
mknod rootfs/dev/tty1 c 4 1
mknod rootfs/dev/tty2 c 4 2
mknod rootfs/dev/tty3 c 4 3
mknod rootfs/dev/tty4 c 4 4
mknod rootfs/dev/console c 5 1
mknod rootfs/dev/null c 1 3
退出根文件系统
partx -d /dev/loop0 #如果执行失败,可以使用 umount -f rootfs
losetup -d /dev/loop0
调试运行
cat > qemu_kernel.sh << EOF
qemu-system-arm \
-nographic \
-M vexpress-a9 \
-m 512M \
-kernel zImage \
-sd vexpress.img \
-append "init=/linuxrc root=/dev/mmcblk0p1 rw rootwait earlyprintk console=ttyAMA0"
EOF
cp linux-2.6.39/arch/arm/boot/zImage .
chmod +x qemu_kernel.sh
./qemu_kernel.sh