Linux 核心支援很多種cpu架構,架構相關的程式碼放在核心 arch 子目錄中,如下圖:
以上眾多架構中有一個 um 架構,全名叫user mode,它不是一種實體的cpu架構,這個架構的linux核心可以像 helloworld程式一樣執行,運行於linux之上使用者空間中,取名User Mode Linux,簡寫UM
AMD 和 英特爾 的電腦上都可以執行UM linux 核心:
使用前準備:下載解壓linux核心原始碼本文使用 linux-5.4.24,其他版本的使用方法可能有細微區別
模組" class="reference-link">配置編譯核心和模組cd linux-5.4.24make ARCH=um x86_64_defconfigmake ARCH=um linux -j6make ARCH=um modules -j6
編譯完成,生成 linux 檔案,這個就是要執行的核心程式
試執行./linux
核心已經執行,下面會出錯,是因為沒有根檔案系統
下載根檔案系統
下載連結:https://pan.baidu.com/s/1lhIXpeyN-zRCAej-zOahLg 提取碼:l34s下載解壓,得到 root_fs,把root_fs放到linux-5.4.24 目錄中
執行User Mode Linux./linux
可以正常啟動 ubuntu 18.04 LTS 系統
Minicom 連線 User Mode Linux開啟 minicom 配置:
sudo minicom -s詳細配置如下圖
輸入使用者名稱密碼:root/root,登入系統使用
檢視 uml 系統資訊:
Uml 核心版本是 5.4.24,就是剛剛編譯的核心版本Cpuinfo 資訊顯示:vendor_id 是 User Mode LinuxUml 根目錄大小1.5G,和 root_fs 檔案大小一樣Uml 記憶體一共26MB,很小Host 主機核心版本5.3.0,是電腦的版本:
UML 系統中執行使用者程式隨便寫個程式,先在主機編譯執行成功。比如app_x86_64 執行
uml 系統關機:因為 uml linux 當作使用者程式執行的,所以直接給程序發訊號終止就可以
複製程式到 root_fs 硬碟:
sudo mount -o loop root_fs /mntsudo cp ../../project_mys_y6ulx/application/app_x86_64 /mntls /mntsudo umount /mntuml 重新開機,minicom 登入,檢視並執行根目錄中的app_x86_64,可以成功執行,並輸出ROBE=9.,和電腦主機執行的結果一樣
筆者已經把 uml 的 linux 程式也複製到 uml linux 跟檔案系統中了,執行 ./linux 也可以。
也就是在 linux 電腦上運行了一個 uml linux 系統,uml linux 系統中又運行了一個 uml linux 系統,這個系統沒有root_fs 檔案,最後報錯,panic 退出了,又回到上面<試執行>小標題中那個問題了
UML 可以在電腦上測試 linux 核心程式碼中於架構無關的部分,也是一種方法