linux 配置、内核启动

怎么查看有哪些默认配置

在内核代码里面查找配置

find -name “defconfig” * -nR

可以看到arch/arm/configs下有很多defconfig相关的文件,

在里面找到和我们单板相近的xxx_defconfig
进行make xxx_defconfig

所有的配置项写到了.config文件里去,所有的结果被保存到了.config

然后再make menuconfig

会读取.config,然后出现一个菜单选择配置

如果厂家提供了配置

只要将厂家提供的配置文件config
复制为 .config
然后make menuconfig

menu菜单选择配置文件

在这里插入图片描述

根据配置文件编译内核

make uImage

烧写内核

使用DNW发送编译出的uImage
使用uboot烧写内核,使用k命令,擦除nandflash,将接收到的内核从sdram写入到nandflash。
使用b命令启动内核。
在这里插入图片描述

回到之前的.config

.config里面有什么东西?

有配置项比如CONFIG_DM9000

CONFIG_DM9000在哪里会被用到?

1、C源码 的宏CONFIG_DM9000
2、子目录的Makefile driver/net/makefile
3、include/config/autoconf
4、include/linux/autoconf.h

CONFIG_DM9000如何被使用

1、C语言源码里使用的宏,是在include/linux/autoconf.h被定义的
2、include/linux/autoconf.h的宏是根据.config自动生成的
3、include/config/autoconf是根据.config自动生成的(包含y,m等信息)
4、子目录的Makefile 根据include/config/autoconf来选择这个配置项如何编译
在这里插入图片描述

内核启动流程分析

引导阶段

1、先检查是否支持当前架构
2、检查是否支持当前开发板
3、设置页表、使能MMU
4、复制数据段、清除BSS段、调用start_kernel函数

第二阶段

1、内核初始化
2、设置与体系结构相关的环节
3、调用rest_init
4、创建系统第一个进程:init进程

修改内核来支持S3C2440开发板

首先获得一份内核源码

1、修改顶层makefile

在这里插入图片描述
在这里插入图片描述

2、执行make smdk210_defconfig 得到.config文件
3、使用make menuconfig命令配置
4、make uImage生成内核映像文件

生成的uImage通过uboot烧录后,S3C2410开发板是可以启动的,但是S3C2440就不行了

如何修改内核使之支持S3C2440开发板?

1、head.S分析

arch/arm/kernel/head.S是内核执行的第一个文件
在这里插入图片描述
这一段代码的作用是校验内核是否支持当前CPU以及当前开发板,82行和85行会返回一个地址,指向这个CPU、开发板的结构体。如果返回的是0,那么内核就无法启动。

82行和85行跳转的函数实在arch/arm/kernel/head -common.S中定义

__lookup_processor_type函数根据前面独处的CPU ID,从proc_info_list结构中找出匹配。

proc_info_list结构(结构体原型(typedef)在include/asm-arm/procinfo.h中定义,结构体源码(声明)在arch/arm/mm目录下)

arch/arm/mm目录下要找到匹配的前提是在内核配置菜单中选择包含这个配置文件。

对于__lookup_machine_type也是类似的机制,想要内核能支持这个开发板,需要在内核菜单配置,使内核编译的时候包含这个开发板

当__lookup_processor_type与__lookup_machine_type都成功后,proc_info_list结构还会被后续内核多次使用。

start_kernel函数分析

进入start_kernel之后,应该会看到内核启动信息。

如果没有看到,可能是bootloader传入的参数不对,也有可能是setup_arch函数
(arch/arm/kernel/setup.c)针对开发板的设置不正确

setup_arch会处理bootloader传入的tag列表。

1、setup_arch函数分析

1、根据开发板的machine_desc结构中确定启动参数地址,将它转换为虚拟地址
2、处理tag,arch/arm/kernel/setup.c对每种tag都有相应的处理函数
比如对于内存tag,命令行tag,下面两行代码指定了他们的处理函数:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tiantangmoke/article/details/102810110