首頁 > 軟體

QEMU搭建Kernel偵錯開發環境

2020-06-16 17:28:56

QEMU簡介

先看看維基百科的解釋,什麼是QEMU

    QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟體。它與Bochs,PearPC近似,但其具有某些後兩者所不具備的特性,如高速度及跨平台的特性。經由KVM(早期為kqemu加速器,現在kqemu已被KVM替換)這個開源的加速器,QEMU能模擬至接近真實電腦的速度。QEMU有兩種主要運作模式:

User mode模擬模式,亦即是使用者模式。QEMU能引導那些為不同中央處理器編譯的Linux程式。而Wine及Dosemu是其主要目標。
System mode模擬模式,亦即是系統模式。QEMU能模擬整個電腦系統,包括中央處理器及其他周邊裝置。它使得為系統原始碼進行測試及除錯工作變得容易。其亦能用來在一部主機上虛擬數部不同虛擬電腦。

簡而言之,qemu就是一個虛擬機器軟體,我們可以在裡邊跑自己構建的作業系統,這對於學習核心或者驅動開發來說真的是相當方便,可以拋開開發板,單拿一台筆記型電腦就可以學習核心測試模組程式碼,甚至直接做開發。真的是非常方便,廢話不多說,開工。

下載安裝qemu

筆者測試過Ubuntu 12.10 和 ubuntu 16.04兩個版本,ubuntu 12.10apt提供的qemu版本較老對arm verpress板子支援的不夠好(網友前輩說的,具體哪裡不好,我也不知道)。
而ubuntu 16.04 apt提供的是2.5版本的qemu,版本比較新,就不用自己編譯安裝了。
兩種方式全憑個人喜好。

root-># lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04 LTS
Release:    16.04
Codename:   xenial

root-># qemu-system-arm -version
QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.4), Copyright (c) 2003-2008 Fabrice Bellard

ubuntu apt-get方式安裝

  root-># apt-get install qemu-system-arm

使用此命令會自動解決依賴關係完成安裝過程,安裝完成可以通過qemu-system-arm -version
測試安裝是否成功。

自己下載安裝

ubuntu 的apt其實有qemu的安裝包,但是版本較低對vexpress的支援不好,此處直接下載較高版本的qemu自己手動安裝。
wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2
首先需要安裝qemu依賴的環境
apt-get install libglib2.0-dev zlib1g-dev
下載完成後安裝前需要進行設定,使其支援ARM架構下的所有單板

cd qemu/
./configure --target-list=arm-softmmu --audio-drv-list=
make 
make install

下載編譯核心

下載核心

可以自行到www.kernel.org上下載最新版核心

  root-># wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.gz

編譯核心

  root-># apt-get install libncurses5-dev   

  root->#tar -zxvf linux-3.16.tar.gz 
  root-># cd linux-3.16
  root-># cp arch/arm/configs/vexpress_defconfig  .config
  root-># make menuconfig CROSS_COMPILE=arm-linux- ARCH=arm
  root-># make -j4 CROSS_COMPILE=arm-linux- ARCH=arm

qemu模擬最好的arm晶片是ARM親生的vexpress A9,本文搭建環境就以此為基礎。

測試qemu和核心啟動是否成功

qemu-system-arm  -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0" -kernel  /root/zImage-3.0

這裡簡單介紹下qemu命令的引數:

-M vexpress-a9 模擬vexpress-a9單板,你可以使用-M ?引數來獲取該qemu版本支援的所有單板
-m 512M 單板執行實體記憶體512M
-kernel /root/zImage-3.16  告訴qemu單板執行核心映象路徑
-nographic 不使用圖形化介面,只使用串列埠
-append "console=ttyAMA0" 核心啟動引數,這裡告訴核心vexpress單板執行,串列埠裝置是哪個tty。 

發現啟動到掛載根檔案系統的時候出現kernel painc,說明核心已經正常啟動了。然後需要製作根檔案系統。

製作根檔案系統

編譯busybox

wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2 
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install 

安裝完成後,會在busybox目錄下生成_install目錄,該目錄下的程式就是單板執行所需要的命令。

形成根檔案系統

  1. 建立rootfs目錄(根目錄),根檔案系統內的檔案全部放到這裡
    sudo mkdir rootfs
  2. 拷貝busybox命令到根目錄下
    sudo cp busybox-1.20.2/_install/* -r rootfs/

製作根檔案系統映象

  1. 生成32M大小的映象
    dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
  2. 格式化成ext3檔案系統
    mkfs.ext3 a9rootfs.ext3
  3. 將檔案拷貝到映象中
    sudo mkdir tmpfs
    sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
    cp -r rootfs/* tmpfs/
    sudo umount tmpfs

使用qemu啟動自定義系統

qemu-system-arm -M vexpress-a9 -m 512M -kernel /root/zImage-3.16 -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3 

從核心啟動列印,到命令列提示符出現,到此qemu的arm環境就搭建完成了,可以 用來做核心學習了。
但是目前方式掛載的根檔案系統使用起來很麻煩,每次修改完程式碼重新編譯之後都需要重新製作檔案系統映象。因此更推薦後邊的做法。

使用nfs檔案系統啟動

安裝nfs服務程式

sudo apt-get install nfs-kernel-server

建立nfs共用資料夾

將前邊建立的rootfs資料夾的許可權修改為777
sudo chmod 777 /root/rootfs
修改/etc/exports檔案
sudo vim /etc/exports
新增/root/rootfs *(rw,insecure,sync,no_root_squash)

啟動nfs服務

sudo /etc/init.d/nfs-kernel-server start
測試一下nfs環境是否搭建成功
sudo mount -t 127.0.0.1:/root/rootfs /mnt/
ls /mnt檢視是否掛載成功
sudo umount /mnt

qemu掛載nfs根檔案系統

qemu-system-arm  -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0 root=/dev/nfs nfsroot=/root/rootfs rw ip=dhcp nousb" -kernel  /root/zImage-3.16

其中nfsroot=後邊是nfs根檔案系統位置
ip=dhcp指定qemu guest os 的ip分配方式

至此可以很方便的使用qemu掛載nfs檔案系統進行核心學習和開發了。
本文錯略的介紹了qemu搭建核心學習的過程,沒有過多的關注細節,有興趣的可以研究一些qemu的其他引數,qemu的網路設定,以及更詳細的檔案系統構建方法。

Ubuntu 14.04中安裝QEMU http://www.linuxidc.com/Linux/2016-08/134084.htm

Ubuntu下使用KVM+Qemu 搭建虛擬機器  http://www.linuxidc.com/Linux/2015-10/123796.htm

Linux入門學習教學:虛擬機器體驗之QEMU篇  http://www.linuxidc.com/Linux/2015-03/114461.htm

Ubuntu 12.04之找不到Qemu命令 http://www.linuxidc.com/Linux/2012-11/73419.htm

Arch Linux上安裝QEMU+EFI BIOS http://www.linuxidc.com/Linux/2013-02/79560.htm

QEMU的翻譯框架及偵錯工具 http://www.linuxidc.com/Linux/2012-09/71211.htm

QEMU 程式碼分析:BIOS 的載入過程 http://www.linuxidc.com/Linux/2014-12/110472.htm


IT145.com E-mail:sddin#qq.com