用qemu-system-arm搭建arm11環境

用qemu-system-arm搭建arm11環境


以下方法將在ubuntu 10.04主機上,利用qemu-system-arm安裝一個arm11的操作系統。系統採用nfs方式掛載文件系統,可以用來模擬arm11的運行環境,學習arm11彙編。

安裝qemu-system-arm

  • sudo add-apt-repository ppa:linaro-maintainers/tools
    sudo apt-get update
    sudo apt-get install qemu-system
  • 安裝好後,可以執行以下命令查看版本
  • qemu-system-arm --version
    QEMU emulator version 0.15.50 (Debian 0.15.50-2011.08-0ubuntu4~ppa10.04.1),
    Copyright (c) 2003-2008 Fabrice Bellard

編譯arm11的內核

  1. 創建文件夾~/arm/kernel,並切換工作目錄
    • mkdir ~/arm
      mkdir ~/arm/kernel
      cd ~/arm/kernel
  2. 下載EABI的TAR包
    • wget https://sourcery.mentor.com/sgpp/lite/arm/portal/package8734/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
      tar xjvf arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
  3. 下載、解壓,爲內核打上armv6支持的補丁
    • wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.4.tar.bz2
      tar -xvf linux-3.0.4.tar.bz2
      wget http://thoronir.net/raspi-dev/linux-arm.patch
      patch -p1 -d linux-3.0.4/ < linux-arm.patch
  4. 設置內核編譯選項
    • cd linux-3.0.4
      make ARCH=arm versatile_defconfig
      make ARCH=arm menuconfig
    • General Setup —>Cross-compiler tool prefix
      (We need to enter the path of the toolchain followed by ‘/bin/arm-none-eabi-’)
    • System Type —>
       
      [*] Support ARM V6 processor
      [*] ARM errata: Invalidation of the Instruction Cache operation can fail
    • Kernel Features —>
       
      [*] Use ARM EABI to compile the kernel
      [*] Allow old ABI binaries to run with this kernel
    • Bus Support —>
       
      [*] PCI Support
       
      Device Drivers —>SCSI Device Support —>
       
      [*] SCSI Device Support
      [*] SCSI Disk Support
      [*] SCSI CDROM support
      [*] SCSI low-lever drivers —>
      [*] SYM53C8XX  Version 2 SCSI support
    • Device Drivers —>Generic Driver Options—>
       
      [*] Maintain a devtmpfs filesystem to mount at /dev
      [*] Automount devtmpfs at /dev, after the kernel mounted the root
    • File systems —>Pseudo filesystems—>
       
      [*] Virtual memory file system support (former shm fs)
    • Device Drivers —>Input device support—>
       
      [*] Event interface
    • Device Drivers —>
       
      [*] Real Time Clock ->
  5. 編譯內核
    • make ARCH=arm

製作文件系統

  1. 新建文件系統目錄並下載文件
    • cd ~/arm
      mkdir debian_armel_squeeze
      sudo debootstrap --foreign --arch armel squeeze debian_armel_squeeze http://ftp.tw.debian.org/debian
  2. 安裝內核模塊
    • cd linux-3.0.4
      sudo make ARCH=arm INSTALL_MOD_PATH=../debian_armel_squeeze modules_install
  3. 複製zImage
    • cd ~/arm
      cp kernel/linux-3.0.4/arch/arm/boot/zImage .

配置NFS服務

  1. 如果沒有安裝NFS,先安裝NFS軟件包
    • sudo apt-get install nfs-kernel-server nfs-common
  2. 配置NFS
    1. 打開配置文件
      sudo vim /etc/exports
    2. 添加服務路徑,在配置文件中加入一行
      /home/darkofday/arm/debian_armel_squeeze  *(rw,sync,no_root_squash)
    3. 保存並重啓nfs服務
      sudo service nfs-kernel-server restart

配置網絡

配置網絡後,主機ubuntu和虛擬的arm11系統就在同一網段,以bridge方式連接.如果您的計算機是在路由器下面,配置網絡完成之後,虛擬機arm11系統和ubuntu均能訪問外網.
  1. 打開TUN/TAP選項
    1. 查看選項是否已經打開
      grep CONFIG_TUN= /boot/config-`uname -r`
    2. 查看/dev/net/tun是否存在,如果不存在,可以創建它
      mknod /dev/net/tun c 10 200
  2. 安裝橋接工具
    • sudo apt-get install bridge-utils
  3. 創建網絡橋接初始化腳本,第一次開虛擬機前運行該腳本;當然,你也可以將該腳本內容添加到/etc/rc.local中,在每次開機時自動運行
    1. 創建並打開配置文件
      cd ~/arm
      touch net-setup
      vim net-setup
    2. 加入以下內容後保存
      #!/bin/bash
      #net-setup
       
      /usr/sbin/brctl addbr br0
      /sbin/ifconfig eth0 0.0.0.0 promisc up
      /usr/sbin/brctl addif br0 eth0
      /sbin/dhclient br0
      /sbin/iptables -F FORWARD
  4. 創建啓動腳本
    1. 創建qemu啓動網絡初始化腳本
      cd ~/arm
      touch qemu-ifup
      vim qemu-ifup

      添加以下內容:
      #!/bin/sh
      /sbin/ifconfig $1 0.0.0.0 promisc up
      /usr/sbin/brctl addif br0 $1
    2. 創建qemu啓動腳本
      touch qemu-start-arm
      vim qemu-start-arm

      根據自己的情況添加以下內容
      #!/bin/bash
      #qemu-start-arm
       
      console="ttyAMA0"
      nfsip="192.168.0.204"
      nfspath="/home/darkofday/arm/debian_armel_squeeze"
      myip="192.168.0.210"
      gateway="192.168.0.1"
      netmask="255.255.255.0"
       
      qemu-system-arm \
      -M versatilepb -cpu arm1176 -m 256 \
      -rtc base=localtime,clock=host \
      -kernel /home/darkofday/arm/zImage \
      -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/home/darkofday/arm/qemu-ifup \
      -append "root=/dev/nfs nfsroot=$nfsip:$nfspath ip=$myip:$nfsip:$gateway:$netmask:arm:eth0:off rw init=/bin/bash" -serial stdio
  5. 初始化arm11系統
    1. 運行net-setup腳本,初始化網絡
      cd ~/arm
      sudo ./net-setup
    2. 啓動arm11系統
      sudo ./qemu-start-arm
    3. 系統啓動成功後,出現shell界面,運行以下命令
      mount /proc /proc -t /proc
      /debootstrap/debootstrap --second-stage

      設置主機名和密碼
      printf "auto eth0\niface eth0 inet dhcp\n" >> etc/network/interfaces
       echo "arm-debian" > /etc/hostname
       passwd

      至此,初始化文件系統完成,可以直接關閉qemu窗口來關閉arm11系統。
  6. 修改啓動腳本
    1. 打開腳本
      vim ~/arm/qemu-start-arm

      修改爲
      #!/bin/bash
      #qemu-start-arm
       
      console="ttyAMA0"
      nfsip="192.168.0.204"
      nfspath="/home/darkofday/arm/debian_armel_squeeze"
      myip="192.168.0.210"
      gateway="192.168.0.1"
      netmask="255.255.255.0"
       
      qemu-system-arm \
      -M versatilepb -cpu arm1176 -m 256 \
      -rtc base=localtime,clock=host \
      -kernel /home/darkofday/arm/zImage \
      -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=/home/darkofday/arm/qemu-ifup \
      -append "root=/dev/nfs nfsroot=$nfsip:$nfspath ip=$myip:$nfsip:$gateway:$netmask:arm:eth0:off rw console=$console" -serial stdio
  7. 備註
    每次開機後(ubuntu 10.04主機),均要運行net-setup腳本一次,然後可以直接執行qemu-start-arm腳本來啓動arm11的linux系統;當然,你可以將net-setup腳本里的內容加到開機啓動腳本里面。使用時,可以將C代碼放在nfs服務目錄下編譯,直接在arm11系統下運行和調試。你甚至可以在arm11系統中更換更快的軟件源,安裝一些額外的軟件,比如ssh,來方便使用。

參考資料

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