TCP/IP協議棧之QEMU(零)--- LwIP開發調試環境搭建

一、QEMU環境搭建

嵌入式軟件開發離不開開發板,在沒有物理開發板的情況下,可以使用 QEMU 等類似的虛擬機來模擬開發板。QEMU 是一個支持跨平臺虛擬化的虛擬機,它可以虛擬很多開發板。

如果我們手邊沒有開發板,可以在個人電腦上運行QEMU學習操作系統及互聯網協議棧的開發調試。比如,筆者最開始學習操作系統,使用的是《30天自制操作系統》這本書,按照書中所示,從零開始一步步構建起一個簡單可運行的操作系統,每實現一個功能,都是運行在QEMU虛擬機中觀察效果的,實現過程源碼:https://github.com/StreamAI/30dayMakeOS

選擇學習TCP/IP互聯網協議棧也可以藉助QEMU虛擬機,在個人電腦上虛擬出一個開發板,以瞭解LwIP協議棧的實現原理及開發調試過程。爲了方便大家在沒有開發板的情況下體驗 RT-Thread,RT-Thread 提供了 QEMU 模擬的 ARM vexpress A9 開發板的板級支持包 (BSP), 我們可以在此基礎上學習LwIP協議棧的開發與調試。

需要下載、安裝的軟件包如下:

QEMU工具是從RT-Thread源代碼中複製(在rt-thread-4.0.1\bsp\qemu-vexpress-a9目錄下啓動env環境執行scons --dist命令獲得)出來的。針對QEMU環境配置也可以參考RT-Thread文檔:QEMU環境搭建

目錄.\LwIP_Projects\qemu-vexpress-a9下的文件結構如下圖所示:
qemu-vexpress-a9目錄結構
在.\LwIP_Projects\qemu-vexpress-a9目錄下啓動env環境(不熟悉env環境的可參考:env視頻教程env用戶手冊),在env環境中執行scons命令,待編譯完成後,再次執行qemu命令,會啓動QEMU虛擬開發板界面,如下圖所示:
編譯qemu工程並啓動qemu
QEMU虛擬環境運行界面

  • 配置TAP網卡

如果想連通網絡,還需要安裝並配置TAP網卡,tap-windows-9.21.2安裝成功後會在電腦”網絡連接“裏面出現一個新的網絡適配器”TAP-Windows Adapter V9“,將其重命名爲tap。

右鍵選擇當前上網的網絡連接(本文使用WI-FI),打開屬性–>共享,選擇家庭網絡連接爲 tap,點擊確定完成設置,如下圖所示:
配置tap網卡並共享網絡
將安裝並配置好的TAP網卡添加配置到qemu-vexpress-a9工程qemu.bat腳本文件中,添加配置項”-net nic -net tap,ifname=tap“,添加位置如下圖所示(用VSCode打開的qemu-vexpress-a9工程qemu.bat腳本文件):
qemu.bat添加tap網卡配置
配置完tap網絡適配器後,重新在env環境中執行qemu命令,待QEMU虛擬開發板界面打開後,執行"ifconfig"命令查看網卡信息,執行"ping www.baidu.com"命令測試網絡連通性,命令執行界面如下:
QEMU查看網卡信息並測試網絡連通性
到這裏QEMU虛擬開發板的LwIP環境就搭建好了,從上圖可以看出QEMU默認配置的LwIP-2.0.2版本,如果想更改爲其他版本,可以在env環境中執行"menuconfig"命令,啓動RT-Thread Project Configuration界面,選擇RT-Thread Components --> Network --> light weight TCP/IP stack --> lwIP version進入版本選擇界面:
選擇lwip版本
選中要使用的LwIP版本(比如LwIP v2.1.0,舊版LwIP v1.4.1編譯後網絡連接有問題,我們使用最新版學習)後按space空格鍵選中,保存配置並推出menuconfig,配置界面如下:
配置LwIP-V2.1.0
在env環境中運行scons重新編譯qemu-vexpress-a9工程,再次運行qemu命令啓動QEMU虛擬開發板,可以看到初始化LwIP-2.1.0完成了,接着執行"ifconfig"命令,如果看到IP地址都顯示0,等幾秒鐘後再次執行"ifconfig"命令即可獲得網卡地址,界面如下:
選擇lwip-v2.1網絡連通
如果執行"ifconfig"命令始終無法獲得IP地址,或者執行"ping www.baidu.com"超時不可達,則把共享網卡功能(這裏是WIFI無線網絡連接)關閉後再重新打開,即可解決該問題。

二、使用VS Code調試QEMU

VS Code(全稱 Visual Studio Code)是一個輕量且強大的代碼編輯器,支持 Windows,OS X 和 Linux。內置 JavaScript、TypeScript 和 Node.js 支持,而且擁有豐富的插件生態系統,可通過安裝插件來支持 C++、C#、Python、PHP 等其他語言。

若想了解更多VS Code在工程管理中的應用,可參考博客:VSCode+GCC+Makefile+GitHub項目管理,前面用到的scons編譯命令實際上類似於Makefile,scons使用python語法配置比Makefile更簡單些。運行scons命令,實際默認使用的編譯工具也是GCC。

在 Env 控制檯進入 qemu-vexpress-a9 BSP 根目錄,然後輸入命令 code . (code 是命令,點 ‘.’ 是參數表示當前目錄,中間由空格隔開)打開 VS Code,表示使用 VS Code 打開當前目錄。開始調試前需要編輯 qemu-vexpress-a9 目錄下的 qemu-dbg.bat 文件,在 qemu-system-arm 前加入 start ,配置界面如下圖所示(VS Code需要安裝C/C++插件):
qemu調試配置
選擇調試選項”Debug @windows“ ,在main函數中插入斷點,按F5鍵開始調試:
選擇調試選項
按F5按鍵後,QEMU運行起來了,在 VS Code 裏可以使用 GDB 命令,需要在最前面加上 -exec。 例如 -exec info registers 命令可以查看寄存器的內容:
QEMU調試界面

三、WireShark網絡抓包分析

在網絡編程的過程中,經常需要利用抓包工具對開發板發出或接收到的數據包進行抓包分析。wireshark 是一個非常好用的抓包工具,使用 wireshark 工具抓包分析,是學習網絡編程必不可少的一項技能。

安裝 wireshark,一路默認安裝就行,在進行到Npcap安裝時,勾選如下圖所示的兩個選項:
Npcap安裝配置
打開 wireshark 之後,會給出你的網卡信息,讓你選擇一個要抓包的網卡如下圖所示,選擇自己開發板用來上網的網卡,雙擊就開始抓包了(不熟悉wireshark使用的可參考博客:wireshark使用教程)。
wireshark選擇tap網卡
wireshark開始抓取tap網絡數據包後,啓動qemu-vexpress-a9虛擬開發板,並執行“ping www.baidu.com”命令,設置過濾icmp報文,抓取到的其中一個數據包信息如下:
wireshark抓取icmp數據包
使用 wireshark 抓包工具,在進行網絡開發與調試的時候就會事半功倍了。

本章源碼下載地址:https://github.com/StreamAI/LwIP_Projects/tree/master/qemu-vexpress-a9

更多文章:

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