2021-05-12 14:32:11
QEMU搭建Kernel偵錯開發環境
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目錄,該目錄下的程式就是單板執行所需要的命令。
形成根檔案系統
- 建立rootfs目錄(根目錄),根檔案系統內的檔案全部放到這裡
sudo mkdir rootfs - 拷貝busybox命令到根目錄下
sudo cp busybox-1.20.2/_install/* -r rootfs/
製作根檔案系統映象
- 生成32M大小的映象
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 - 格式化成ext3檔案系統
mkfs.ext3 a9rootfs.ext3 - 將檔案拷貝到映象中
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
相關文章