qemu搭建和運行起來一個linux內核環境

来源:https://www.cnblogs.com/weitao-miao/archive/2023/01/07/17033624.html
-Advertisement-
Play Games

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  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 指針是學習C\C++的一個重難點,同時也是這個語言的關鍵知識點。如果不能夠對指針有著深刻的理解,會對學習C\C++有著極大的阻礙。 普通變數和指針變數的區別 普通變數和指針變數都同為變數。對於一個變數來說,都具有值和地址兩個屬性。假設一個普通變數a = 5,其值為5,&a為變數a在記憶體占有的地址。此 ...
  • 1. 什麼是迭代器? 迭代器是一個表示數據流的對象,當我們調用next()方法時會返回容器中的下一個值 迭代器中包含__iter__和__next__()方法。通過__iter__方法可以返回迭代器對象本身的方法。__next__()方法會使cur指針始終指向當前位置,即返回容器中的下一個值,如果容 ...
  • 2023-01-06 一、過濾器鏈 1、含義:如果出現一個請求存在多個過濾器對其過濾,出現過濾器鏈。 在放行前,過濾器是正序執行,放行後過濾器是倒序執行。 2、過濾器的順序:是與filter-mapping配置上下文位置有關 二、監聽器 1、作用範圍: (1)監聽域對象的創建和銷毀 域對象: ①Se ...
  • 很多兄弟在聊天上沒有下太多的功夫,導致自己聊天的時候很容易尬住,然後就不知道聊啥了,這時候合適表情包分分鐘就能救場,但是一看自己收藏的表情包,好家伙,兩隻手都數得過來。 所以今天來給兄弟們分享一下爬取表情包的代碼,再也不用尬聊了! 給大家看看我朋友的尬聊場面 本次目標 網站:發表情 網不好 ,沒載入 ...
  • 2023-01-06 一、過濾器的匹配規則 主要研究的就是“filter-mapping”中“url-pattern”的值的編寫方式的個數。 (1)在創建的模塊中的src文件夾下的Servlet文件夾下創建“AServlet”、“BServlet”,去掉註解。之後設置訪問路徑。 <servlet-m ...
  • 在信息學競賽中,輸入數據規模可能會很大,這時候就需要註意文件讀取的效率。本文在 Linux 環境下測試了 C++ 幾種常見讀入方式的效率。 1. 系統環境 Arch Linux x86_64 預設 Linux 內核,版本 6.1.3 gcc 12.2.0 ext4 2. 測試代碼 編譯命令(省略文件 ...
  • 背景: 介紹: 在一些學習系統,或者考試系統中。一旦出現長時間未操作,就會判定這個人不在場。所以就會進行退出系統,處於對安全和系統負擔還有業務的需求。 簡單講:這個功能,就像你打游戲的時候長時間不操作,就會有請你認真對待游戲的彈框,讓你認真對待游戲的意思。 動圖演示: 正常演示 關閉一個警告,即關閉 ...
  • -- 痞子衡維護的 NXP-MCUBootUtility 工具距離上一個大版本(v3.5.0)發佈過去 9 個月了,這一次痞子衡為大家帶來了版本升級 v4.0.0,這個版本主要有兩個重要更新需要跟大家特別說明一下。 一、v4.0更新記錄 二、幾個不可忽視的更新 2.1 更多MCU型號支持 v4.0 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...