Bootloader作用

1.初始化软硬件

2.启动操作系统

内核分类

1.zImage 不加信息头的内核

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

bootm作用

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

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

代码编写

1.获取启动地址

2.设置启动参数

2.1设置核心启动参数

2.2设置内存参数

2.3设置命令行参数

2.4设置参数结束行标志

3.启动操作系统

  1. /********************************************************************
  2. *名称:bootm.c
  3. *作者:D
  4. *时间:2015.11.23
  5. *功能:启动Linux系统
  6. *********************************************************************/
  7.  
  8. /********************************************************************
  9. *头文件
  10. *********************************************************************/
  11. #include "net.h"
  12.  
  13. /********************************************************************
  14. *宏定义
  15. *********************************************************************/
  16. #define KERNEL_ZERO 0
  17. #define KERNEL_MACH 1999 //开发板ID,要与内核ID匹配
  18. #define KERNEL_ADDR TFTP_DONWLOAD //内核地址
  19.  
  20. #define ATAG_ADDR 0x30000100 //标签地址
  21. #define ATAG_CORE 0x54410001 //核心标签
  22. #define ATAG_MEM 0x54410002 //内存标签
  23. #define ATAG_CMDLINE 0x54410009 //命令标签
  24. #define ATAG_NONE 0x00000000 //结束标签
  25.  
  26. #define MEM_ADDR 0x30000000 //内存地址
  27. #define MEM_SIZE 0x04000000 //内存大小
  28.  
  29. #define tag_size(type) ( (sizeof(struct tag_header)+sizeof(struct type))>>2 ) //计算标签大小,除以4表示标签大小以4字节计算,用于移动标签指针
  30. #define tag_next(type) ( (struct tag *)((unsigned int *)(type)+(type)->hdr.size) ) //移动标签指针
  31.  
  32. /********************************************************************
  33. *类型定义
  34. *********************************************************************/
  35. struct tag_header {
  36. unsigned int size;
  37. unsigned int tag;
  38. };
  39.  
  40. struct tag_core {
  41. unsigned int flags;
  42. unsigned int pagesize;
  43. unsigned int rootdev;
  44. };
  45. struct tag_mem32 {
  46. unsigned int size;
  47. unsigned int start;
  48. };
  49.  
  50. struct tag_cmdline {
  51. char cmdline[];
  52. };
  53.  
  54. struct tag{
  55. struct tag_header hdr;
  56. union{
  57. struct tag_core core;
  58. struct tag_mem32 mem;
  59. struct tag_cmdline cmdline;
  60. }u;
  61. };
  62. struct tag *params;
  63.  
  64. /********************************************************************
  65. *全局变量声明
  66. *********************************************************************/
  67. 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";
  68.  
  69. /********************************************************************
  70. *函数原型声明
  71. *********************************************************************/
  72. void do_bootm_linux();
  73. void setup_core_tag();
  74. void setup_memory_tag();
  75. void setup_cmdline_tag();
  76. void setup_end_tag();
  77.  
  78. /********************************************************************
  79. *名称:do_bootm_linux
  80. *参数:
  81. * none
  82. *返回:
  83. * none
  84. *功能:启动Linux系统
  85. *********************************************************************/
  86. void do_bootm_linux(){
  87. void (*theKernel)(int zero, int arch, unsigned int params); //内核函数指针
  88.  
  89. //设置启动地址
  90. theKernel = (void (*)(int, int, unsigned int))KERNEL_ADDR; //将地址转换为函数指针
  91.  
  92. //设置启动参数
  93. setup_core_tag(); //设置核心参数
  94. setup_memory_tag(); //设置内存参数
  95. setup_cmdline_tag(); //设置命令参数
  96. setup_end_tag(); //设置结束标志
  97.  
  98. //启动操作系统
  99. theKernel(KERNEL_ZERO, KERNEL_MACH, ATAG_ADDR); //不再返回
  100. }
  101.  
  102. /********************************************************************
  103. *名称:setup_core_tag
  104. *参数:
  105. * none
  106. *返回:
  107. * none
  108. *功能:设置核心参数
  109. *********************************************************************/
  110. void setup_core_tag(){
  111. //设置标签地址
  112. params = (struct tag *)ATAG_ADDR;
  113.  
  114. //设置核心参数
  115. params->hdr.tag = ATAG_CORE;
  116. params->hdr.size = tag_size(tag_core);
  117.  
  118. params->u.core.flags = ;
  119. params->u.core.pagesize = ;
  120. params->u.core.rootdev = ;
  121.  
  122. //移动标签地址
  123. params = tag_next(params);
  124. }
  125.  
  126. /********************************************************************
  127. *名称:setup_memory_tag
  128. *参数:
  129. * none
  130. *返回:
  131. * none
  132. *功能:设置内存参数
  133. *********************************************************************/
  134. void setup_memory_tag(){
  135. //设置内存参数
  136. params->hdr.tag = ATAG_MEM;
  137. params->hdr.size = tag_size(tag_mem32);
  138.  
  139. params->u.mem.start = MEM_ADDR;
  140. params->u.mem.size = MEM_SIZE;
  141.  
  142. //移动标签地址
  143. params = tag_next(params);
  144. }
  145.  
  146. /********************************************************************
  147. *名称:setup_cmdline_tag
  148. *参数:
  149. * none
  150. *返回:
  151. * none
  152. *功能:设置命令参数
  153. *********************************************************************/
  154. void setup_cmdline_tag(){
  155. //设置命令参数
  156. params->hdr.tag = ATAG_CMDLINE;
  157. params->hdr.size = (sizeof(struct tag_header)+strlen(cmdline)++)>>; //'+1'表示字符结束标志'\0', '+4'表示除以4转换成整型时向上取整
  158.  
  159. strcpy(params->u.cmdline.cmdline, cmdline);
  160.  
  161. //移动标签地址
  162. params = tag_next(params);
  163. }
  164.  
  165. /********************************************************************
  166. *名称:setup_cmdline_tag
  167. *参数:
  168. * none
  169. *返回:
  170. * none
  171. *功能:设置结束标志
  172. *********************************************************************/
  173. void setup_end_tag(){
  174. params->hdr.tag = ATAG_NONE;
  175. params->hdr.size = ;
  176. }

[国嵌攻略][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. centos 系统日志

    Linux系统日志主要有三类:连接时间日志.进程统计日志和错误日志 连接时间日志 连接时间日志由多个程序执行,把记录写入到/var/og/wtmp和/var/run/utmp.ogin等程序更新wtm ...

  2. extjs Proxy

    我们先来看看Extjs非常绚丽的Grid,其功能包括显示数据列表,修改.删除,分页,排序等功能.   Grid组件用来显示Store中的数据.Store可以看做是Model实例的集合.Grid仅关心如 ...

  3. Life in Changsha 第一次scrum冲刺

    第一次冲刺任务 基于大局的全面性功能框架定位,要求能实现用户基于自己的需求进行的一系列操作. 用户故事 用户打开“生活在长大”的界面 程序首页展示校园服务,论坛等相关信息 用户选择某个功能 程序界面跳 ...

  4. Vue 组件(component)之 精美的日历

    公司的要求,需要开发一个精美的日历组件(IOS , 安卓, PC 的IE9+都能运行),写完后想把它分享出来,希望大家批评(). 先来个截图 代码已经分享到 https://github.com/zh ...

  5. [js高手之路]面向对象版本匀速运动框架

    这篇文章的效果,需要看过以下3篇文章: [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件 [js高手之路]匀速运动与实例实战(侧边栏,淡入淡出) [js高手之路]打造通用的匀速运动框架 ...

  6. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  7. docker with flannel

    ** 原创文章,请勿转载 ** docker的单host,多container环境下,是使用host的docker0网桥进行通信的.如果跨host, container之间要通信怎么办呢?答案是fla ...

  8. PyQt4 的部件 -- CheckBox 单选框

    单选框具有两种状态:被选中或未被选中. 当用户选择或者取消选择时,单选框就会发射一个stateChanged()信号 # QCheckBox 单选框 # 本例创建一个用来改变窗口标题的单选框 impo ...

  9. PE文件详解(四)

    本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到SectionTable (区块表,也成节表). ...

  10. 【读书笔记】【深入理解ES6】#12-代理(Proxy)和反射(Reflection)API

    代理(Proxy)是一种可以拦截并改变底层JavaScript引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象. 数组问题 在ECMAScript6出现之前,开发者 ...