您的位置:首页 > 其它

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

2016-09-16 15:07 543 查看
内核的源代码可在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、总结(机器ID、时钟、波特率)






在u-boot指定波特率




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: