移植内核学习笔记1-----框架介绍及简单修改

来源:互联网 发布:推荐淘宝上燕窝 编辑:程序博客网 时间:2024/06/17 01:22

内核的源代码可在http://www.kernel.org中下载

2、启动过程分析

(1)bootloader启动内核

把内核从flash里面读到内存里面去,还要设置很多参数,设置好参数后,才跳过去执行内核,怎么调过去看源代码

把内核从flash里面读到内存里


然后设置传给内核的参数


调用内核函数执行内核

第一个参数是0,第二个参数是机器ID(板子属于哪一类)(参考u-boot程序),第3个参数是存放传给内核的参数的位置0x30000100


(2)bootloader目的是为了引导内核

把内核读入内存

设置TAG参数

启动


(3)内核的目的(启动应用程序)

应用程序在flash上或硬盘上,所以需要挂接根文件系统,假设在flash上还要有flash的驱动程序,因而需要装载驱动程序。flash那么大,根文件系统在flash的哪里,在u-boot中传来的TAG参数中知道,所以要解析TAG参数。根据R1判断能否支持该机器,如果能够支持,调用机器相关的初始化函数。


(4)根据R1判断能否支持该机器,如果能够支持,调用机器相关的初始化函数。

我们编译一个内核的时候,不同单板用的芯片都是s3c2440,但是所接的外设不一样,初始化函数不一样,怎么分辨不同的开发板,开发板在内核代码中分配一个ID,编译内核的时候,内核怎么知道所用开发板是哪一种,是由bootloader来确定是哪一种开发板,通过R1传给内核,内核根据传进来的机器ID跟自己已有的机器ID比较,如果存在相等的就调用相关的初始化函数,如果没有相等的就卡死在哪里。

2、下载、配置、编译、烧写内核

(1)解压内核并修改Makefile


我们是arm架构,我们的交叉编译工具链是arm-linux-


编译新版本的内核需要用的编译器版本比较高,我们用的4.3.2

(2)使用默认的配置

看一下有哪些默认的配置


我们的是arm架构,进入arm架构里面,里面有一大堆配置项


搜索2440


搜素2410


配置 make s3c2410_defconfig,生成.config文件


查看.config  

里面有smdk2440和mini2440,我们的jz2440跟smdk2440很像,天下2440开发板基本一样,都来源于samsung的公板smdk2440


(3)编译内核

make uImage

(4)把编译好的内核拷贝到网络文件系统里面去


(5)启动u-boot用nfs协议下载内核到0x3200,0000

(6)启动内核


3、启动内核出现乱码

(1)我们根据机器ID去内核中找到单板相关的文件,它的初始化函数里面可能做得不对。导致串口输出乱码。

(2)打开u-boot(cmd_bootm.c文件)

找到在哪里启动,搜索bootm,调用do_bootm函数


在do_bootm函数中的boo_os结构体数组


调用do_bootm_linux函数(在bootm.c中)


调用boot_jump_linux函数,函数又调用kernel_entry函数


里面的参数machid根据搜索

可以从环境变量里面得到,如果环境变量里面没有设置,就使用默认值,搜索bi_arch_number有由MACH_TYPE_SMDK2410的宏定义为193,因而机器ID默认值为193,内核启动时根据193找到对应的机器,调用它的初始化函数


(3)怎么找到对应的机器

机器在哪里,进入arch/arm目录,找到机器相关的文件。看后缀为.o的文件,看哪些文件被编译进去。有我们内核支持的单板


4、实验

(1)设置机器ID,下载并启动内核,我们随便输入的机器ID肯定不对,看内核会打印出可用的机器ID


启动


打印出可用的机器ID


(2)设置机器ID为16a ,对应的文件是Mach-smdk2440.c

根据16a(10进制是362)这个数值来找到结构体,调用里面的初始化函数


上面这个结构体可以展开成下面的那一种结构体



(3)include/asm-arm/mach/arch.h这个文件是编译进内核时从文件arch/arm/tools/mach-types这个文件生成的

查看mach-types.h文件在哪里


查看一下


里面有,它又包含一个被生成的文件,generated是说这些文件是临时生成的。


查看这个临时生成的文件


里面有s3c2440


(4)用smdk2440的机器ID,设置机器ID为16a重新实验,下载后用bootm 3200,0000启动还是出现乱码


(5)用mini2440的机器ID,设置机器ID为7cf重新实验,下载后用bootm 3200,0000

启动后还是出现乱码,那就不是机器ID的问题,是不是启动参数里面没有设置波特率

(6)设置启动参数,再来下载,用bootm 3200,0000启动,为什么设置机器ID为7cf有输出,设置机器ID为16a没输出


(7)看看对应的文件


看看这两个文件在初始化函数方面有什么差别,Mach-smdk2440.c中map_io函数在初始化时钟的参数是16934400,而我们板子的晶振时钟是12M啊


因而需要修改晶振时钟为12M


(8)重新编译uImage,下载,启动

5、总结


在u-boot指定波特率



0 0
原创粉丝点击