u-boot学习(五):u-boot启动内核
u-boot的目的是启动内核。内核位于Flash中,那么u-boot就要将内核转移到内存中。然后执行命令执行之。这些操作是由bootcmd命令完毕的。
bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0
nand read.jffs2 0x30007FC0 kernel 从Flash读出内核,kernel代表从kernel分区读出内核到0x30007FC0。
1、为什么会用0x30007FC0这么怪的地址呢,由于真实的内核映像文件是uImage文件。它包括:头部+真正的内核。而头部大小正好是64字节。64字节+0x30007FC0正好是0x30008000,这个0x30008000就是真正内核的载入地址,这样安排。就不用又一次移动内核了。
2、另一个概念就是kernel分区。事实上这是分区的概念,我们在include/configs/100ask24x0.h中将分区写死,分区的名字并不重要。重要的是起始地址以及分区的大小。
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \
"128k(params)," \
"2m(kernel)," \
"-(root)"
bootm 0x30007FC0命令在读取完内核后启动内核,调用do_bootm函数。它有零个作用:
1、依据头部移动内核到合适的位置(上面分析了,此处不需移动)。
2、启动do_bootm_linux。它也有两个作用:告诉内核一些參数,即设置启动參数;跳到入口地址启动内核。
Bootloader与内核的交互是单向的。Bootloader将各类參数传给内核。
因为它们不能同一时候执行。传递办法仅仅有一个:Bootloader将參数放在某个约定的地方后。再启动内核,内核启动后从这个地方获得參数。
除了约定好參数存放的地址外,还要规定參数的结构。内核期望以标记列表的形式来传递启动參数。
标记,就是一种数据结构;标记列表,就是挨着存放的多个标记。标记列表以标记ATAG_CORE開始,以标记ATAG_NONE结束。标记的数据结构为tag,它由一个tag_header结构和一个联合(union)组成。
tag_header结构表示标记的类型及长度,比方是表示内存还是表示命令行參数等。
对于不同类型的标记使用不同的联合(union)。比方表示内存时使用tag_mem32。表示命令时使用tag_cmdline。数据结构tag和tag_header定义在inlcude/asm/setup.h头文件里。
struct tag_header {
u32 size;
u32 tag;
};
struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
/*
* Acorn specific
*/
struct tag_acorn acorn;
/*
* DC21285 specific
*/
struct tag_memclk memclk;
} u;
};
能够利用这些结构设置标记ATAG_CORE、设置内存标记、设置命令行标记、设置标记ATAG_CORE。源代码中的setup_memory_tags、setup_commadnline_tag函数完毕内存标记和命令标记的设置,一般设置这两个标记就能够了。
设置完标记后,最后通过theKernel(0, bd->bi_arch_number, bd->bi_boot_params)调用内核。当中,theKernel指向内核存放的地址(对于ARM架构的CPU。一般是上面提到的0x30008000),bd->bi_arch_number就是第二阶段代码中board_init函数设置的机器类型ID,而bd->bi_boot_params就是标记列表的開始地址。
參考:韦东山 《嵌入式Linux应用开发全然手冊》
u-boot学习(五):u-boot启动内核的更多相关文章
- spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid
SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...
- Spring boot 学习 五:domain的定义
一 public class City implements Serializable 实现了Sericalizable接口,只是一种标志.表示可以被序列化. java的ObjectOutputStr ...
- Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目
最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...
- spring boot(十五)spring boot+thymeleaf+jpa增删改查示例
快速上手 配置文件 pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 <dependency> <groupId>org.springframework.b ...
- spring boot 学习(二)spring boot 框架整合 thymeleaf
spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...
- spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志
spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...
- Spring Boot学习笔记——Spring Boot与ActiveMQ的集成
Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.这里以ActiveMQ为 ...
- Spring Boot学习笔记——Spring Boot与Redis的集成
一.添加Redis缓存 1.添加Redis起步依赖 在pom.xml中添加Spring Boot支持Redis的依赖配置,具体如下: <dependency> <groupId> ...
- Spring Boot学习笔记——Spring Boot与MyBatis的集成(项目示例)
1.准备数据库环境 # 创建数据库 CREATE DATABASE IF NOT EXISTS zifeiydb DEFAULT CHARSET utf8 COLLATE utf8_general_c ...
随机推荐
- LocalDateTime查找最近的五分钟点
/** * 最近的五分钟 * @param dateTime * @return */ public static LocalDateTime getNear5(LocalDateTime dateT ...
- SpringBoot + Redis:基本配置及使用
注:本篇博客SpringBoot版本为2.1.5.RELEASE,SpringBoot1.0版本有些配置不适用 一.SpringBoot 配置Redis 1.1 pom 引入spring-boot-s ...
- [BZOJ2017][Usaco2009 Nov]硬币游戏(要复习系列)
又是DP? 好吧,或者说是博弈论,但是我不会啊. 先搞个O(n^3)的记忆化搜索,然后瞎搞好像发现两个状态几乎一样? 竟然过了样例,然后竟然A了... #include<iostream> ...
- 网络流模板(模板题:POJ1273)
模板题:POJ1273 EK: #include <queue> #include <cstdio> #include <cstring> #include < ...
- 画板(适用于手机、PC端)
Html代码 <script type="text/javascript" src="jquery-1.9.1.min.js"></scrip ...
- HTML <!DOCTYPE>标签
一般一个基本html页面的结构,如下代码所示: <html> <head> <title>我是基本的页面结构</title> </head> ...
- 数组中hashCode就是内存地址,以及汉字幻化为16进制或10进制
int[] arr4={1,2,3,4,5}; System.out.println("arr4: "+arr4); System.out.println("arr4.h ...
- Hibernate多表映射(三)
一对多|多对一 一个分类对应多个商品,一个商品只属于一个分类 创建分类表 products用set装,set特点值不能够重复 package com.hibernate.domain; import ...
- 1.0 windows10系统安装步骤(1)
1.0 windows10系统安装步骤(1) 根据自己对笔记本系统的折腾,为了方便他人系统的安装,故总结笔记本系统的安装步骤 目录: 1.0 [windows10系统安装步骤(1)] 2.0 Linu ...
- 安装Windows服务,一直提示系统正在关机的错误。
错误截图如下: 问题概况: 在本机安装没问题,程序没问题. 安装到公司的测试环境就报错了!以管理员身份运行也不行. 解决方案: 1.最后发现是360安全防护中心拦截了.具体解决过程如下: 2.进入36 ...