轉自:http://blog.chinaunix.net/uid-20273473-id-3267337.html
我的開發環境: Ubuntu-12.04 所有軟件包爲最新
1. 安裝GNU工具鏈
sudo apt-get insatll gcc-arm-linux-gnueabi
sudo apt-get insatll g++-arm-linux-gnueabi
安裝完成後會在 /usr/arm-linux-gnueabi/ 目錄下生成庫文件、頭文件等。 我安裝的GCC版本爲:
arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
2. 安裝Qemu模擬器
sudo apt-get install qemu qemu-system qemu-utils
這時應該已經可以運行qemu-system-arm命令了, 其版本爲:
qemu-system-arm --version
QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2), Copyright (c) 2003-2008 Fabrice Bellard
3. 編譯和運行U-boot:
到 ftp://ftp.denx.de/pub/u-boot/ 下載最新版本的U-Boot源代碼, 我用的目前最新版本 u-boot-2012.04.tar.bz2
解壓後進入源代碼目錄,在Makefile裏面增加兩行:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
其實就是告訴它使用ARM編譯器來編譯。
make ca9x4_ct_vxp_config
make
這 裏配置目標板爲 Cortex-A9x4 vexpress. 之所以選這個配置可以從 boards.cfg文件裏看到, vexpress是ARM公司使用Cortext-A9的一個開發板,相關的代碼在 board/armltd/vexpress/ 目錄,配置文件爲include/configs/ca9x4_ct_vxp.h。 而且關鍵的是Qemu裏面已經支持這個板卡。
編譯完成後會生成u-boot文件
運行:
qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
或者
qemu-system-arm -M vexpress-a9 -m 256M -serial stdio -kernel u-boot
發現,如果沒有指定-nographics, 則必須要加-serial stdio纔會有打印。
參數-m 256M爲指定內存大小。-M 指定板卡的名稱, 支持的板卡可以用-M ?查看, 如下:
#qemu-system-arm -M ?
Supported machines are:
beagle Beagle board (OMAP3530)
beaglexm Beagle board XM (OMAP3630)
............
versatilepb ARM Versatile/PB (ARM926EJ-S)
versatileab ARM Versatile/AB (ARM926EJ-S)
vexpress-a9 ARM Versatile Express for Cortex-A9
vexpress-a15 ARM Versatile Express for Cortex-A15
正常運行的結果:
qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
U-Boot 2012.04 (Jul 08 2012 - 00:14:08)
DRAM: 256 MiB
WARNING: Caches not enabled
Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
## Unknown flash on Bank 2 - Size = 0x00000000 = 0 MB
*** failed ***
MMC: MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
VExpress#
VExpress# printenv
baudrate=38400
bootcmd=run bootflash;
bootdelay=2
bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}
console=ttyAMA0,38400n8
。。。。。
注意:如果在檢測Flash failed後停止運行,是因爲在 arch/arm/lib/board.c裏面 board_init_r()函數裏檢測Flash失敗後調用了hang(), 暫時先把hang()去掉就可以運行下去了。
4. 編譯和運行Linux內核:
到http://www.kernel.org/下載最新的Linux內核源碼,我下載的是linux-3.4.4.tar.bz2. 解壓後修改Makefile, ARCH = arm, CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
(可以到 arch/arm/configs/ 目錄看到所有自帶的配置文件, 我們使用vexpress板卡默認的配置文件)
然後 make menuconfig --> System Type 把 Enable the L2x0 outer cache controller 取消, 否則Qemu會起不來, 暫時還不知道爲什麼。
然後就可以make了。 最後會生成 arch/arm/boot/zImage 文件, 這就是我們需要的內核映像。
5. 製作根文件系統:
這部分網上有非常多的介紹,就不細說了。 大概流程是:先創建標準的Linux目錄結構, 到http://www.busybox.net/上下載最新的Busybox源代碼編譯安裝到剛纔創建的目錄,
拷貝ARM的庫文件到相應目錄,在etc/目錄創建若干必須的啓動腳本和配置文件。 下面說一下怎麼生成一個ext3格式的文件系統映像:
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 //創建一個32M的空文件
mkfs.ext3 a9rootfs.ext3 //格式化爲EXT3
sudo mount -t ext3 a9rootfs.ext3 a9rootdir/ -o loop //掛載到a9rootdir目錄
cp path/to/your/rootfs/* a9rootdir/ -Rf //拷貝文件到該目錄,相對於放到a9rootfs.ext3裏面
sudo umount a9rootdir/
至此a9rootfs.ex3 就包含了我們創建的根文件系統內容, 並且是ext3格式。
6. 使用Qemu運行Linux:
qemu-system-arm -kernel zImage -serial stdio -M vexpress-a9 -append "root=/dev/mmcblk0 console=ttyAMA0 console=tty0" -sd a9rootfs.ext3
Qemu 可以模擬SD卡, 我們把a9rootfs.ext3作爲一個SD設備,對應的設備文件即爲 /dev/mmcblk0, 以它作爲根文件系統啓動。 ttyAMA0: Serial console; tty0: Framebuffer Console. 最後放一張啓動後的圖片: