Bootloader作用

1.初始化软硬件

2.启动操作系统

内核分类

1.zImage 不加信息头的内核

2.uImage 加信息头后的内核,用bootm命令来启动

bootm作用

1.检测信息头:压缩、操作系统、幻数

2.根据OS信息调用相应的处理函数:获取内核地址、知道CPU型号、设置启动参数

代码编写

1.获取启动地址

2.设置启动参数

2.1设置核心启动参数

2.2设置内存参数

2.3设置命令行参数

2.4设置参数结束行标志

3.启动操作系统

/********************************************************************
*名称:bootm.c
*作者:D
*时间:2015.11.23
*功能:启动Linux系统
*********************************************************************/ /********************************************************************
*头文件
*********************************************************************/
#include "net.h" /********************************************************************
*宏定义
*********************************************************************/
#define KERNEL_ZERO 0
#define KERNEL_MACH 1999 //开发板ID,要与内核ID匹配
#define KERNEL_ADDR TFTP_DONWLOAD //内核地址 #define ATAG_ADDR 0x30000100 //标签地址
#define ATAG_CORE 0x54410001 //核心标签
#define ATAG_MEM 0x54410002 //内存标签
#define ATAG_CMDLINE 0x54410009 //命令标签
#define ATAG_NONE 0x00000000 //结束标签 #define MEM_ADDR 0x30000000 //内存地址
#define MEM_SIZE 0x04000000 //内存大小 #define tag_size(type) ( (sizeof(struct tag_header)+sizeof(struct type))>>2 ) //计算标签大小,除以4表示标签大小以4字节计算,用于移动标签指针
#define tag_next(type) ( (struct tag *)((unsigned int *)(type)+(type)->hdr.size) ) //移动标签指针 /********************************************************************
*类型定义
*********************************************************************/
struct tag_header {
unsigned int size;
unsigned int tag;
}; struct tag_core {
unsigned int flags;
unsigned int pagesize;
unsigned int rootdev;
};
struct tag_mem32 {
unsigned int size;
unsigned int start;
}; struct tag_cmdline {
char cmdline[];
}; struct tag{
struct tag_header hdr;
union{
struct tag_core core;
struct tag_mem32 mem;
struct tag_cmdline cmdline;
}u;
};
struct tag *params; /********************************************************************
*全局变量声明
*********************************************************************/
const char *cmdline = "noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.101:/space/temp/nfs ip=192.168.1.230:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off"; /********************************************************************
*函数原型声明
*********************************************************************/
void do_bootm_linux();
void setup_core_tag();
void setup_memory_tag();
void setup_cmdline_tag();
void setup_end_tag(); /********************************************************************
*名称:do_bootm_linux
*参数:
* none
*返回:
* none
*功能:启动Linux系统
*********************************************************************/
void do_bootm_linux(){
void (*theKernel)(int zero, int arch, unsigned int params); //内核函数指针 //设置启动地址
theKernel = (void (*)(int, int, unsigned int))KERNEL_ADDR; //将地址转换为函数指针 //设置启动参数
setup_core_tag(); //设置核心参数
setup_memory_tag(); //设置内存参数
setup_cmdline_tag(); //设置命令参数
setup_end_tag(); //设置结束标志 //启动操作系统
theKernel(KERNEL_ZERO, KERNEL_MACH, ATAG_ADDR); //不再返回
} /********************************************************************
*名称:setup_core_tag
*参数:
* none
*返回:
* none
*功能:设置核心参数
*********************************************************************/
void setup_core_tag(){
//设置标签地址
params = (struct tag *)ATAG_ADDR; //设置核心参数
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size(tag_core); params->u.core.flags = ;
params->u.core.pagesize = ;
params->u.core.rootdev = ; //移动标签地址
params = tag_next(params);
} /********************************************************************
*名称:setup_memory_tag
*参数:
* none
*返回:
* none
*功能:设置内存参数
*********************************************************************/
void setup_memory_tag(){
//设置内存参数
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size(tag_mem32); params->u.mem.start = MEM_ADDR;
params->u.mem.size = MEM_SIZE; //移动标签地址
params = tag_next(params);
} /********************************************************************
*名称:setup_cmdline_tag
*参数:
* none
*返回:
* none
*功能:设置命令参数
*********************************************************************/
void setup_cmdline_tag(){
//设置命令参数
params->hdr.tag = ATAG_CMDLINE;
params->hdr.size = (sizeof(struct tag_header)+strlen(cmdline)++)>>; //'+1'表示字符结束标志'\0', '+4'表示除以4转换成整型时向上取整 strcpy(params->u.cmdline.cmdline, cmdline); //移动标签地址
params = tag_next(params);
} /********************************************************************
*名称:setup_cmdline_tag
*参数:
* none
*返回:
* none
*功能:设置结束标志
*********************************************************************/
void setup_end_tag(){
params->hdr.tag = ATAG_NONE;
params->hdr.size = ;
}

[国嵌攻略][069][Bootm命令移植]的更多相关文章

  1. [国嵌攻略][182][Sqlite嵌入式数据库移植]

    数据库系统构成 在计算机系统中,保存数据的方式一般有两种: 1.普通文件方式 2.数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由三个部分构成 1. ...

  2. [国嵌攻略][173][BOA嵌入式服务器移植]

    1.解压boa嵌入式web服务 tar zxvf boa-0.94.13.tar.gz 2.进入src目录生成配置文件 ./configure 3.修改生成的Makefile CC=arm-linux ...

  3. [国嵌攻略][097][U-Boot新手入门]

    嵌入式软件层次 1.Bootloader 2.Linux内核 3.文件系统 编译U-Boot 1.解压uboot tar zxvf uboot.tar.gz 2.清除uboot make distcl ...

  4. [国嵌攻略][045-046][一跃进入C大门]

    [一跃进入C大门] 跳转方式 1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转 2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转 代码编写 1.在汇编代码中直接使用 ...

  5. [国嵌攻略][179][OpenSSL加密系统]

    未加密传输的安全弊端 如果在网络传输中没有加密,就是以明文传输.传输的数据可以被抓包软件直接截获,并能读取里面的数据. 加密基本原理 1.对称加密 2.非对称加密 2.1.公钥私钥 公钥和私密要配对. ...

  6. [国嵌攻略][174][CGI快速入门-网页控制LED]

    CGI程序(Common Gate Way Interface) 在服务器外部供服务器调用的程序,CGI程序与服务器配合后能让服务器完成更强大的功能. 1.浏览器通过HTML表单或超链接请求指向一个C ...

  7. [国嵌攻略][156][I2C自编设备驱动设计]

    AT24C08的驱动在Linux内核中已经提供,在/drivers/misc/eeprom/at24.c文件中.在对应的probe函数中有一个创建/sys/.../eeprom文件的函数,应用程序通过 ...

  8. [国嵌攻略][155][I2C用户态驱动设计]

    用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操 ...

  9. [国嵌攻略][149][Yaffs2文件系统应用]

    嵌入式系统自启动 MTD技术通过把Nand FLash划分成bootloader分区,Linux kernel分区和file system分区来达到自启动的效果. 配置和编译内核 1.配置Linux内 ...

随机推荐

  1. JFinal极速开发框架使用笔记

    记录第一次使用JFinal,从简单的框架搭建到增删改查,从自带的方法到正常框架习惯的使用方式. JFinal官网:http://www.jfinal.com/ JFinal 是基于 Java 语言的极 ...

  2. Golang 网络爬虫框架gocolly/colly 三

    Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...

  3. Java自己动手写连接池二

    读取数据库文件,来操作: package com.kama.cn; import java.sql.Connection;import java.sql.DriverManager;import ja ...

  4. JavaScript的DOM编程--05--获取文本节点

    获取文本节点: 1). 步骤: 元素节点 --> 获取元素节点的子节点 2). 若元素节点只有文本节点一个子节点, 例如 <li id="bj" name=" ...

  5. MySQL 数据类型和约束(外键是重点🙄)

    数据类型 1. 数字(默认都是由符号,宽度表示的是显示宽度,与存储无关).tinyint 括号里指定宽度 七位2进制数最大数就是2**7 -1=127 最小是-128 验证: create tabel ...

  6. jQuery的get()post()getJson()方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...

  7. WPF自定义Window样式(2)

    1. 引言 在上一篇中,介绍了如何建立自定义窗体.接下来,我们需要考虑将该自定义窗体基类放到类库中去,只有放到类库中,我们才能在其他地方去方便的引用该基类. 2. 创建类库 接上一篇的项目,先添加一个 ...

  8. p2p 打洞技术

    根据通信双方所处网络环境不同,点对点通信可以划分成以下三类:i> 公网:公网ii>公网:内网iii>内网:内网前两种容易实现,我们这里主要讨论第三种.这其中会涉及到NAT和NAPT的 ...

  9. HTML知识点总结之img、scirpt、link标签

    <img>元素 使用<img>可以在网页插入一个图片,但实际上<img>标签并不会在网页中直接插入图像,而是从网页上链接图像. <img>的主要属性 ( ...

  10. iphone微信后退不刷新的问题

    查看了很多解决ios微信返回不刷新页面的文章,大部分都是利用H5的新特性history来进行解决的,而且很多人的想法都是用了pushstate和popstate来实现了这个功能,但是用pushstat ...