一,前言
由于之前玩了下qemu覺(jué)得效果不錯(cuò)。然后看了下源碼,很少的代碼就能實(shí)現(xiàn)這樣的功能,以前只知道虛擬機(jī)是和主機(jī)共享硬件,其它都不知道了。但是qemu它不單單是虛擬機(jī)共享,它還能仿真其它arm內(nèi)核的芯片。所以好奇它的原理,花點(diǎn)時(shí)間了解下,并且學(xué)習(xí)下它的代碼設(shè)計(jì)思路,取其精華去其糟粕。
二,解決疑問(wèn)
- qemu是如何仿真其它芯片的。
我們和程序可以運(yùn)行的原因是通過(guò)編譯器編譯為了機(jī)器能識(shí)別的二進(jìn)制碼。所以qemu利用了此原理,將需要仿真的targe的二進(jìn)制bin文件翻譯為主機(jī)對(duì)應(yīng)的二進(jìn)制碼,所以就可以仿真不同框架的代碼了。target->TCG->host。所有不同種類(lèi)的芯片cpu代碼都先翻譯為T(mén)CG格式,然后翻譯為當(dāng)前的主機(jī)cpu代碼。 -
qemu是如何仿真的。
qemu可以借助KVM加速模擬速度,屬于半虛化。KVM是主機(jī)內(nèi)核的虛化模塊,qemu通過(guò)訪(fǎng)問(wèn)KVM則可以和主機(jī)共享IO。關(guān)于全虛化就是qemu自行模擬所有IO,當(dāng)然速度會(huì)比半虛化慢。我現(xiàn)在初步理解了下qemu和KVM的關(guān)系。
image.png -
qemu如何二次開(kāi)發(fā)添加自定義開(kāi)發(fā)板的
這個(gè)要打開(kāi)qemu代碼看了。簡(jiǎn)單的了解了下,打開(kāi)HW文件夾里面有開(kāi)發(fā)板信息,打開(kāi)后可以看到都是從type_init開(kāi)始的??瓷先ズ蚻inux的設(shè)備驅(qū)動(dòng)模型有點(diǎn)像。官網(wǎng)和網(wǎng)上都搜索下了相關(guān)資料??戳讼?.9版本1.3版本2.8版本感覺(jué)早期版和現(xiàn)在版本區(qū)別比較大。最選擇看2.8版本。因?yàn)槲蚁螺d了一個(gè)2.8版本的STM32特制板源碼,通過(guò)對(duì)比來(lái)學(xué)習(xí)它如何添加設(shè)備的,重點(diǎn)內(nèi)容會(huì)比較突出。
image.png - qemu的實(shí)現(xiàn)機(jī)制
網(wǎng)上了解下qemu源碼每個(gè)文件夾的主要功能。qemu其實(shí)是app代碼,要配合內(nèi)核中的KVM使用來(lái)虛擬cpu和內(nèi)存。然后vl.c里面的main是它的主函數(shù) 。先看了下代碼,它的main函數(shù)通過(guò)回調(diào)函數(shù)注冊(cè)完成后,在mainloop函數(shù)用了glib的poolfd事件觸發(fā)機(jī)制。然后關(guān)于內(nèi)核/dev/kvm需要?jiǎng)?chuàng)建虛擬機(jī)vcpu相關(guān)部分我還不太清楚。
我現(xiàn)在的理解,簡(jiǎn)單來(lái)說(shuō)注冊(cè)了fd的模擬IO讀寫(xiě),然后poolfd后進(jìn)行對(duì)應(yīng)的回調(diào)函數(shù)進(jìn)行截取或模擬,就實(shí)現(xiàn)了qemu的虛擬機(jī)功能。
三,GDB調(diào)試qemu
重新編譯qemu使其帶調(diào)試信息,在ubuntu16.04的虛擬機(jī)中運(yùn)行
./configure --target-list=arm-softmmu --enable-debug
make
很順利的編譯完成,然后運(yùn)行如下命令
- cd /home/tftpboot/
- export PATH=/work/qemu2_8/qemu-2.8.0/arm-softmmu:$PATH
- 直接運(yùn)行qemu檢驗(yàn)效果
qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/tftpboot/my/zImage -dtb /home/tftpboot/my/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3 - GDB調(diào)試命令
gdb --tui --args /work/qemu2_8/qemu-2.8.0/arm-softmmu/qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/tftpboot/my/zImage -dtb /home/tftpboot/my/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3
先用gdb調(diào)試了下,效果如下
vexpress_machine_init,vexpress_a9_class_init,vexpress_instance_init
image.png
image.png
四 后續(xù)還會(huì)有源碼分析
周末天好,我先出去運(yùn)動(dòng)運(yùn)動(dòng)了。關(guān)于qemu2.8的源碼分析,欲知詳情,且看下回分解。



