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