移植内核学习笔记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指定波特率
- 移植内核学习笔记1-----框架介绍及简单修改
- 内核之框架介绍及简单修改
- 内核之框架介绍及简单修改
- 移植内核学习笔记2-----修改分区及制作根文件系统
- 05-S3C2440学习之内核(移植)linux3.4.2移植(1)之简单移植+修改MTD分区+制作jffs2文件系统
- 移植内核学习笔记4-----内核之裁剪及ECC简介及制作补丁
- Linux内核移植 part1:uboot 框架及移植
- 05-S3C2440学习之内核(移植)linux3.4.2移植(3)之支持DM9000C网卡及修改支持串口2
- Linux学习内核移植相关笔记第1部分
- 移植驱动到内核学习笔记1-----DM9000C驱动
- Django框架学习笔记(22.CSRF原理简单介绍)
- 移植驱动到内核学习笔记3-----LCD及输入系统
- android学习笔记——SQLite简单应用及介绍
- RabbitMQ 学习笔记(一):简单介绍及"Hello World"
- 人工智能学习笔记-Theano介绍及简单应用
- 人工智能学习笔记-Keras介绍及简单应用
- 1、CXF学习笔记 之 简单介绍
- Hibernate 框架的搭建及简单介绍
- Eclipse快捷键大全
- 视图控制器
- (第三季)106-vs插件resharper的下载安装和破解
- python中的三个读read(),readline()和readlines()
- SSL/TLS密钥协商(握手)过程
- 移植内核学习笔记1-----框架介绍及简单修改
- 华为Oj基础第六题 字符串加解密
- 基于主键的范式和相应的规范化
- iOS开发常用尺寸整理
- 优秀的Java程序测试是什么样的?
- Code=3000 "未找到应用程序的“aps-environment”的授权字符串" 解决办法
- 写一个函数返回参数二进制中1的个数
- 两个栈实现一个队列
- POJ 2728 Desert King