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