近期抽空在 ARM9 架構的 S3C2410A 上跑通了 NetBSD 3.0,參考網上資料(特別是一個韓文網站),將完整過程詳細記錄,供同好參考。整個過程相當簡單,歸功於 NetBSD 完整的作業系統架構與優秀的建構框架。
從 ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/source/sets/ 下載四個包:
% foreach file (*.tgz)
? tar -xzf $file -C /
? end
解壓至 /usr/src:
src.tgz:/usr/bin, /usr/sbin, /bin, /sbin 工具、/lib /libexec 函式庫原始碼syssrc.tgz:NetBSD 核心原始碼gnusrc.tgz:GNU 軟體原始碼(gcc、gdb、binutils 等)share.tgz:Makefile 所需編譯控制檔(/usr/share/mk 也有一份)cd /usr/src
mkdir ../obj
./build.sh -m evbarm tools
-m evbarm 指定 ARM 目標平台。完成後在 /usr/src 下產生 tooldir.xxx 目錄(如 tooldir.FreeBSD-6.1-RELEASE-i386 或 tooldir.Linux-2.6.16-unknow-i386)。預設產出 GCC 4.1.2,若需 3.3.3,在 /etc/mk.conf 加入 HAVE_GCC=3。
將工具目錄加入 PATH(如 set path = ($path /usr/src/tooldir.FreeBSD-6.1-RELEASE-i386/bin)),tcsh 下記得 rehash。此時完整交叉編譯環境已就緒。
補充:此編譯器可直接交叉編譯 Linux 核心(gmake ARCH=arm CROSS_COMPILE=arm--netbsdelf-),亦可編譯 GNU 軟體(需用 gmake)。nbmake-evbarm 為包裝腳本,位於 /usr/src/tooldir.xxx/bin。
NetBSD 已移植三星 S3C2410 的 SMDK2410 開發板代碼,過程簡單:
cd /usr/src
vi sys/arch/evbarm/conf/SMDK2410 # 僅開啟除錯選項,保留 options COMPAT_30
./build.sh -m evbarm -u kernel=SMDK2410_INSTALL # 注意 _INSTALL 後綴
編譯完成的核心位於 /usr/obj/sys/arch/evbarm/compile/SMDK2410_INSTALL/netbsd。
標準做法繁瑣,此處採用現成二進制包:
# 從 ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/evbarm/binary/sets/ 下載 base.tgz、etc.tgz(需編譯工具再加 comp.tgz)
cd ~
tar -zxf *.tgz -C ~/sets # 解壓至 ~/sets
# 在 ~/sets 刪除不需要檔案(保留 vi、gcc、基本標頭檔等,參考附件列表)
cd ~
nbmakefs -s 3m -t ffs image ~/sets # 從 sets 產生 3MB FFS 映像檔 image
須確保 sets 目錄總大小 ≤ 3MB(用 du 檢查)。
cd ~
cp /usr/src/sys/arch/evbarm/compile/SMDK2410_INSTALL/netbsd . # 複製核心到家目錄
arm--netbsdelf-mdsetimage -sv netbsd image # 將 image 嵌入核心
arm--netbsdelf-objcopy -S -O binary netbsd netbsd.bin # 去除符號,產生可直接執行的二進制鏡像
完成!將 netbsd.bin 下載至開發板測試。
conf/INSTALL 中 MEMORY_DISK_ROOT_SIZE=6150(512 bytes/block),換算:6150*512/1024 = 3075KB ≈ 3MB。核心預留空間必須 ≥ ramdisk 大小。若預留較大,mdsetimage 可用 -s 參數修正核心中常數。未精簡核心約 5.8MB(核心 2.8MB + ramdisk 3MB),gzip -9 壓縮後 2.2MB。最精簡核心可至 500KB。
Host (i386) 無法執行 ARM ldd 分析動態庫依賴。筆者採用笨辦法:先把需要的指令打包成 image 啟動,再在 ARM 板上用 ldd 逐一找庫。因指令不多,可接受。
根據需求修改 ~/sets/etc 下設定檔。
sys/arch/xxx/stand),代碼精簡(3-5 檔案),適合研究。jmp 執行(Linux 初始條件受 Bootloader 影響)。