嵌入式Linux开发——(十四)移植Linux内核

  • 基于Linux2.6.22.6

1、相关常识

    ①VERSION = 2   PATCHLEVEL=6

       主版本号,稳定版本用偶数来表示,每隔2~~3年出现一个稳定版

    ②SUBLEVEL=22

       次版本号,每隔1~~2个月一更新

    ③EXTRAVERSION = .6

      扩展版本号

   ④获取内核网址:http://www.kernel.org/

   ⑤打补丁:

    tar xjf linux-2.6.22.6.tar.bz2

    tar xjf patch-2.6.22.6.bz.2

    cd linux-2.6.22

    patch -p1  < ../patch-2.6.22.6

2、内核源码结构及Makefile分析

    1)内核子目录结构

嵌入式Linux开发——(十四)移植Linux内核_第1张图片

嵌入式Linux开发——(十四)移植Linux内核_第2张图片

     2)Makefile分析

 

 

        ①Makefile决定了文件文件编译的顺序、连接规则

       ②Linux内核中Makefile文件分类:

嵌入式Linux开发——(十四)移植Linux内核_第3张图片

       ③内核文档Documenttation/kbuild/mahefiles.txt对Makefile用法进行讲解

       ④obj-y、obj-m、lib-y分别用来定义哪些文件被编译进内核、编译成加载模块(驱动)、编译成库文件

       ⑤选项:

          A、全局选项(适用于整个内核代码树)

                CFLAGS:编译C文件的选项

                AFLAGS:编译成汇编文件的选项

                LDFLAGS:连接文件选项

                ARFLAGS:制作库文件选项

        B、局部选项(仅适用于某个Makefile中的所有文件)

               EXTRA_CFLAGS

               EXTRA_AFLAGS

               EXTRA_LDFLAGS

               EXTRA_ARFLAGS

       C、个体文件选项(仅适用于某个文件)

               CFLAGS_$@     EXTRA_AFLAGS

    ⑥ $(patsubst  pattern,  replacement,  text)

        patsubst为字符串处理函数

        用法:在text中寻找pattern,并用replacement替代patsubst

   eg:

        $(patsubst %/, %/build-in.o, init/)

           -----> init/build-in.o

    3)内核的Kconfig分析(用于配置内核)

        ①Kconfig文件的基本要素:config条目

        ②menu条目

           menu       在menu和endmenu之间有很多config条目

           config  x

           config  y

           config  z

           enfmenu

      ③choice条目

      ④comment条目:用于定义一些帮助信息

      ⑤source条目:用于读入另一个Kconfig文件

    4)Linux内核配置选项

        1、配置界面主菜单类别

嵌入式Linux开发——(十四)移植Linux内核_第4张图片

嵌入式Linux开发——(十四)移植Linux内核_第5张图片

     2、“System Type”菜单:系统类别

     3、“Device Drivers”菜单:设备驱动程序

3、Linux内核移植

    1)Linux的启动过程可以分为两部分:架构/开发板相关的引导过程、后续的通用启动过程

    A、第一阶段通常使用汇编编写,首先检查内核是否支持当前架构的处理器,然后检查是否支持当前开发板

        ①连接内核时使用虚拟地址,使用要摄者页表,使能MMU

        ②调用C函数start_kernel之前的常规工作,包括复制数据段、清除BSS段

   B、第二阶段的代码主要用C语言编写,它进行内核初始化的全部工作,最后调用rest_init函数启动init过程,创建系统第一个进            程:init进程

你可能感兴趣的:(嵌入式Linux)