arm學習之linux核心移植分析
linux核心可從 Kernel.org 上獲得,其中偶數版本為穩定版本。
linux核心程式碼結構:
kernel/ 核心管理的核心程式碼(系統相關程式碼在arch/*/kernel中)
arch/ 體系結構相關程式碼,每個目彔程式碼一個體繫結構
include/ Linux 標頭檔案
include/asm- <arch> 體系結構相關標頭檔案
include/linux Linux kernel core 標頭檔案
lib/ 核心的庫程式碼,和處理器體系結構相關的程式碼在arch/*/lib下
drivers/ 系統中驅勱程式程式碼
fs/ 檔案系統
ipc/ IPC(迚程通訊程式碼)
mm/ 記憶體管理程式碼,和處理器體系結構相關的程式碼在arch/*/mm下
net/ 網路協議程式碼
scripts/ 編譯配置指令碼檔案
sound/ 聲音驅動程式
Documentation/ 核心文件目錄
README 概要和編譯介紹
Makefile 頂層makefile檔案,我們後面的配置要進行修改,也從makefile進行分析
核心配置步驟:
1:cp arch/arm/s5pv210_defconfig .config
2:修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
3:執行配置命令
make menuconfig
然後進入圖形配置介面
4:配置完畢,開始編譯
make zImage
生成的zImage在arch/arm/boot/ 下。這裡說明一下一些核心的格式:
zImage:經過zlib壓縮後的Linux核心
uImage:uboot格式的核心檔案,是uboot預設引導的核心,如果需要引導zImage還需要自己向uboot新增命令
vmlinux:未經壓縮的Linux核心,是elf格式
Image:從vmlinux生成的二進位制格式,核心映像檔案,沒有壓縮
核心啟動分析:
1:核心自解壓(zImage)
2:檢查核心是否支援此CPU的ID號
2:初始化一個硬體,也就是靜態編譯進核心的驅動模組
3:開始掛載根檔案系統
4:啟動init程序
核心的連結指令碼分析:
arch/arm/kernel/vmlinux.lds 可見有:
381 __proc_info_begin = .;
382 *(.proc.info.init)
383 __proc_info_end = .;
384 __arch_info_begin = .;
385 *(.arch.info.init)
386 __arch_info_end = .;
這些段是用來存處理器ID和開發板ID的。從Makefile檔案可知核心最先執行的程式碼是head.S檔案位於 arch/arm/kernel/head.S
81 mrc p15, 0, r9, c0, c0
將儲存在協處理器中CPU的ID號讀到ARM處理器的r9暫存器
82 bl __lookup_processor_type
核心是否支援此CPU的ID號
381 __proc_info_begin = .;
382 *(.proc.info.init)
383 __proc_info_end = .;
用r9中ID號到__proc_info_begin->__proc_info_end中匹配,如果匹配成功,核心繼續執行,如果匹配不成功,核心不
啟動
85 bl __lookup_machine_type
theKernel(0, 2456, 0x20000100)
r0 r1 r2
用uboot通過r1暫存器傳遞來板子的2456號,到以下段匹配,如果匹配成功,返回開發板結構體,核心繼續執行,如果
不成功,核心不啟動
今天就到這裡吧!