Linux內核入門(一):交叉編譯Linux內核並使用QEMU仿真硬件運行Linux系統

轉載說明

這篇文章借鑑了來自Linux博客教程的相關內容,因此文章類型設置爲轉載

原因與目的

最近需要對Linux進行修改和測試,因此需要搭建內核的編譯和測試平臺。
我的方案是:

  • Ubuntu16.04系統下對Linux源碼進行修改
  • 使用相關交叉編譯工具鏈如gcc-arm-linux-gnueabi編譯系統源碼
  • 使用QEMU軟件仿真出硬件平臺,測試對象系統的系統行爲

由於我是剛剛正式接觸Linux內核,如果文中出現錯誤還請批評指正。

準備相關工具

選擇的操作系統是Ubuntu16.04,爲了軟件安裝的速度選擇了華爲的開源鏡像,更改開源鏡像之後需要更新軟件源索引:

// 更新軟件源索引
$ sudo apt update

然後安裝交叉編譯工具(因爲當前你的系統平臺一般是X86,而模擬運行的平臺是ARM,兩者的體系結構不一樣,因此在X86環境下需要使用交叉編譯工具來講代碼編譯成可以在ARM平臺下運行的可執行文件)。

// 安裝交叉編譯工具
$ sudo apt install c-compiler-arm-linux-gnueabi // C語言交叉編譯工具鏈
$ sudo apt install c++-compiler-arm-linux-gnueabi // 可選,C++語言交叉編譯工具鏈

接着,安裝用於模擬ARM硬件平臺的軟件QEMU

// 安裝QEMU軟件
sudo apt install qemu

根據QEMU軟件在官網的說明,我們可以在安裝完畢之後鍵入qemu-system-然後按下Tab來查看QEMU軟件支持的目標仿真平臺,由於我們想要仿真ARM硬件平臺,因此我們可以在出現的選項中找到qemu-system-arm這個命令。接着,我們還可以執行qemu-system-arm -M help來查看QEMU支持仿真的ARM芯片列表。

需要注意的是,使用Ubuntu官方倉庫安裝的QEMU軟件版本較老不支持很多新的功能,需要使用新功能的話可以根據GithubQEMU項目的官方教程下載最新版本的源碼進行編譯安裝。

編譯Linux內核源碼

首先,我們需要從Linux內核官網上下載Linux內核源碼(版本根據個人喜好,我選擇了5.1.2版本源碼進行編譯)。
建議使用專業下載工具下載壓縮包再拷貝至Ubuntu系統中(使用wget下載壓縮包的速度實在是太慢了)。
新建一個目錄Kernel並修改該目錄的執行權限。

// 新建文件夾並設置權限
$ mkdir Kernel
$ chmod 777 Kernel

接着,將下載的壓縮包的所有內容(解壓後文件夾內的內容)解壓到Kernel目錄下,並進入Kernel目錄下,此時該目錄是Linux內核源碼的根目錄。
然後,使用以下命令編譯Linux內核源碼。

// 指定交叉編譯工具鏈,指定芯片框架爲ARM,由此生成ARM芯片的配置文件
$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
// 指定交叉編譯工具鏈,指定芯片框架爲ARM,編譯Linux源碼
$ make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

編譯完成後,生成的內核鏡像是arch/arm/boot/zImage
此時我們就可以使用以下命令來測試內核鏡像是否可以運行。

// 在根目錄下執行以下命令
qemu-system-arm -M vexpress-a9 \
                -m 512M \
                -kernel path/arch/arm/boot/zImage \
                -dtb path/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
                -nographic

上述命令中:

  • -M:指定硬件芯片框架
  • -m:指定運行內存大小
  • -kernel:指定運行的內核鏡像
  • -dtb:(不確定)指定具體芯片的配置信息
  • -nographic:指定不適用圖形界面

內核啓動之後,如果最後一行顯示end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0),說明內核可以正常啓動,只是暫時缺少根文件系統。

製作根文件目錄

(後續更新)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章