理論上不應該要邊移動邊開火,延長戰線。不過計劃趕不上變化,既來之則安之。
最近因為特別因素開始學習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
|
|
Scott 大大指出可以使用qemu_arm_vexpress
,原因是這個平台模擬的CPU是 Cortex-A9
(ARMv7-A)的平台。之前我是用的模擬平台使用的CPU是ARM926EJ-S
(ARMv5TE),它的instruction 架構和現在差距太多,所以就轉換到這邊了。
接下來就用make menuconfig
做細項調整,因為是拿來做分析系統行為,所以調整的重點是增加系統的可觀察度、除錯工具、開發軟體套件等。
開啟或新增下面設定如下:
- Build options
- build packages with debugging symbol
- gcc debug level
- debug level 3
- strip command for binaries on target
- none
- gcc optimization level
- optimize for debugging
- Toolchain
- C library
- glibc
- glibc version
- 2.24
- GCC compiler Version
- 4.8.x
- Build cross gdb for the host
- TUI support
- Python support
- Simulator support
- C library
- Target packages
- Debugging, profiling and benchmark
- gdb
- gdbserver
- full debugger
- TUI support
- ltrace
- strace
- valgrind 和所有相關的東西
- gdb
- Development tools
- binutils
- git
- gperf
- libtool
- make
- pkgconf
- subversion
- tree
- Debugging, profiling and benchmark
自行編譯 Kernel 部份下一篇會再說明。
編譯及輸出
編譯只要下make
就會幫你下載和編譯開機需要的
- 套件和一些常用工具,並封裝到
output/image/roofs.ext2
- Kernel(預設4.7),編譯成
zImage
,放在output/image/zImage
測試
接下來也不難,可以參考board/qemu/arm-vexpress/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去讀取的方式