内核启动流程分析

一、内核打补丁、编译、烧写、试验

1、解压缩
linux@ubuntu:~/linux$ tar -xjf linux-2.6.22.6.tar.bz2
2、打补丁
linux@ubuntu:~/linux/linux-2.6.22.6$ patch -p1 < ../linux-2.6.22.6_jz2440_v2v3.patch                                                                                                                            
3、配置(三种方法)
  1. make menuconfig
  2. 使用默认配置,在这基础上面修改
  3. 使用厂家提供的配置文件

第二种方法详细讲解:

arch/arm/configs目录下找到相似的配置文件xxx_defconfig,执行make xxx_defconfig(结果保存在.config),再次执行menuconfig(读取.config)。

linux@ubuntu:~/linux/linux-2.6.22.6$ make s3c2410_defconfig

第三种方法详细讲解:

厂家提供一个config_name(厂家名),之后拷贝cp config_name .config,再次执行menuconfig(读取.config),目前,我们使用的是厂家提供的

linux@ubuntu:~/linux/linux-2.6.22.6$ cp config_ok .config
4、编译
make uImage
uImage = 头部 + zImage

二、内核功能、结构,结合Makefile、Kconfig进行分析

1、配置(.config)

配置的结果生成.config文件。

vim .config

以一个配置想为例(CONFIG_DM9000
在这里插入图片描述

linux@ubuntu:~/linux/linux-2.6.22.6$ grep "CONFIG_DM9000" * -rwR

搜索结果如下:
在这里插入图片描述
发现CONFIG_DM9000存在于一下文件下

  1. C源码:CONFIG_DM9000(宏定义)
  2. 子目录Makefiledrivers/net/Makefile
  3. include/config/auto.conf
  4. include/linux/autoconf.h

其中,当.config文件下的CONFIG_DM9000配置为Y或者M时,当执行make uImage会自动生成头文件,为include/config/auto.confinclude/linux/autoconf.h,这时候,C语言的源码中这些宏被定义,就会执行相应的代码。

include/config/auto.conf 的内容:

在这里插入图片描述
include/linux/autoconf.h内容:
在这里插入图片描述

内核子目录Makefile的讲解

obj - (y) +=xxx.o //将xxx.c编译为xxx.o并被链接到内核
obj - (m)  +=yyy.o //将把yyy.c编译成模块 yyy.ko.

子目录中ymauto.conf决定,而auto.conf.config决定

include/config/auto.conf顶层Makefile包含

小结:
执行make uImage之后,①.config自动创建生成autoconf.h,用于源代码的使用;②.config自动创建生成auto.conf,用于被顶层Makefile包含。

2、分析Makefile

根据Makefile可以找到第一个文件,也可以找链接脚本,可以了解到内核在内存中是如何分布的。

①子目录下的Makefile比较简单

obj - (y) +=xxx.o //将xxx.c编译为xxx.o并被链接到内核
obj - (m)  +=yyy.o //将把yyy.c编译成模块 yyy.ko.

将多个.c文件链接成以个.ko模块方法(根据Makefile.txt介绍)

obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

在这里插入图片描述
make uImage 位于arch/arm/Makefile,猜测这个Makefile肯定被包含在顶层Makefile
在这里插入图片描述
arch/arm/Makefile中uImage依赖于vmlinux(顶层)

第一个文件:arch/arm/kernel/head.s
链接脚本:arch/arm/kernel/vmlinux.lds

三、内核启动过程分析

内核的作用:
①处理uboot传入的参数 arch/arm/kernel/head.S

  1. 判断是否支持这个处理器
    #define MACHINE_START(_type,_name)
    static const struct machine_desc _mach_desc##_type
    _used
    attribute((section(".arch.info.init"))) = { \ //结构体强制设置属性,设置为“.arch.info.init”段
    .nr = MACH_TYPE
    ##_type, \ //所有含有“.arch.info.init”的会被链接文件强制放到一块
    .name = _name,

    #define MACHINE_END
    };

  2. 判断是否支持这个单板(uboot启动内核时传输的机器ID)
    #define MACHINE_START(_type,_name)
    static const struct machine_desc _mach_desc##_type
    _used
    attribute((section(".arch.info.init"))) = { \ //结构体强制设置属性,设置为“.arch.info.init”段
    .nr = MACH_TYPE
    ##_type, \ //所有含有“.arch.info.init”的会被链接文件强制放到一块
    .name = _name,

    #define MACHINE_END
    };

  3. 创建页表

  4. 使能MMU

  5. 跳转start_kernel(内核第一个C函数)
    在这里插入图片描述

最终目的运行应用程序(挂接根文件系统)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值