日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QEMU 模拟器(一)

發布時間:2024/5/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QEMU 模拟器(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

安裝

安裝 比較簡單, 有幾種方案.

  • 遠程倉庫安裝
  • 官網下載可執行文件(Windows 平臺適用)
  • 通過源碼自己編譯
apt-get install qemu # Debian/Ubuntu pacman -S qemu # Arch pacman -S mingw-w64-x86_64-qemu # MSYS2

可只裝指定平臺, 如 ARM: sudo apt-get install qemu-system-arm

u-boot 仿真

下載 uboot 源碼 這里以版本u-boot-2018.09.tar.bz2 為例

  • 首先進入uboot根目錄, 執行export ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- # 設置編譯平臺和工具鏈 make vexpress_ca9x4_defconfig # 加載板子的配置信息 make -j8 # 多線程編譯
  • 編譯完成后使用 QEMU 啟動:qemu-system-arm -M vexpress-a9 -m 256M -kernel u-boot -nographic
    • -M 指定了主板類型, 和上面編譯的 uboot 主板參數一致
    • -m 表示主板的 DRAM 大小
    • -kernel 后面的可執行文件會被QEMU直接加載到內存并執行, 這里等效于 -device loader,file=u-boot,cpu-num=0
    • -nographic 表示不啟動圖形界面

    [注]: 先按 Ctrl-A 進入QEMU的功能選擇模式, 然后按 x 退出.
    [提示]: Ctrl-A 后按 ? 可查看有哪些功能選項.

  • Linux kernel 仿真

    下載 kernel 源碼, 這里以5.17版本為例

  • 在 kernel 根目錄執行

    export ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- # 設置編譯平臺和工具鏈 make vexpress_defconfig # 加載板子的配置信息 make zImage dtbs -j8 # 編譯目標

    在新版內核中,需要給內核生成對應的 dtb,因此目標 dtbs 是需要的

    編譯后在 arch/arm/boot 生成 zImage, 在 arch/arm/boot/dts 生成 vexpress-v2p-ca9.dtb 可將它們拷貝出來使用, 后面將默認它們已經拷貝出來放在同一路徑了

  • 直接加載內核到QEMU
    load.sh 文件:

    qemu-system-arm \-M vexpress-a9 \-m 256M \-nographic \-kernel zImage \-dtb vexpress-v2p-ca9.dtb
    • -dtb 告訴QEMU將文件用作設備樹二進制(DTB)映像,并在引導時將其傳遞給內核。

    執行上面腳本后, QEMU將運行Linux內核鏡像, 內核顯示許多引導消息,然后它將報告: not syncing: VFS, 表示沒有找到根文件系統

  • 制作簡單的根文件系統, 并在內核初始化時執行 Hello World 程序
    hello.c

    #include <stdio.h>void main() {printf("Hello World!\n");while(1);}

    編譯 hello 程序

    arm-linux-gnueabi-gcc -static hello.c -o hello
    • -static 表示靜態編譯, 靜態編譯會將所有庫都鏈接在一個二進制文件中

    [注] 引入無限循環是因為當Linux執行根文件系統中的第一個程序時,它預計該程序不會退出

    制作基于內存的初始根文件系統 (initramfs), 參考

    Linux 支持把一段內存用來充當臨時的文件系統, 這樣做是因為在內核啟動完成后很可能硬盤等設備并未初始化完成, 將內存作為臨時根文件系統, 并在該根文件系統下執行用戶程序, 由用戶程序來完成初始化工作并掛載在硬盤上的真正的根文件系統

    我們使用cpio工具創建一個簡單的文件系統:

    echo hello | cpio -o --format=newc > rootfs

    cpio 工具輸入一個文件列表, 輸出一個文件. 這里指明輸出的文件格式是 newc, 它是 initramfs 文件系統格式,Linux內核可以識別.

    load.sh

    qemu-system-arm \-M vexpress-a9 \-m 256M \-nographic \-kernel zImage \-dtb vexpress-v2p-ca9.dtb \-initrd rootfs \-append "root=/dev/ram init=/hello console=ttyAMA0"
    • -initrd QEMU可以使用initrd參數將 initramfs 文件系統二進制映像傳遞給內核;
    • -append 用于向內核傳遞參數, 內核還必須知道根文件系統將位于RAM中(因為這是QEMU寫入initrd二進制文件的位置),并且指明第一個啟動的程序是我們的測試可執行文件hello
    • console=ttyAMA0 是將輸出定向到串口, 否則需要去掉 -nographic 才能查看

    上面的shell 腳本執行后將會看到屏幕上顯示Hello World, 并且內核停留在 while 循環.

  • initrd vs initramfs
    initrd 是 Linux 2.6 版本以前制作內存根文件系統的方法了, 該方法已經過時. 這是因為 initrd (initial ram disk 初始化內存磁盤) 是把內存當做一塊磁盤, 內核需要先創建 ramdev 塊設備, 然后將 initrd 拷貝到塊設備,最后掛載.
    同時 initrd 內的文件系統還需要驅動支持, 如果是 ext2 則必須在內核中編譯 ext2 驅動程序. initrd 最大的缺點是占用較大內存,不可伸縮. 參考官方文檔
    下面演示如何制作 initrd

    dd if=/dev/zero of=rootfs.img bs=1024 count=4096 # 創建 4096k 虛擬磁盤 mkfs.ext2 rootfs.img # 格式化成 ext2 格式文件系統 mount -o loop rootfs.img /mnt # 將鏡像文件和塊設備關聯并掛載設備到 /mnt cp hello /mnt # 將 hello 程序拷貝到根目錄 umount /mnt # 卸載磁盤

    新版本 kernel 默認不再支持內存塊設備支持, 需要手動打開:
    在內核目錄執行 grep BLK_DEV_RAM .config 查看 BLK_DEV_RAM 是否被編譯進去, 若沒有則需要使用 make menuconfig 進入設置后按 / 查找 BLK_DEV_RAM 并到對應區域打開該功能

    重新編譯內核后拷貝出 zImage 執行下面的腳本

    qemu-system-arm \-M vexpress-a9 \-m 256M \-nographic \-kernel zImage \-dtb vexpress-v2p-ca9.dtb \-initrd rootfs.img \-append "root=/dev/ram0 init=/hello console=ttyAMA0"

    新版的 initramfs 直接把內存作為文件系統, 因為內核總是內置 tmpfs 文件系統 (initramfs就是tmpfs的實例), 可以直接掛載不需要設備和額外的文件系統驅動程序.

  • 根文件系統在外部設備
    現代的高級的系統引導程序, 往往都直接支持文件系統, 在初始化磁盤后可以識別文件系統, 并將參數傳遞給內核從哪個外部設備掛載根文件系統. 制作外部設備的根文件系統鏡像和制作 initrd 是一樣的, 因為它們其實本質都是包含文件系統的鏡像文件, 因此可以直接使用上一節的 rootfs.img 來使用, 只是它們被放到了真正的磁盤, 而 initrd 則是內存虛擬的磁盤. 例如, 我們把它虛擬成sd卡, 讓 QEMU 的引導程序傳遞給內核
    load.sh

    qemu-system-arm \-M vexpress-a9 \-m 256M \-nographic \-kernel zImage \-dtb vexpress-v2p-ca9.dtb \-sd rootfs.img \-append "root=/dev/ram rdinit=/hello console=ttyAMA0"
  • 總結

    以上是生活随笔為你收集整理的QEMU 模拟器(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美视频第一页 | 日韩三级一区 | 91在线导航| 欧美高清一区二区三区四区 | 黑鬼巨鞭白妞冒白浆 | 哈利波特3在线观看免费版英文版 | 天躁夜夜躁狼狠躁 | 韩国av电影网站 | 午夜激情小视频 | 亚洲bb| 黄色xxxxxx| 日本不卡一区二区三区 | 日本老妇性生活 | 亚洲国产免费av | 36d大奶 | 婷婷综合在线观看 | 日本午夜影视 | 99精品视频免费 | 国产熟女精品视频 | 一进一出好爽视频 | 天天干天天爱天天射 | 99热这里都是精品 | 日批在线 | 欧美日韩一区二区视频在线观看 | 自拍三级 | 精品99在线观看 | 乱淫67194| 日韩欧美精品一区二区三区 | 国产成人精品一区二区三区在线 | xxx国产| 免看一级片 | 色站在线 | 伊人av综合网 | www狠狠干 | 久草中文在线 | 无码国产精品久久一区免费 | 亚洲一区二区日韩欧美 | 色一情一区二区三区 | 韩国性经典xxxxhd | 欧美日韩免费视频 | 尹人在线视频 | 天天躁日日躁狠狠很躁 | 午夜免费福利在线观看 | 毛片入口 | 国产片黄色 | 欧美专区第一页 | 91玉足脚交白嫩脚丫 | 国产美女裸体无遮挡免费视频 | 亚洲色图欧洲色图 | 美国一级大黄一片免费中文 | 成人午夜精品 | 夜夜摸夜夜操 | 伊人久久大香线蕉av色婷婷色 | 婷婷丁香花五月天 | 五月激情六月丁香 | 亚洲国产无线乱码在线观看 | 夜夜夜久久久 | 91精品国产色综合久久不卡98 | 99福利在线 | 黑白配在线观看免费观看 | 免费在线观看黄网 | 少妇精品亚洲一区二区成人 | 精品人妻无码一区二区色欲产成人 | 国产一区二区三区精品在线观看 | 久久精品在线免费观看 | 国产人妻大战黑人20p | 99精品在线视频观看 | 黄色一级网 | 色a在线 | 黄色一级片欧美 | 国内外成人免费视频 | 香蕉久久久久久久av网站 | 精品一区二区视频 | 成人免费观看视频网站 | 亚洲一区二区三区在线视频观看 | 久久影院午夜 | 激情一区二区三区 | 91在线看黄 | 永久在线观看 | 91av日本| 日本一区精品视频 | 99精品久久久久久久 | 无码gogo大胆啪啪艺术 | 久久久久国产精品熟女影院 | 免费级毛片| 国产有码视频 | www午夜| 人妻夜夜爽天天爽三区麻豆av网站 | 精品久久一 | 国产熟妇另类久久久久 | 欧美freesex黑人又粗又大 | 男人天堂欧美 | 丰满肥臀噗嗤啊x99av | 国产精品羞羞答答在线观看 | 国语粗话呻吟对白对白 | 四级黄色片 | 美女在线播放 | 亚洲第一在线播放 | 成人精品视频一区二区三区尤物 |