基於XIP技術的ARM Linux系統的研究與移植
2015/07/16 12:02
瀏覽1,580
迴響0
推薦0
引用0
dzsc.com文章出處:微計算機信息 發布時間: 2009/07/24 | 1514 次閱讀 | 0次推薦 | 0條留言
Samtec連接器 完整的信號來源 開關,電源限時折扣最低45折 每天新產品 時刻新體驗 ARM Cortex-M3內核微控制器 TE Connectivity限時八折優惠酬賓 來自全球領先品牌的最新產品目錄 最新電子元器件資料免費下載 完整的15A開關模式電源 首款面向小型化定向照明應用代替
摘要:為了滿足嵌入式系統快速啟動、低能高效和節省成本的要求,本文將就地執行(eXecute In Place)技術引進Linux 2.6.12內核。通過分析ARM Linux的啟動過程,獲得不同內核映像的相互關系和啟動過程中的KFT函數調用圖,完成基於XIP的Linux 2.6.12內核在XSBase255上的移植,制作合適的根文件系統類型,最後完成系統啟動時間及內存使用測試。
1 研究背景
ARM 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
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,為下面的工作提供很好的指引和幫助。
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 文件系統掛載。
本文采用嵌入式系統常用的 Busybox 方法制作根文件系統映像[7]。先編譯生成系統應用程序,再建立完整的頂層目錄和必要的其他文件。然後使用的Linux2.6 自帶的mkfs.cramfs工具制作rootfs_cramfs.img 映像。至此根文件系統制作完畢。
6 系統與性能測試
6.1 系統啟動
完成整個系統的制作並逐步調整後,使用 Jflash 燒寫Bootloader,然後利用Bootloader的tftp 工具,從宿主機下載內核映像和根文件系統映像並燒寫到閃存上,最後啟動開發板,引導系統。從串口輸出系統中的啟動信息可以看出,系統依次進行CPU 片級初始化、板級初始化和一些子系統初始化、並加載根文件系統,進入Busybox 的Shell 命令行,說明系統啟動成功。
6.2 系統啟動時間測試
本文采用開發板上 OSCR 寄存器測量內核映像解壓所節省的時間,使用內核全局變量jiffies 測量啟動過程各個部分的時間
Bootloader 啟動時間與內核映像無關,當Bootloader 引導非壓縮的Image 時,把內核映像拷貝到主存RAM 中需要耗費拷貝的時間。對於zImage,解壓縮過程需要耗費545ms,而xipImage 則不需要。在xipImage 執行過程中,需要額外拷貝內核映像中可讀寫的數據段部分,因而內核啟動時間要比zImage 要略長一下,但綜合整體時間,使用Kernel XIP 執行方式的系統能有效的縮短系統啟動時間。
6.3 系統內存使用測試
本文利用 RAMUST 和free 工具,
采用 Kernel XIP 的xipImage 內核映像通過增加對Flash 的使用需求,可以顯著減少主存SDRAM 的使用量,Flash 上的內核代碼的執行,不需要持續間斷的動態刷新,從而降低了系統的整體功耗和成本。
總結:本文在通用Linux 2.6.12 內核基礎上,以深圳億道公司的XSBase255 開發板為硬件平臺,研究並實現了以Kernel XIP 方式運行的ARM Linux 系統的移植,通過系統與性能測試,取得了較為理想的效果。
Samtec連接器 完整的信號來源 開關,電源限時折扣最低45折 每天新產品 時刻新體驗 ARM Cortex-M3內核微控制器 TE Connectivity限時八折優惠酬賓 來自全球領先品牌的最新產品目錄 最新電子元器件資料免費下載 完整的15A開關模式電源 首款面向小型化定向照明應用代替
摘要:為了滿足嵌入式系統快速啟動、低能高效和節省成本的要求,本文將就地執行(eXecute In Place)技術引進Linux 2.6.12內核。通過分析ARM Linux的啟動過程,獲得不同內核映像的相互關系和啟動過程中的KFT函數調用圖,完成基於XIP的Linux 2.6.12內核在XSBase255上的移植,制作合適的根文件系統類型,最後完成系統啟動時間及內存使用測試。
1 研究背景
ARM 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
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,為下面的工作提供很好的指引和幫助。
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 文件系統掛載。
本文采用嵌入式系統常用的 Busybox 方法制作根文件系統映像[7]。先編譯生成系統應用程序,再建立完整的頂層目錄和必要的其他文件。然後使用的Linux2.6 自帶的mkfs.cramfs工具制作rootfs_cramfs.img 映像。至此根文件系統制作完畢。
6 系統與性能測試
6.1 系統啟動
完成整個系統的制作並逐步調整後,使用 Jflash 燒寫Bootloader,然後利用Bootloader的tftp 工具,從宿主機下載內核映像和根文件系統映像並燒寫到閃存上,最後啟動開發板,引導系統。從串口輸出系統中的啟動信息可以看出,系統依次進行CPU 片級初始化、板級初始化和一些子系統初始化、並加載根文件系統,進入Busybox 的Shell 命令行,說明系統啟動成功。
6.2 系統啟動時間測試
本文采用開發板上 OSCR 寄存器測量內核映像解壓所節省的時間,使用內核全局變量jiffies 測量啟動過程各個部分的時間
Bootloader 啟動時間與內核映像無關,當Bootloader 引導非壓縮的Image 時,把內核映像拷貝到主存RAM 中需要耗費拷貝的時間。對於zImage,解壓縮過程需要耗費545ms,而xipImage 則不需要。在xipImage 執行過程中,需要額外拷貝內核映像中可讀寫的數據段部分,因而內核啟動時間要比zImage 要略長一下,但綜合整體時間,使用Kernel XIP 執行方式的系統能有效的縮短系統啟動時間。
6.3 系統內存使用測試
本文利用 RAMUST 和free 工具,
采用 Kernel XIP 的xipImage 內核映像通過增加對Flash 的使用需求,可以顯著減少主存SDRAM 的使用量,Flash 上的內核代碼的執行,不需要持續間斷的動態刷新,從而降低了系統的整體功耗和成本。
總結:本文在通用Linux 2.6.12 內核基礎上,以深圳億道公司的XSBase255 開發板為硬件平臺,研究並實現了以Kernel XIP 方式運行的ARM Linux 系統的移植,通過系統與性能測試,取得了較為理想的效果。
你可能會有興趣的文章:
限會員,要發表迴響,請先登入