qemu搭建和運行起來一個linux內核環境。 參考了博客: https://www.cnblogs.com/edver/p/6001786.html https://www.cnblogs.com/bigsissy/p/11134802.html https://www.cnblogs.com/z ...
qemu搭建和運行起來一個linux內核環境。
參考了博客:
https://www.cnblogs.com/edver/p/6001786.html
https://blog.csdn.net/ReCclay/article/details/102319392
https://www.cnblogs.com/bigsissy/p/11134802.html
https://www.cnblogs.com/zml-forever/p/6277092.html
1. 編譯Linux Kernel鏡像
1 #!/bin/sh 2 3 4 # 預期工具準備: 5 # Ubuntu 22.04 安裝qemu全套 6 sudo apt install qemu 7 sudo apt install qemu-system 8 sudo apt install qemu-user 9 sudo apt install qemu-efi 10 sudo apt install qemu-web-desktop 11 sudo apt install qemu-guest-agent 12 sudo apt install qemu-block-extra 13 sudo apt install qemu-utils 14 sudo apt install qemubuilder 15 # gcc-arm-linux-gnueabi工具 16 sudo apt install gcc-arm-linux-gnueabi 17 # 後續的編譯過程還需要的工具 18 sudo apt install u-boot-tools 19 sudo apt install flex 20 sudo apt install bison 21 sudo apt install libncurses5-dev 22 sudo apt install libncurses-dev 23 # 開發時常用工具 24 sudo apt install cmake 25 sudo apt install git 26 sudo apt install vim 27 sudo apt install build-essential 28 29 30 31 # 註意編譯的Linux內核版本, 如內核版本過低, 而工具鏈和主機Ubuntu過舊, 則可能會帶來大量編譯錯誤 32 33 34 35 # 1. 36 # 修改linux kernel的Makefile的兩個變數為: 37 # ARCH ?= arm 38 # CROSS_COMPILE ?= arm-linux-gnueabi- 39 # 40 cd linux-4.19.269/ 41 vim Makefile 42 43 # 編譯配置 44 make vexpress_defconfig 45 make menuconfig # 這個只要沒有報錯, 直接推出出現的視窗即可 46 47 48 49 # 2. 50 # 編譯linux kernel代碼, 為了加速編譯, 開啟多線程編譯 51 # 52 make zImage -j 4 53 make modules -j 4 54 make dtbs -j 4 55 make LOADADDR=0x60003000 uImage -j 4 56 57 58 59 # 3. 60 # 把鏡像文件zImage和uImage, 設備樹文件dtbs, 複製到工程目錄testboot里, 進行測試一下 61 cd .. 62 mkdir testboot 63 cp arch/arm/boot/zImage ../testboot/ 64 cp arch/arm/boot/uImage ../testboot/ 65 cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../testboot/ 66 67 68 69 # 4. 70 # 測試 71 sh testboot/start.sh 72 # 73 # 測試腳本start.sh的內容: 74 # #!/bin/sh 75 # qemu-system-arm \ 76 # -M vexpress-a9 \ 77 # -m 512M \ 78 # -kernel zImage \ 79 # -dtb vexpress-v2p-ca9.dtb \ 80 # -append "console=ttyAMA0" \ 81 # -nographic \ 82 # 83
2. 使用busybox製作最小文件系統
1 #!/bin/sh 2 3 4 # 1. 5 # 修改busybox的Makefile的兩個變數為: 6 # ARCH ?= arm 7 # CROSS_COMPILE ?= arm-linux-gnueabi- 8 # 9 cd busybox-1.35.0/ 10 vim Makefile 11 12 # 設置編譯為靜態庫: 13 # Settings ---> 14 # Build Options ---> 15 # [*] Build as a static binary (no shared libs) 16 make menuconfig 17 18 19 20 # 2. 21 # 編譯: 22 # 編譯完成後會在busybox目錄下生成一個_install的目錄, 23 # 該目錄是編譯好的文件系統需要使用的一些命令集合 24 make defconfig 25 make -j 4 26 make install 27 28 29 30 # 3. 31 # 新建一個根文件系統的文件夾 32 cd .. 33 mkdir rootfs 34 cd rootfs/ 35 36 # 拷貝_install目錄的命令集到rootfs中 37 cp -rf ../busybox-1.35.0/_install/* ./ 38 39 # 在rootfs中, 新建lib目錄,從工具鏈中拷貝arm執行庫到該lib中 40 mkdir lib 41 cp -p /usr/arm-linux-gnueabi/lib/* lib/ 42 43 44 45 # 4. 46 # 創建字元設備: 設備文件, 跟用戶和底層進行交互的介面, 這些介面以文件節點的形式存在, 讀寫文件, 直接讀寫對應的結點即可 47 48 # 在rootfs中, 創建dev文件夾, 存放各種目錄結點 49 mkdir dev 50 cd dev 51 52 # 創建4個串口結點 53 # 54 # 命令和其參數的意義: 55 # mknod: 創建結點 56 # -m 666: 設置許可權為666 57 # ttyX: 表示串口 58 # c: 表示字元設備 59 # 4: 表示主設備號 60 # 1: 表示次設備號 61 sudo mknod -m 666 tty1 c 4 1 62 sudo mknod -m 666 tty2 c 4 2 63 sudo mknod -m 666 tty3 c 4 3 64 sudo mknod -m 666 tty4 c 4 4 65 66 # 創建1個工作台結點 67 sudo mknod -m 666 console c 5 1 68 69 # 創建null結點 70 sudo mknod -m 666 null c 1 3 71 72 73 74 # 5. 75 # 製作SD根文件系統鏡像: 根文件系統放到SD卡裡, 內核啟動後, 從SD卡掛載根文件系統 76 cd ../.. 77 78 # 生成根文件系統鏡像rootfs.ext3, 直接把rootfs.ext3看成一個SD卡即可 79 # bs: 緩衝區大小, count: 表示塊大小 80 dd if=/dev/zero of=rootfs.ext3 bs=1M count=64 81 82 # 格式化rootfs.ext3 83 mkfs.ext3 rootfs.ext3 84 85 86 87 # 6. 88 # 將各種文件拷貝到文件系統鏡像中 89 mkdir tmpfs 90 91 # 將虛擬sd卡掛載到/tmpfs 92 # -t ext3: 表示文件系統是ext3格式 93 # -o loop: 使用loop模式用來將一個檔案當成硬碟分割掛上系統 94 sudo mount -t ext3 rootfs.ext3 tmpfs/ -o loop 95 96 # 拷貝rootfs的所有文件到sd卡中 97 sudo cp -r rootfs/* tmpfs/ 98 99 # 卸載sd(塊設備不能直接讀寫) 100 sudo umount tmpfs 101 102 103 104 # 7. 105 # 使用qemu在這個最小文件系統上運行linux kernel 106 sh step_qemu_run_os.sh
3. 使用qemu在最小系統上運行編譯好的Linux Kernel鏡像
1 #!/bin/sh 2 3 4 # 使用qemu啟動內核 5 6 7 8 # 上級路徑 9 top_path="/home/thinks2/ProgramProject/qemu_study/" 10 src_path="linux-4.14.302/arch/arm/boot/" 11 12 # 內核文件與dtb文件的路徑 13 kernel_path=${top_path}${src_path}"zImage" 14 dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb" 15 16 17 18 # 用qemu運行Linux內核, 其中: 19 # 20 # 1. -M vexpress-a9: 模擬vexpress-a9單板, 能夠使用-M ?參數來獲取該qemu版本號支持的全部單板 21 # 2. -m 512M: 單板執行物理記憶體512M 22 # 3. -kernel xxx/zImage: 告訴qemu單板執行內核鏡像路徑 23 # 4. -nographic: 不使用圖形化界面, 僅僅使用串口 24 # 25 # 5. -append "root=/dev/mmcblk0 rw console=tty0": 26 # 內核啟動參數這裡告訴內核vexpress單板執行. 其中: 27 # 5.1 root=/dev/mmcblk0: 文件系統的載入Root位置 28 # 5.2 rw: 以讀寫的方式打開文件系統, 以便能夠創建, 修改, 刪除文件 29 # 5.3 console=tty0: 控制台 30 # 31 # 6. -sd rootfs.ext3: 從SD卡載入系統 32 qemu-system-arm \ 33 -M vexpress-a9 \ 34 -m 512M \ 35 -kernel ${kernel_path} \ 36 -dtb ${dtb_path} \ 37 -append "root=/dev/mmcblk0 rw console=tty0" \ 38 -sd rootfs.ext3 \ 39 # -nographic \ 40 41 # console=ttyAMA0 42