1. 程式人生 > >arm學習之linux核心移植分析

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號,到以下段匹配,如果匹配成功,返回開發板結構體,核心繼續執行,如果

不成功,核心不啟動

今天就到這裡吧!