轉載說明
這篇文章借鑑了來自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
軟件版本較老不支持很多新的功能,需要使用新功能的話可以根據Github
上QEMU
項目的官方教程下載最新版本的源碼進行編譯安裝。
編譯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)
,說明內核可以正常啓動,只是暫時缺少根文件系統。
製作根文件目錄
(後續更新)