基于XIP技術的ARM Linux系統的研究與移植
3.3 Bootloader 的修改
Bootloader 分為兩個階段,第1 階段采用匯編語言實現。第2 階段采用C 語言實現。除了進行普通Bootloader 所需的片級和板級初始化之外,針對內核XIP 執行方式所做的主要工作有以下2 個:
1:通過查看體系Makefile 得到XIP 方式的DATAADDR 和TEXTADDR。
2:建立初始頁表時,為.data 和.bss 段建立好3MB 連續空間以存放xipImage。
4 基于XIP 的ARM Linux 內核移植
本文采用的標準 Linux 內核2.6.12 版本不支持在XSBASE255 上直接運行,需要根據開發板硬件體系結構進行相關移植和訂制裁減工作。
4.1 內核鏈接腳本
生成內核映像的鏈接腳本是在 arch/arm/kernel/vmlinux.lds 中,而vmlinux.lds 是由同目錄下的vmlinux.lds.S 生成,查看腳本內容,可以獲知內核映像各節的虛擬地址取決于內核符號TEXTADDR和DATAADDR,以及各節的大小。對于xipImage,其.init,.text 和__ext_table都是在NOR Flash 上,只有.data 節.bss 節在主存上,因而根據配置過程中設置的CONFIG_XIP_PHYS_ADDR 值,設置TEXTADDR 為0xbf000000,而DATAADDR 則設置為0xC0008000,在內核的CPU 片級初始化過程中的頁表建立過程中,TEXTADDR 指向NORFlash,而DATAADDR 指向主存SDRAM 中,把.init 段鏈接到.data 段之前,拷貝到SDRAM中,執行完畢后,回收這部分主存,而內核的.text 段以Kernel XIP 方式運行[4][5]。
4.2 移植源代碼
下面闡述在 XSBase255 開發板上以XIP 運行內核的移植過程[6]。
4.2.1 添加機器平臺支持、目錄框架及內核配置的支持
4.2.2 源代碼文件移植,為實現XIP,在arch/arm/mach-pxa/Makefile.boot 中定義內核映像text節的物理地址,即ZRELADDR 的地址值 zreladdr-y := 0xa0008000
4.2.3 閃存分區的移植
本文采用的是 NOR Flash,根據開發板上閃存的起始地址和大小劃分為Bootloader,Kernel , Rootfs 等四個不同部分。其初始地址和大小分別分Persistant storage 0x01000000-0x02000000, Initial ramdisk image 0x00300000-0x01000000,Kernel Image0x00020000-0x00300000 ,Bootloader 0x00000000-0x00020000
4.3 配置內核
根據開發板移植好特定代碼后,本節對內核進行配置,主要通過make menuconfig 命令啟動的圖形交互界面進行。
4.3.1 指定內核CPU 體系和交叉編譯器及選擇系統類型
4.3.2 啟動XIP 支持
在菜單 Boot options 中,選中Kernel Execute-In-Place from rom,并設置好XIP 內核的物理位置0x00380000。
4.3.3 設置啟動參數
同樣在 Boot options 中,設置啟動參數,如圖2 所示。
4.3.4 選擇串口驅動和控制臺驅動
4.3.5 啟動MTD 和NOR Flash 分區至此內核配置完畢,使用 make xipImage,獲得XIP 內核映像。
5 文件系統的制作
為了支持 XIP,需要選擇Linear CRAMFS 作為根文件系統。系統使用過程中的其他需要,可以采用其他類型的文件系統,如系統的臨時文件可以采用RAMFS/TMPFS,系統中可修改的配置數據可以采用JFFS2 文件系統掛載。最終定制的文件系統類型如表1 所示:
本文采用嵌入式系統常用的 Busybox 方法制作根文件系統映像[7]。先編譯生成系統應用程序,再建立完整的頂層目錄和必要的其他文件。然后使用的Linux2.6 自帶的mkfs.cramfs工具制作rootfs_cramfs.img 映像。至此根文件系統制作完畢。
評論