移植内核学习笔记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指定波特率
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指定波特率
相关文章推荐
- 05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统
- Django框架学习笔记(6.FBV和CBV简单介绍)
- 移植内核学习笔记2-----修改分区及制作根文件系统
- 内核之框架介绍及简单修改
- Django框架学习笔记(22.CSRF原理简单介绍)
- 内核之框架介绍及简单修改
- Lucene5 学习笔记(2) —— 简单介绍 Lucene 搜索功能和索引的修改、删除
- 移动开发:S5PV210学习笔记——内核移植与文件系统构建
- AD学习笔记之三 -- 域控制器上的简单操作介绍
- Linux内核策略介绍学习笔记
- Ubuntu操作系统学习笔记之Vim简单介绍
- MongoDB学习笔记-- 简单介绍(二)
- [Docker]学习笔记--简单介绍
- 黑马程序员_Executor框架简单创建、运行、关闭学习笔记
- 作业调度框架 Quartz 学习笔记(二) -- 简单触发器(SimpleTrigger)
- Duilib学习笔记(1)之简单框架编写
- 学习笔记 --- LINUX应用调试之修改内核输出应用程序的段错误信息
- Linux学习内核移植相关笔记第4部分
- Linux学习内核移植相关笔记第2部分
- iOS学习笔记14(1)—Core Data简单介绍和实现