首页>参考读物>电子电工>电子工程

深入理解BootLoader
作者 : 胡尔佳 编著
出版日期 : 2016-07-15
ISBN : 978-7-111-48570-4
定价 : 59.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 275
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书内容分为三个部分。第一部分主要了解熟悉GUN Linux的交叉编译环境。第二部分主要是让读者熟悉ARM的体系结构,以及如何基于ARM和GUN工具链进行汇编语言编程。第三部分将结合具体的平台实现Bootloader,包括uboot源码的分析和移植。

图书特色

本书系统讲解BootLoader开发理论、流程与实例。
本书以ARM和Linux为蓝本,详细介绍了如何实现可用的BootLoader。
本书是嵌入式Linux移植开发领域的工程师不可多得的参考书。

封底
本书主要介绍BootLoader的开发理论、流程与实例,以当前流行的ARM和Linux为蓝本,详细介绍如何一步步实现可用的BootLoader。该书既对Linux下的开发环境、编译器使用、处理器架构以及编译和链接、链接脚本的细节做了较全面的理论介绍,又结合具体的环境向读者说明了BootLoader的原理和开发流程,使读者真正懂得BootLoader是如何工作的,即便今后遇到其他处理器或者引导其他操作系统,也能熟知开发或者移植BootLoader的思路。
为了引导操作系统,BootLoader与CPU体系结构和操作系统有着非常紧密的联系。在本书中,我们以ARM体系结构和嵌入式Linux操作系统为原型讲述BootLoader的原理。通过理论联系实践的方法,让读者理解BootLoader的概念,掌握开发BootLoader的方法。
本书适合从学习单片机向ARM过渡、希望了解嵌入式开发的在校学生以及想要从事BootLoader开发/移植工作的工程师参考。


BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
本书详细介绍如何一步一步地实现可用的BootLoader。对Linux下的开发环境、编译器使用、处理器架构以及编译和链接、链接脚本的细节做了较全面的理论介绍,又结合具体的环境向读者说明BootLoader的原理和开发流程,使读者真正懂得BootLoader是如何工作的,即便今后遇到其他处理器或者引导其他操作系统,也能熟知开发或者移植BootLoader的思路。

图书前言

BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射,从而将系统的软硬件环境设置成一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
在嵌入式系统中,通常没有像PC中的BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。BootLoader 是CPU上电后运行的第一段程序,它的作用就是对嵌入式系统中的硬件进行初始化,创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。实际上,一个功能比较强大的BootLoader已经相当于一个微型的操作系统了。
不同的CPU体系结构有不同的BootLoader。有些BootLoader支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的BootLoader 程序也能运行在另一块板子上,通常需要修改BootLoader的源程序。因此每款嵌入式产品的BootLoader都是独一无二的,但我们可以总结出开发或者维护特定BootLoader需要哪些背景知识,掌握了这些背景知识,我们就可以做到以不变应万变。
为了引导操作系统,BootLoader与CPU体系结构和操作系统有着非常紧密的联系。在本书中,我们以ARM体系结构和嵌入式Linux操作系统为原型讲述BootLoader的原理。通过理论联系实践的方法论,让读者理解BootLoader的概念,掌握开发BootLoader的方法。本书适合从单片机向ARM过渡并希望了解嵌入式开发的在校学生以及想要从事BootLoader开发移植工作的工程师参考使用。
下面来梳理一下需要哪些背景知识:
1)因为我们引导的操作系统是Linux,所以需要熟悉Linux开发环境。BootLoader也是一串代码,我们必须了解Linux下编辑器和编译器的用法;作为Linux下的开发者,对shell脚本和Make工程管理工具也要有必要的了解。第1章对BootLoader做了基本介绍,第2章则详细介绍了Linux开发环境。
2)因为我们仅仅以ARM体系结构作为原型,所以会在第3~5章讲述ARM体系结构、ARM指令集和ARM独特的寻址模式。
3)很多嵌入式开发人员都是通信、电子和自动化等专业的,对于计算机的编译和链接掌握得不够深入,因此第6章介绍编译和链接。控制链接行为的链接脚本是特有的脚本语言,第7章比较详细地介绍了该脚本的细节。
4)第8章采用流水灯的实验融会贯通前面各章节的理论,接着第9章对U-Boot代码展开分析,最后在第10章一步一步地实现了BootLoader。在此过程中,我们更注重ARM体系结构、编译链接等知识的融会贯通,不会花太多篇幅讲解DRAM、MMC等模块的驱动。
本书能够成书,要感谢LinkSprite团队的资源支持和左宝柱在pcDuino v3平台上的帮助。最后感谢家人和朋友对我的支持,鼓励我完成这项值得用心去做的工作。因作者水平有限且时间仓促,书中难免存在疏漏,还望广大读者不吝赐教。

胡尔佳
2014年11月

上架指导

嵌入式

封底文字

本书主要介绍Bootloader的开发理论、流程与实例,以当前流行的ARM和Linux为蓝本,详细介绍了如何一步步实现可用的BootLoader。该书既对Linux下的开发环境、编译器使用、处理器架构以及编译和链接、链接脚本的细节做了较全面的理论介绍,又结合具体的环境向读者说明了BootLoader的原理和开发流程,使读者真正懂得BootLoader是如何工作的,即便今后遇到其他处理器或者引导其他操作系统,也能熟知开发或者移植BootLoader的思路。
为了引导操作系统,BootLoader与CPU体系结构和操作系统有着非常紧密的联系。在本书中,我们以ARM体系结构和嵌入式Linux操作系统为原型讲述BootLoader的原理。通过理论联系实践的方法论,让读者理解BootLoader的概念,掌握开发BootLoader的方法。
本书适合从学习单片机向ARM过渡、希望了解嵌入式开发的在校学生以及想要从事BootLoader开发移植工作的工程师。

作者简介

胡尔佳 编著:暂无简介

图书目录

前言
第1章 BootLoader的概念 1
1.1 BootLoader的角色 1
1.2 BootLoader的来历 2
1.3 BootLoader的概念 6
1.3.1 MCU下的BootLoader 10
1.3.2 嵌入式ARM和Linux下的BootLoader 17
1.3.3 PC下的引导流程 18
1.4 本章小结 20
第2章 Linux开发环境 21
2.1 编辑器Vim 21
2.1.1  Vim介绍 22
2.1.2 Vim的两个基本模式  22
2.1.3 Vim的两个常用模式 24
2.1.4 Vim的启动与退出 25
2.1.5 Vim下光标的移动 26
2.1.6 Vim下的复制、粘贴和删除 28
2.1.7 Vim下的撤销和重复 28
2.1.8 Vim下的查找和替换 28
2.1.9 Vim下的文件恢复 29
2.1.10 Vim下的插件 29
2.2 编译器GCC和交叉编译器 30
2.2.1 GCC的编译流程 30
2.2.2 GCC的常用编译选项 31
2.2.3 交叉编译器 35
2.3 常用shell命令和脚本 37
2.3.1 find命令 38
2.3.2 grep命令 42
2.3.3 管道与重定向 46
2.4 工程管理Make和Makefile 49
2.4.1 Make和Makefile 49
2.4.2 Makefile中的变量 52
2.4.3 自动推导规则 53
2.4.4 嵌套的Makefile 53
2.4.5 Make伪目标 54
2.4.6 自动化变量 56
2.4.7 Make的内嵌函数 56
2.5 本章小结 60
第3章 ARM体系结构 61
3.1 处理器模式 61
3.2 异常 62
3.3 ARM寄存器 63
3.4 通用寄存器 64
3.4.1 未分组的寄存器:R0~R7 65
3.4.2 分组的寄存器:R8~R14 65
3.4.3 寄存器R15:程序计数器 66
3.5 程序状态寄存器 66
3.5.1 PSR位的类型 66
3.5.2 条件标志位 67
3.5.3 中断禁止位 68
3.5.4 模式位 68
3.6 本章小结 68
第4章 ARM指令集 69
4.1 数据处理指令 69
4.2 分支指令 73
4.3 软中断指令 74
4.4 程序状态寄存器指令 75
4.5 协处理器指令 76
4.6 加载常量的伪指令 78
4.7 本章小结 78
第5章 ARM寻址模式 79
5.1 寻址模式1——数据处理指令的寻址模式 79
5.1.1 编码格式 80
5.1.2 移位器操作数 80
5.1.3 数据处理操作——立即数 81
5.1.4 数据处理操作——寄存器 82
5.1.5 数据处理操作——立即数的逻辑左移 83
5.1.6 数据处理操作——寄存器的逻辑左移 84
5.1.7 数据处理操作——立即数的逻辑右移 85
5.1.8 数据处理操作——寄存器的逻辑右移 85
5.1.9 数据处理操作——立即数的算术右移 86
5.1.10 数据处理操作——寄存器的算术右移 87
5.1.11 数据处理操作——立即数的循环右移 88
5.1.12 数据处理操作——寄存器的循环右移 89
5.1.13 数据处理操作——扩展的循环右移 90
5.2 寻址模式2——字或无符号字节的load/store指令 90
5.2.1 编码格式 91
5.2.2 立即数偏移 92
5.2.3 寄存器偏移 93
5.2.4 比例寄存器偏移 94
5.2.5 立即数的前变址寻址 95
5.2.6 寄存器的前变址寻址 96
5.2.7 比例寄存器的前变址寻址 97
5.2.8 立即数的后变址寻址 99
5.2.9 寄存器的后变址寻址 100
5.2.10 比例寄存器的后变址寻址 101
5.3 寻址模式3——杂类load/store指令的寻址方式 103
5.3.1 编码格式 103
5.3.2 杂类load/store——立即数偏移 104
5.3.3 杂类load/store——寄存器偏移 105
5.3.4 杂类load/store——立即数的前变址寻址 106
5.3.5 杂类load/store——寄存器的前变址寻址 107
5.3.6 杂类load/store——立即数的后变址寻址 108
5.3.7 杂类load/store——寄存器的后变址寻址 109
5.4 寻址模式4——批量load/store 110
5.4.1 编码格式 110
5.4.2 批量load/store——执行后增加 111
5.4.3 批量load/store——执行前增加 112
5.4.4 批量load/store——执行后减少 112
5.4.5 批量load/store——执行前减少 113
5.4.6 用于栈操作的批量load/store 114
5.5 寻址模式5——协处理器的load/store 115
5.5.1 编码格式 115
5.5.2 协处理器的load/store——立即数偏移 116
5.5.3 协处理器的load/store——立即数的前变址寻址 117
5.5.4 协处理器的load/store——立即数的后变址寻址 118
5.5.5 协处理器的load/store——无索引 119
5.6 本章小结 119
第6章 编译和链接 120
6.1 ELF文件结构描述 122
6.2 段表 128
6.3 符号表结构 133
6.4 存储空间分配 138
6.4.1 简单的存储布局 138
6.4.2 实际采用的空间布局 139
6.5 重定位信息 140
6.5.1 重定位表项 140
6.5.2 重定位类型 142
6.6 静态链接和重定位 143
6.6.1 符号和符号表 144
6.6.2 符号解析 145
6.6.3 重定位 146
6.7 本章小结 150
第7章 链接脚本 151
7.1 链接脚本的基本概念 152
7.2 链接脚本格式 152
7.3 简单的链接脚本示例 153
7.4 简单的链接脚本命令 154
7.4.1 入口点 154
7.4.2 文件命令 155
7.4.3 格式命令 156
7.4.4 区域别名 157
7.4.5 杂类命令 159
7.5 为符号分配值 160
7.5.1 简单的分配 161
7.5.2 HIDDEN 161
7.5.3 PROVIDE 162
7.5.4 PROVIDE_HIDDEN 162
7.5.5 源代码引用 162
7.6 段命令 164
7.6.1 输出段描述 164
7.6.2 输出段名称 165
7.6.3 输出段地址 165
7.6.4 输入段描述 166
7.6.5 输出段数据 171
7.6.6 输出段关键字 172
7.6.7 输出段丢弃 172
7.6.8 输出段属性 172
7.6.9 覆盖描述 175
7.7 内存命令 177
7.8 链接脚本的表达式 178
7.8.1 常量 178
7.8.2 符号常量 179
7.8.3 符号名称 179
7.8.4 孤立的段 179
7.8.5 位置计数器 180
7.8.6 运算符 182
7.8.7 赋值 183
7.8.8 内建函数 183
7.9 本章小结 187
第8章 Linux下开发流水灯 188
8.1 GNU ARM汇编简介 188
8.2 流水灯的硬件描述 191
8.3 流水灯的汇编实现 193
8.4 流水灯的编译和链接 195
8.5 本章小结 196
第9章 U-Boot代码的分析 197
9.1 U-Boot简介 197
9.2 U-Boot目录结构 198
9.3 U-Boot配置和编译 200
9.4 U-Boot代码分析 207
9.4.1 SPL代码追踪 208
9.4.2 U-Boot代码追踪 233
9.5 本章小结 245
第10章 实现简单的BootLoader 246
10.1 STM32下的BootLoader设计 246
10.2 硬件平台pcDuino简介 251
10.2.1 pcDuino nano配置 252
10.2.2 pcDuino nano的接口和外设 253
10.2.3 平台和主芯片介绍 254
10.3 三种方式实现代码复制和跳转 255
10.3.1 方式一 255
10.3.2 方式二 258
10.3.3 方式三 259
10.4 实现BootLoader 261
10.4.1 广义上的BootLoader 261
10.4.2 如何引导Linux 264
10.4.3 引导代码实现 266
10.4.4 BootLoader引导Linux总结 267
10.5 本章小结 267

教学资源推荐
作者: 王增和 丁卫平 李平辉
作者: R.Jacob Baker, Harry W.Li, David E.Boyce
作者: 王洁 赵晶 编著
作者: [美]马克?西格斯蒙德(Mark Siegesmund)著
参考读物推荐
作者: 丁武锋 庄严 周春阳 编著
作者: 阙志达 蔡佩芸 赖以威 著
作者: [美] 塔米·诺尔加德(Tammy Noergaard) 著
作者: 高显生 编著