arm学习之linux内核移植分析

ARM 173浏览

  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号,到以下段匹配,如果匹配成功,返回开发板结构体,内核继续执行,如果

不成功,内核不启动

今天就到这里吧!