感謝Scott 大大糾正,選錯平台,這篇使用了ARMv4指令集的測試平台。請大家忽略,正確的版本將會之後更新!
理論上不應該要邊移動邊開火,延長戰線。不過計劃趕不上變化,既來之則安之。
最近因為特別因素開始學習Linux kernel,看能不能Linux kernel和STM32兩邊都不要漏掉。不管怎樣,學習和實習絕對分不開,所以還是從環境架設開始吧。這次的實習環境架設的目標是:
- 可以使用ARM 平台。一方面追求流行,一方面我不想再開x86這個副本
- 可以方便地建立ARM平台的Linux Rootfs和kernel版本
- 可以方便地更改指定要編譯的Kernel版本
- 透過Qemu ,使用2的Rootfs和kernel開機
- 透過Qemu和搭配的工具可以分析Linux kernel的run time 行為
今天只有辦到1, 2和4而已,剩下的還要繼續努力。
目錄
測試環境
因為我已經裝過開發相關的套件,因此如果您是新手可能要自行摸索也許有需要另外安裝的套件如git
。嘛,練習解讀錯誤訊息也是一種學習。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty
安裝Buildroot
主要分成下面三個步驟
下載Buildroot
直接看例子,剪下貼上就好
1 2 3 |
|
設定ARM 環境
網路上查到大部分都是從make menuconfig
開始。不過我是很明確地要用Qemu
跑ARM的系統。所以就找了一下發現有下面的指令
1
|
|
想說既然有x86_defconfig
,那應該有arm_defconfig
吧? 錯!那我就去buildroot/board/qemu
目錄下找,有看到arm-versatile
。印象中以前有用過Qemu跑的Debian系統也是versatile
。所以就很高興地下了
1
|
|
結果一樣GG,估狗查才知道正確的用法是:
1
|
|
更新: 後來看手冊才知道有make list-defconfigs
可以查詢有哪些default config,果然前輩說要RTFM是對的,唉。
接下來就用make menuconfig
做細項調整,我主要是改成
- 使用glibc
- 使用gcc 4.8
- 預設5.x,因為我想要編Linux kernel 4.4.2。以前PC經驗使用gcc 5.x極端痛苦,後來還是換回gcc 4.8
- 一些除錯設定
另外本來想要嘗試設定更動Kernel版本,但是發現需要更進一步的了解buildroot才能夠達成。當作下次目標吧。
編譯及輸出
編譯只要下make
就會幫你下載和編譯開機需要的
- 套件和一些常用工具,並封裝到
output/image/roofs.ext2
- Kernel(預設4.7),編譯成
zImage
,放在output/image/zImage
測試
接下來也不難,可以參考board/qemu/arm-versatile/readme.txt
簡單來說就是執行下面指令,開機完使用root
登入不用密碼,使用poweroff
後再手動離開qemu。
1
|
|
執行畫面如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
參考資料
- The Buildroot user manual
- 只有看部份,不過官方文件本來就是應該放在第一位
- Buildroot and QEMU – the quickest receipe for your own Linux
- 東西弄完才看到的文章,入門好文
下次準備看的資料
- Qemu and the Kernel
- 使用Qemu debug kernel的資料
- Stackoverflow: Can virtfs/9p be used as root file system?
- Qemu和Host主機共享資料,甚至直接把rootfs放host讓qemu去讀取的方式