A. QEMU Monitor 使用
從命令行啟動qemu之後,按鍵 Ctrl-a c 可以進入monitor,之後可以執行很多有用的命令。具體可以參考 https://qemu.readthedocs.io/en/latest/system/monitor.html 。但是文檔沒有提到的是其他進入monitor的方式,尤其是想要同時有consel 和 monitor的情況。
查詢手冊的執行參數一章可以看到參數 -monitor dev 可以指定monitor使用什麼字元設備輸出。但是用法沒給,而且必須使用字元設備也比較難用。
繼續查詢,這個回答很有幫助,提到如何開啟網路埠做monitor: https://unix.stackexchange.com/questions/426652/connect-to-running-qemu-instance-with-qemu-monitor
再查閱手冊,問題已經明白了。 dev設備 可以是很多形式,在執行參數 -serial dev 裡面講的很全面。 https://qemu.readthedocs.io/en/latest/system/invocation.html 。
而且這種靈活的使用方式不僅適用於monitor,也適用於 serial, 也就是能夠很方便的把guest os的consel重定向到各種形式的介面上(包括 虛擬控制台,tty,網路,管道,文件等)。
QEMU的強大令人驚嘆,回頭看看這塊源碼怎麼實現的。
這里給出具體參數,省去查找的麻煩:
qemu-system-aarch64 ... -monitor telnet:127.0.0.1:55555,server,nowait
使用telnet即可監聽埠: telnet 127.0.0.1 55555
UNIX套接字為簡單高效建立本地進程間通信的一種機制,介面和網路套接字一致,但是內部去掉了TCP/IP協議棧的繁瑣流程,提高通信效率。相關說明: https://akae.github.io/book/ch37s04.html
QEMU參數為: -monitor unix:qemu-monitor-socket,server,nowait , qemu-monitor-socket為套接字名稱,可以自定義。
使用socat連接: socat - unix-connext:qemu-monitor-socket 。 socat連接效果比telnet效果好。
socat工具十分強大,使用參考: http://brieflyx.me/2015/linux-tools/socat-introction/ 和 https://www.jianshu.com/p/54005e3095f3 。
B. qemu怎樣為選擇arm linux內核鏡像選擇運行arm平台
下載Linux內核
下載內核有兩種方法,一種是用git直接下載內核代碼樹,方便後面的內核開發。另一種是直接到內核社區下載對應版本的源碼包。我採用第一種方法,但後面發現主線上3.18版本和後面版本的代碼,使用這種搭建方法運行不起來。目前未查明問題的根因。如果讀者想快速搭建成功,建議選用3.16版本的內核進行搭建。
安裝arm的交叉編譯工具鏈
想必做嵌入式開發的朋友,對交叉編譯工具鏈不陌生。如果你訂制一個交叉編譯工具鏈,建議你使用crosstool-ng開源軟體來構建。但在這里建議直接安裝arm的交叉編譯工具鏈:
sudoapt-getinstallgcc-arm-linux-gnueabi
編譯Linux內核
生成vexpress開發板子的config文件:
makeCROSS_COMPILE=arm-linux-gnueabi-ARCH=armvexpress_defconfig
編譯:
makeCROSS_COMPILE=arm-linux-gnueabi-ARCH=arm
生成的內核鐿像位於arch/arm/boot/zImage,後續qemu啟動時需要使用該鏡像。
下載和安裝qemu模擬器
其實Ubuntu12.04有qemu的安裝包,但由於版本較低,對vexpress開發板支持不友好,建議下載高版本的qemu:
wget
配置qemu前,需要安裝幾個軟體包:
sudoapt-getinstallzlib1g-dev
sudoapt-getinstalllibglib2.0-0
sudoapt-getinstalllibglib2.0-dev
配置qemu,支持模擬arm架構下的所有單板:
./configure--target-list=arm-softmmu--audio-drv-list=
編譯和安裝:
make
makeinstall
測試qemu和內核能否運行成功
qemu已經安裝好了,內核也編譯成功了,到這里最好是測試一下,編譯出來的內核是否OK,或者qemu對vexpress單板支持是否夠友好。
運行命令很簡單:
qemu-system-arm-Mvexpress-a9-m512M-kernel/home/ivan/kernel_git/linux/arch/arm/boot/zImage-nographic-append"console=ttyAMA0"
如果看到內核啟動過程中的列印,說明前的搭建是成功的。
這里簡單介紹下qemu命令的參數:
-Mvexpress-a9模擬vexpress-a9單板,你可以使用-M?參數來獲取該qemu版本支持的所有單板
-m512M單板運行物理內存512M
-kernel/home/ivan/kernel_git/linux/arch/arm/boot/zImage告訴qemu單板運行內核鏡像路徑
-nographic不使用圖形化界面,只使用串口
-append"console=ttyAMA0"內核啟動參數,這里告訴內核vexpress單板運行,串口設備是哪個tty。
注意:
我每次搭建,都忘了內核啟動參數中的console=參數應該填上哪個tty,因為不同單板串口驅動類型不盡相同,創建的tty設備名當然也是不相同的。那vexpress單板的tty設備名是哪個呢?其實這個值可以從生成的.config文件CONFIG_CONSOLE宏找到。
如果搭建其它單板,需要注意內核啟動參數的console=參數值,同樣地,可從生成的.config文件中找到。
製作根文件系統
到這里是否大功告成了呢?其實在上面的測試中,你會發現內核報panic,因為內核找不到根文件系統,無法啟init進程。
根文件系統要考慮兩個方面:
1.根文件系統的內容
如果你看過《LinuxFromScratch》,相信你會對這一步產生恐懼感,但如果一直從事嵌入式開發,就可以放下心來。根文件系統就是簡單得不能再簡單的幾個命令集和態動態而已。為什麼LinuxFromScratch會有那麼復雜,是因為它要製作出一個Linux發生版。但在嵌入式領域,幾乎所有的東西,都是mini版本,根文件系統也不例外。
本文制本的根文件系統=busybox(包含基礎的Linux命令)+運行庫+幾個字元設備
2.根文件系統放在哪裡
其實依賴於每個開發板支持的存儲設備,可以放到NorFlash上,也可以放到SD卡,甚至外部磁碟上。最關鍵的一點是你要清楚知道開發板有什麼存儲設備。
本文直接使用SD卡做為存儲空間,文件格式為ext3格式
下載、編譯和安裝busybox
wget
makedefconfig
makeCROSS_COMPILE=arm-linux-gnueabi-
makeinstallCROSS_COMPILE=arm-linux-gnueabi-
安裝完成後,會在busybox目錄下生成_install目錄,該目錄下的程序就是單板運行所需要的命令。
形成根目錄結構
先在Ubuntu主機環境下,形成目錄結構,裡面存放的文件和目錄與單板上運行所需要的目錄結構完全一樣,然後再打包成鏡像(在開發板看來就是SD卡),這個臨時的目錄結構稱為根目錄
1.創建rootfs目錄(根目錄),根文件系統內的文件全部放到這里
sudomkdirrootfs
2.拷貝busybox命令到根目錄下
sudocpbusybox-1.20.2/_install/*-rrootfs/
3.從工具鏈中拷貝運行庫到lib目錄下
sudocp-P/usr/arm-linux-gnueabi/lib/*rootfs/lib/
4.創建4個tty端終設備
sudomknodrootfs/dev/tty1c41
sudomknodrootfs/dev/tty2c42
sudomknodrootfs/dev/tty3c43
sudomknodrootfs/dev/tty4c44
製作根文件系統鏡像
1.生成32M大小的鏡像
ddif=/dev/zeroof=a9rootfs.ext3bs=1Mcount=32
2.格式化成ext3文件系統
mkfs.ext3a9rootfs.ext3
3.將文件拷貝到鏡像中
sudomkdirtmpfs
sudomount-text3a9rootfs.ext3tmpfs/-oloop
cp-rrootfs/*tmpfs/
sudoumounttmpfs
系統啟動運行
完成上述所有步驟之後,就可以啟動qemu來模擬vexpress開發板了,命令參數如下:
qemu-system-arm-Mvexpress-a9-m512M-kernel/home/ivan/qemu/linux/arch/arm/boot/zImage-nographic-append"root=/dev/mmcblk0console=ttyAMA0"-sda9rootfs.ext3
從內核啟動列印,到命令行提示符出現,激動人心的時刻出現了……
寫在後面的話
通過上面的步驟,搭建出來一個最小的qemu+arm開發環境,你可以上面的基礎上修改內核,或者增加一些測試程序在單板上運行,甚至使用單板的flash設備。
在此,你可以做純arm架構的內核開發,或者與架構無關的內核開發,也可以做單板相關的驅動開發。