一笛求,前言
無意間看到了qemu的文章柱宦,就想到qemu我之前玩過的,還定制了自己的虛擬開發(fā)板扶歪。當時主要學習了glib事件驅(qū)動模型及做了一個led顯示,用了sdl2顯示框架及API。而實際的kvm仿真連接到真實的io功能并沒有使用善镰,僅了解了通過io會觸發(fā)中斷通知妹萨,然后在執(zhí)行io處理函數(shù)進行轉(zhuǎn)換到實際io,就完成了虛擬io炫欺。所以還有kvm這個東東吸引我去探秘乎完,我的小暑假接近尾聲了,那么就kick off第二輪qemu學習吧品洛。
二树姨,需求
大總結(jié):Qemu虛化源碼二次開發(fā)--Apple的學習筆記 - 簡書 (jianshu.com)
先復習及參考之前的環(huán)境搭建,然后確認新的工具鏈桥状。我本來想升級ubuntu版本帽揪,結(jié)果2.8stm特制板的編譯依賴庫差距太大,ubuntu16.04又無法和windows交互copy命令辅斟,所以不想用原來的環(huán)境了转晰,那么就降級到ubunut14.04,進行了重新安裝士飒。至于自定義開發(fā)板我準備選擇我熟悉且簡單的stm32查邢,目的是有利于快速學習添加自定義開發(fā)板的方法。
三酵幕,qemu2.8 stm特制版編譯及調(diào)試環(huán)境搭建
a. 編譯qemu
1. copy stm特制版源碼到/work目錄下
2. 先安裝基本庫侠坎,否則配置或編譯過程會報錯誤
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-image-dev
sudo apt-get install libpixman-1-dev
sudo apt-get install libfdt-dev
3. 主目錄下進行配置
./configure --target-list=gnuarmeclipse-softmmu --enable-debug
注:若提示python版本錯誤,添加--python=/usr/bin/python2.7即可
4. 主目錄下編譯
make
5. 不用install安裝裙盾,做成臨時的應用文件实胸。所以使用前先創(chuàng)建環(huán)境變量。
export PATH=/work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu:$PATH
6. 查看版本及支持的開發(fā)板
qemu-system-gnuarmeclipse --version
qemu-system-gnuarmeclipse -M help
7. 若編譯器換了番官,或過程中有其他error可以嘗試重新配置和重新編譯
make defconfig
make clean
b. 使用stm32的elf進行仿真庐完,驗證qemu正確性
1. Copy STM32F429_Discovery_FreeRTOS_9壓縮包到/work文件夾并且解壓
2. 將3個文件夾復制到/usr/local/share/qemu,避免報錯缺少jpg徘熔。
先在/usr/local/share下創(chuàng)建qemu文件夾门躯,然后copy總工3個文件夾。
cp -R /mnt/hgfs/sharevm/qemu/devices
cp -R /mnt/hgfs/sharevm/qemu/graphics
cp -R /mnt/hgfs/sharevm/qemu/keymaps
3. cd /work/STM32F429_Discovery_FreeRTOS_9/Projects/LED
4. qemu-system-gnuarmeclipse --verbose --verbose --board STM32F429I-Discovery
--mcu STM32F429ZI -d unimp,guest_errors --image led.elf --semihosting-config enable
c. gdb調(diào)試qemu源碼酷师,便于之后自定義開發(fā)板
Gdb其實是調(diào)試qemu-system-gnuarmeclipse的c代碼讶凉。而led.elf僅僅是這個c代碼的輸入?yún)?shù)或數(shù)據(jù)文件。
1. 在LED文件夾下山孔,主機(通過gdb來調(diào)試qemu啟動的elf)
gdbserver localhost:2345
/work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu/qemu-system-gnuarmeclipse
--board STM32F429I-Discovery --mcu STM32F429ZI --image led.elf
注:若不在LED文件夾
--image后需要/work/STM32F429_Discovery_FreeRTOS_9/Projects/LED/led.elf
2.再開一個cmd窗口做客戶機
運行
gdb /work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu/qemu-system-gnuarmeclipse
輸入target remote localhost:2345
四懂讯,qemu2.8仿真stm32仿真環(huán)境搭建
a. 在ubuntu下交叉編譯stm32
1. 復制gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2到/work/tools目錄下,然后tar –xvjf解壓bz2台颠。
2. 設置臨時環(huán)境變量
export PATH=/work/tools/gcc-arm-none-eabi-5_4-2016q3/bin:$PATH
3. 進入LED文件進行make即可褐望。
b. 通過qemu來調(diào)試仿真stm32
Qemu用自帶的gcc編譯的,所以調(diào)試用對應的gdb。
STM32用交叉編譯的瘫里,所以調(diào)試用對應的arm-none-eabi-gdb实蔽。
而啟動STM需要用到qemu的bin文件通過tcp端口1234來實現(xiàn)蓬衡。
對應qemu的參數(shù)-gdb則是啟動qemu的內(nèi)嵌gdbserver,監(jiān)聽的是本地tcp端口1234—如果這樣寫: -gdb tcp:192.168.1.100:1234 ,似乎也是沒問題的庭瑰。 -S 就是掛起gdbserver,讓gdb remote connect it。
Semihosting 參數(shù)夠讓 bare-metal 的 ARM 設備通過攔截指定的 SVC 指令摩幔,在連操作系統(tǒng)都沒有的環(huán)境中實現(xiàn) POSIX 中的許多標準函數(shù)劳殖,比如 printf铐尚、scanf、open闷尿、read塑径、write 等等女坑。這些 IO 操作將被 Semihosting 協(xié)議轉(zhuǎn)發(fā)到 Host 主機上填具,然后由主機代為執(zhí)行,所以在 ARM 模擬器中執(zhí)行一個 printf 可以直接打印到 Host 主機上的終端窗口中匆骗;在 ARM 模擬器中寫一個文件可以直接寫到 Host 主機的當前目錄下
1. 前提條件環(huán)境變量需要設置
export PATH=/work/tools/gcc-arm-none-eabi-5_4-2016q3/bin:$PATH
export PATH=/work/qemu-gnuarmeclipse-dev/gnuarmeclipse-softmmu:$PATH
2. 在要調(diào)試的elf所在的文件夾下劳景,比如LED文件下執(zhí)行qemu命令
qemu-system-gnuarmeclipse --verbose --verbose
--board STM32F429I-Discovery --mcu STM32F429ZI --gdb tcp::1234 -S
-d unimp,guest_errors --image led.elf --semihosting-config enable=on,target=native
3. 再開一個cmd窗口啟動客戶端
4. 輸入arm-none-eabi-gdb /work/STM32F429_Discovery_FreeRTOS_9/Projects/LED/led.elf
啟動交叉編譯調(diào)試后輸入target remote localhost:1234
五,小結(jié)
由于我換了ubuntu環(huán)境碉就,過程和2年前稍微有不同盟广,編譯及調(diào)試過程中遇到一些新的坑,所以我還是把基于ubuntu14.04的正確環(huán)境搭建過程記錄下來瓮钥。