過了,一天,周又到了,博主終於可以拿出時間來把上一次沒有給大家展示完了的內容今天在這里一並展示給大家,希望和大家共同進步,共同學習,同時我也虔誠的希望各位業界的朋友把自己的工作經驗拿出來大家一起分享,一起交流,一起學習,技術的革新少不了大家努力!!!,好了。廢話不多說,開始今天的內容吧:
第一部分:制作根文件系統
1.其實對於這個根文件系統,博主一直沒有搞明白,何為根文件,想必知道device tree 的朋友並不 陌生,系統本身就是個樹形結構,我們整個系統除了u-boot ,內核,其次就是 根文件,內核跑起來之后,接着就要掛載根文件了,根文件系統里存放着我們的各類參數,系統初始化數據,各種系統工具,庫文件,頭文件。
2.制作根文件要好多的方法,你也可以直接到開發板的廠商官網去看看是否有提供,這樣里面的工具,庫文件,頭文件比較齊全,這樣就不用花費時間去制作,但是這樣有個缺點就是根文件系統過於龐大,臃腫,所以,這就解釋了為什么根文件系統是可以定制的,內核也是可以裁剪的,有些開發板本身自己的內存比較小,如果在加之系統過於龐大,那么這樣是不行
3.制作根文件系統的工具:一般有三個,buildroot,busybox ,yocto ,博主只有用過前兩個,我們今天所展示的就是基於 buildroot 而定制的根文件系統
(1)首先我們需要下載 buildroot 安裝包:
buildroot 下載地址:https://buildroot.org
(2)下載好以后我們拖放在虛擬機中,進行解壓 tar -xvf buildroot-2017.02.5.tar.bz2
(3)解壓完畢,我們打開buildroot-2017.05,里面的 configs 這里面有各種廠商的開發板的配置文件,我們找到我們需要的,這里有很多,要和我們在 第一節 中做使用的相同
(3)找到之后我們點擊鼠標右鍵 復制,並 cd ../ 退回上級目錄,執行 make qenu_vexpress_defconfig 將配置文件寫入 並生成了一個 .cionfig 的配置文件,出現如下圖中的所示,說明寫入成功
(4)接下來我還可以對源碼進行一些詳細的配置 :輸入 make menuconfig ,如果這里出錯,你可以參考 第一節 中的 解決 方法,如果你在第一節中照着我的做了,那么這里是不會報錯的,成功會進入如下的畫面
(5)這里我們需要注意的是 :system configuration----> 這項,按 上下 鍵移到這項,按下 enter 鍵 進入
找到圖中箭頭所指的 選項,選擇激活密碼,並在下面的畫面中輸入密碼,這樣操作就需要我們輸入密碼才能登入根文件系統,博主之前在制作的過程中並沒有選擇,結果在成功加載 了內核之后進入根文件系統時提示要密碼,在嘗試了多次仍然失敗后,博主重新進行了源碼的編譯,並選擇了密碼登錄,才能成功登入系統
(6)選擇完畢,選擇 “exit” 退出主界面上,在選擇圖中的箭頭所指的選項
進入該選項,進行如下的操作:這里我們選擇的根文件系統的格式 ext4,根文件的格式有很多種,以后詳細跟大家解釋
選擇完畢后,我們在該畫面里選擇如下的選項: 這里選項的是我們制作好跟文件后,進行壓縮生成一個根文件的壓縮文件,這樣方便我們進行轉移,可以保持文件的完整性
(7)其他的選項我都保持默認就可以了,我們進行保存
(8)解下來我就要進行編譯工作了,輸入 make -j4,等帶編譯完畢,我們看看我們的勞動成果
箭頭所指的就是我們要的文件了
buildroot 的功能很強大,我們可以用它為我們制定一個屬於自己的 操作系統,上圖中我們可以看到,最終生成了 根文件rootfs.tar,內核鏡像zImage
在host 目錄我usr/bin 目錄還生成叫 arm 的交叉編譯工具鏈,
我們在制作根文件的時候,還可以選擇busybox工具,其實你只要仔細查看了 buildroot 的選項過程,你會發現,buildroot其實是調用了busybox工具
這里我們只是介紹 采用 qemu 來模擬arm 的環境,至於要把我們生成的目標文件下載到嵌入式開發板實物,我們要需要是buildroot生成uboot文件如下:
這樣我們就可以生成 u-boot 引導文件,即可以將 rootfs.ext4, u-boot, zImage 這些文件下載或燒寫到開發板對應的扇區,就組成了我們的操作系統
至於如何燒寫,這里不做講解
第二部分:采用 qemu 生成我們最終的 模擬 環境
(1)通過在第一章中的操作,我們已經有了 u-boot引導文件,kernel的可引導鏡像uImage,和配置好網絡加載相關的環境變量,而在本節中的操作,我們又生成根文件系統的壓縮文件rootfs.tar
(2)我們加目錄下新建一個文件夾 QEMU ,將第一節中生成的文件: u-boot uImage 和本節中生成的rootfs.tar 文件都拷貝到該目錄下,新建一個目錄rootfs ,將rootfs.tar 放進去解壓得到如下的文件
(3)cd ../
退回上級目錄,我們來寫個運行的腳本文件,touch qemu_arm_run.sh ,加上可執行權限 sudo chmod 777 qemu_arm_run.sh, vi qemu_arm_run.sh
加入如下的內容:注意 9 行的目錄一定是你QEMU 文件夾所在目錄,可以進入QEMU目錄 ,輸入pwd 命令來查看 目錄結構
(4)我們現在可以來試試了,sudo ./qemu_arm_run.sh 看到我們已經成功加載就u-boot,博主這里是 ip 地址的問題,所有沒有成功加載內核,我們進入 u-boot 所在的目錄,按照第一章中的相關的方法 修改 include/vexpress_commd.h中的ip 地址,改成我們現在所用的ip,重新編譯u-boot 生成新的u-boot,在拷貝到當前目錄,再次執行腳本命令,就可以成功加載內核了
這里我們可以輸入print 來打印環境變量信息:
我們修改完上面所說的新信息后,在執行運行腳本命令,這是激動的時刻出現了:
看到這一幕,是不是很熟悉呢
其實qemu 模擬arm 環境,還有一種方法,就是根文件也采用dd命令做成鏡像,但這樣我們就不能和主機里面的rootfs 目錄同步,在arm 里面的操作,我們主機並不能接收到,采用 nfs 方式來掛載 根文件,我們模擬出來的arm環境和主機里面rootfs的內容是同步的,只要一個命目錄中的內容改變,另一個目錄里面的也隨之改變,這是不是很方便呢,我們在 x86環境里寫好測試程序,交叉編譯成arm 版本的,就可以直接放到我們模擬出開的arm環境去運行了,並不需要開發板實物
好了,到這,里我們兩節的內容就將完了,歡迎大家借鑒,希望可以盡早的幫助到您!
————————————————
版權聲明:本文為CSDN博主「風清揚的博客」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_24188351/article/details/77921653