基于XIP技術的ARM Linux系統的研究與移植
1 研究背景
本文引用地址:http://www.j9360.com/article/217881.htmARM Linux 嵌入式系統在不同應用領域應用的日趨廣泛,它們存儲容量相對較小、系統的電能消耗及啟動速度要求嚴格。為了滿足它們對啟動速度和低能耗的要求,本文采用內核XIP 方式運行ARM Linux 系統,避免把內核從Nor Flash 拷貝到主存SDRAM 空間,讓內核運行在低功耗的NOR Flash 上,節省系統啟動時間,降低系統對SDRAM 的需要,減少電能消耗,使產品能夠持續使用更長時間。
2 開發工具及相關技術介紹
2.1 硬件平臺
本文選擇深圳億道公司的XSBase255 開發板,其處理器采用的是Intel? XScalePXA255,400MHz,SDRAM 為Samsung 64Mbyte,Flash 為Intel? strata flash 32Mbyte。
2.2 軟件工具
Linux-2.6.12 linux-2.6.13-kgdb-2.3 Cramfs-linear-xip-4-patch busybox-1.10.0 ramust-arm2.3XIP 技術介紹XIP 全稱eXecute-In-Place(就地執行),是一種代碼執行方式,分為Kernel XIP[1]和Application XIP[2]兩種。Kernel XIP 適用于操作系統啟動過程,而Application XIP 主要用于系統啟動后應用程序的執行。
Kernel XIP 原理如下,內核映像在Flash 設備上執行以后,只把映像中要讀寫的.data和.bss 拷貝到SDRAM 主存中,同時設置好系統的MMU,內核運行過程中,代碼段.text 指向Flash 空間,.data 和.bss 指向SDRAM 主存空間。相對于全映射的執行方式,系統節省了解壓縮和拷貝代碼段的時間,節省了代碼段占用的RAM 主存空間。
Application XIP 原理與Kernel XIP 類似,管理NOR Flash 空間的文件系統必須具有線性的一致的地址空間,可執行的應用程序的代碼段在NOR Flash 中線性連續,且地址能夠從文件系統知曉。操作系統執行應用程序時,系統的程序加載器(loader)在建立虛擬進程空間后,只需要把應用程序的數據段和未初始化段等要讀寫的段裝入SDRAM 主存空間,并建立好映射,而對于可執行文件的只讀的代碼段空間則無需裝入,直接映射到NOR Flash 設備上應用程序文件的代碼段,程序執行時直接從NOR Flash 設備上獲取代碼執行。
3 ARM Linux 啟動過程分析
開發板上電啟動后,首先執行Bootloader 程序,Bootloader 進行初步的環境初始化并準備好內核參數。對于本文采用的內核XIP 執行方式,Bootloader 不需要從Flash 設備中解壓拷貝內核映像到SDRAM主存中,運行內核映像后,把需要讀寫操作的數據段拷貝到SDRAM主存的適當位置,并進行片級初始化、板級初始化等內核運行的硬件環境初始化工作,最后是根據內核參數執行內核各個子系統的初始化。
3.1 執行映像生成過程及關系
生成內核映像的一般過程是,使用 make menuconfig 配置內核,再使用make zImage 或make bzImage 生成壓縮的內核映像zImage 或bzImage,這樣生成的是壓縮的內核映像。本文通過配置CONFIG_XIP_KERNEL,使系統生成xipImage,其生成圖如圖2 所示:
3.2 獲得內核啟動過程函數關系調用圖
這里使用 KFT 工具來獲得。KFT 全稱Kernel Function Trace[3],主要功能是跟蹤函數調用事件。KFT 收集調用數據后,把數據保存在/proc/kft_data,在XScale 平臺上配置KFT 時,KFT 需要使用cmpxchg 函數,而原始內核不支持,所以需要修改源代碼,添加__cmpxchg_u3和__cmpxchg 函數的聲明和定義,以及宏cmpxchg 和arch_align_stack(x)。準備工作完成后,下載到開發板上運行并獲取原始跟蹤數據。然后,調用addr2sym 工具對原始跟蹤數據進行格式化,可以獲取函數調用順序圖,再使用kd 工具將獲得的內容格式化為樹狀關系圖,最終獲得內核啟動過程函數關系調用圖kft.tree,為下面的工作提供很好的指引和幫助。
評論