歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用Qemu模擬Cortex-A9運行U-boot和Linux

開發環境: Ubuntu 12.04  所有軟件包為最新
1. 安裝GNU工具鏈
  1. sudo apt-get insatll gcc-arm-linux-gnueabi
  2. sudo apt-get insatll g++-arm-linux-gnueabi
安裝完成後會在 /usr/arm-linux-gnueabi/ 目錄下生成庫文件、頭文件等。 我安裝的GCC版本為:
  1. arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
  2. Copyright (C) 2011 Free Software Foundation, Inc.
2. 安裝Qemu模擬器
  1. sudo apt-get install qemu qemu-system qemu-utils
這時應該已經可以運行qemu-system-arm命令了, 其版本為:
  1. qemu-system-arm --version
  2. 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裡面增加兩行:
  1. ARCH ?= arm
  2. CROSS_COMPILE ?= arm-linux-gnueabi-
其實就是告訴它使用ARM編譯器來編譯。
  1. make ca9x4_ct_vxp_config
  2. make
這裡配置目標板為 Cortex-A9x4 vexpress. 之所以選這個配置可以從 boards.cfg文件裡看到, vexpress是ARM公司使用Cortext-A9的一個開發板,相關的代碼在 board/armltd/vexpress/ 目錄,配置文件為include/configs/ca9x4_ct_vxp.h。  而且關鍵的是Qemu裡面已經支持這個板卡。
編譯完成後會生成u-boot文件 運行:
  1. qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
或者
  1. qemu-system-arm -M vexpress-a9 -m 256M -serial stdio -kernel u-boot
發現,如果沒有指定-nographics, 則必須要加-serial stdio才會有打印。
參數-m 256M為指定內存大小。-M 指定板卡的名稱, 支持的板卡可以用-M ?查看, 如下:
  1. #qemu-system-arm -M ?
  2. Supported machines are:
  3. beagle Beagle board (OMAP3530)
  4. beaglexm Beagle board XM (OMAP3630)
  5. ............
  6. versatilepb ARM Versatile/PB (ARM926EJ-S)
  7. versatileab ARM Versatile/AB (ARM926EJ-S)
  8. vexpress-a9 ARM Versatile Express for Cortex-A9
  9. vexpress-a15 ARM Versatile Express for Cortex-A15
正常運行的結果:
  1. qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot
  2. U-Boot 2012.04 (Jul 08 2012 - 00:14:08)
  3. DRAM: 256 MiB
  4. WARNING: Caches not enabled
  5. Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB
  6. ## Unknown flash on Bank 2 - Size = 0x00000000 = 0 MB
  7. *** failed ***
  8. MMC: MMC: 0
  9. *** Warning - bad CRC, using default environment
  10. In: serial
  11. Out: serial
  12. Err: serial
  13. Net: smc911x-0
  14. Hit any key to stop autoboot: 0
  15. VExpress#
  16. VExpress# printenv
  17. baudrate=38400
  18. bootcmd=run bootflash;
  19. bootdelay=2
  20. bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}
  21. console=ttyAMA0,38400n8
  22. 。。。。。
注意:如果在檢測Flash failed後停止運行,是因為在 arch/arm/lib/board.c裡面 board_init_r()函數裡檢測Flash失敗後調用了hang(), 暫時先把hang()去掉就可以運行下去了。
Copyright © Linux教程網 All Rights Reserved