首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

打造 S3C2410 開發板 NetBSD 3.0 啟動鏡像完整實錄

     編輯:關於VC++

前言

近期抽空在 ARM9 架構的 S3C2410A 上跑通了 NetBSD 3.0,參考網上資料(特別是一個韓文網站),將完整過程詳細記錄,供同好參考。整個過程相當簡單,歸功於 NetBSD 完整的作業系統架構與優秀的建構框架。

環境準備

  • Host 建構環境:NetBSD、FreeBSD、Linux 均可,方法相同。
  • 目標執行環境:S3C2410 晶片開發板(實測兩塊板卡,不保證所有板卡免修改即可運行)。

步驟一:下載並解壓原始碼

從 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。

步驟四:製作 ramdisk(偷懶版)

標準做法繁瑣,此處採用現成二進制包:

# 從 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 檢查)。

步驟五:將 ramdisk 嵌入核心並產出二進制鏡像

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 下載至開發板測試。

關鍵細節補充

1. ramdisk 大小與核心預留空間

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。

2. ~/sets 目錄製作技巧

Host (i386) 無法執行 ARM ldd 分析動態庫依賴。筆者採用笨辦法:先把需要的指令打包成 image 啟動,再在 ARM 板上用 ldd 逐一找庫。因指令不多,可接受。

3. /etc 設定檔調整

根據需求修改 ~/sets/etc 下設定檔。

NetBSD 做嵌入式開發的優勢與劣勢

優勢

  1. 交叉編譯環境極易建構:不只 NetBSD,Linux、FreeBSD 下同樣輕鬆(Linux 自建交叉環境對新手極難)。
  2. 鏡像製作輕鬆:核心與 ramdisk 整合在一起(也可分開放置 Flash 不同區塊),只需照顧 Bootloader。
  3. 支援架構/平台眾多:利於移植。
  4. 各架構自帶 Bootloader(sys/arch/xxx/stand),代碼精簡(3-5 檔案),適合研究。
  5. 核心獨立於 Bootloader:無需接收參數,Bootloader 僅需將核心複製到預期位址並 jmp 執行(Linux 初始條件受 Bootloader 影響)。

劣勢

  1. 無 NAND Flash 檔案系統(如 YAFFS)。
  2. 部份驅動/設施不如 Linux 豐富(如 LCD FrameBuffer)。
  3. 無即時性(Linux 提供軟即時,NetBSD 目前無)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved