使用QEMU模擬搭建ARM開發平臺

使用QEMU模擬搭建ARM開發平臺(一):交叉編譯Linux內核

tags: qemu

安裝需要的包,我的主機環境是debian squeeze/x86_64,首先需要安裝交叉編譯工具鏈,安裝qemu模擬器,下載linux內核。

安裝交叉編譯工具鏈

將下列源添加到/etc/apt/sources.list或在/etc/apt/sources.list.d/目錄下新建一個文件debian-arm-toolchain.list。

#
# -- Emdebian cross toolchains
#
# deb http://www.emdebian.org/debian/ unstable main
# deb http://www.emdebian.org/debian/ testing main
deb http://www.emdebian.org/debian/ squeeze main

然後,執行

#apt-get update
#apt-get install gcc-4.4-arm-linux-gnueabi

安裝工具鏈的方法可以參考 http://wiki.debian.org/

安裝qemu

#apt-get install qemu-system

下載linux內核

我下載的是linux-2.6.39.2.tar.bz2。存放在$HOME/目錄下。

$cd $HOME
$tar xjf linux-2.6.39.2.tar.bz2
$make mrproper #保證原始乾淨環境
$make ARCH=arm versatile_defconfig #使用versatile平臺默認配置
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all #編譯

幾分鐘過後,arch/arm/boot/zImage即生成了,然後使用qemu模擬。之所以選擇versatile平臺,是因爲qemu可以完全模擬。

$cp arch/arm/boot/zImage $HOME/versatile-zImage
$qemu-system-arm -M versatilepb -kernel versatile-zImage -m 128M

由於沒有提供根文件系統,所以kernel會崩潰,由於找不到合適的root掛載項。下面製作一個最小的initramfs,使其可以正常運行。

$mkdir $HOME/versatile-initramfs
$cd $HOME/versatile-initramfs
$cat > init.c <<EOF
> #include <stdio.h>
> #include <stdlib.h>
> int main(void)
> {
> printf("hello arm\n");
> while(1);
> return 0;
> }
> EOF

然後,編譯並且將其打包成initramfs。

$arm-linux-gnueabi-gcc -static -o init init.c
$rm init.c
$find . | cpio -o -H newc | gzip > ../versatile-initrd
$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-initrd -m 128M






使用QEMU模擬搭建ARM開發平臺(二):加入busybox支持

tags: qemu

在上一篇文章中,搭建的arm平臺只有一個最小化的initramfs,只是可以驗證可以啓動,但沒有實用性,busybox是嵌入式環境中的殺手級應用,將busybox集成進initramfs變得非常實用。

首先要安裝qemu, arm toolchain,還要下載busybox源碼。我下載的是busybox-1.18.5.tar.bz2

$tar xjf busybox-1.18.5.tar.bz2
$cd busy box-1.18.5
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

選擇將busybox編譯成靜態文件, "Busybox Settings --> Build Options"

$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install

編譯安裝完成後,會在當前目錄下生成_install目錄,此爲默認的安裝目錄,也可以在Busybox Settings中設置爲別的目錄。現在製作initramfs。

$cd _install
$find . | cpio -o -H newc | gzip $HOME/versatile-busybox

現在用qemu模擬。

$cd $HOME
$qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/bin/sh"

這裏如果不加rdinit=/bin/sh,那麼/linuxrc將會試圖掛載根文件系統,並且運行新根文件系統中的init,由於我們沒有另外的真正的根文件系統,所以使用rdinit=/bin/sh,啓動到sh中,敲入回車,將會出現shell命令提示符。在當前root中,沒有/proc,/sys存在,所以例如mount等這些以來/proc, /sys的命令不能正常工作。在虛擬機中執行

#mkdir /proc /sys
#mount -t proc proc /proc
#mount -t sysfs sysfs /sys

也可以將其加入到啓動腳本中,關閉虛擬機,然後修改versatile-busybox

$cd busybox-1.18.5/_install
$mkdir -p etc/init.d
$cd etc/init.d
$cat > rcS <<EOF
#!/bin/sh
>mkdir /proc /sys
>mount -t proc proc /proc
>mount -t sysfs sysfs /sys
>mdev -s
EOF
$chmod +x rcS
$cd busybox-1.18.5/_install
$find . | cpio -o -H newc | gzip > $HOME/versatile-busybox

現在用qemu模擬

$ qemu-system-arm -M versatilepb -kernel versatile-zImage -initrd versatile-busybox -m 128M -append "root=/dev/ram rdinit=/sbin/init"

注意這裏的rdinit=/sbin/init,前面之所以是rdinit=/bin/sh,是因爲/sbin/init會執行/etc/init.d/rcS,而前面並沒有創建這個文件,所以會打印很多錯誤!特別是由於沒有啓動mdev。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章