互联网
类型
8.3
豆瓣评分
可以朗读
语音朗读
443千字
字数
2021-04-01
发行日期
展开全部
主编推荐语
一本专门为嵌入式读者打造的C语言进阶学习图书。
内容简介
本书的学习重点不再是C语言的基本语法,而是和嵌入式、C语言相关的一系列知识。
作者以C语言为切入点,分别探讨了嵌入式开发所需要的诸多核心理论和技能,力图帮助读者从零搭建嵌入式开发所需要的完整知识体系和技能树。
本书从底层CPU的制造流程和工作原理开始讲起,到计算机体系结构,C程序的反汇编分析,程序的编译、运行和重定位,程序运行时的堆栈内存动态变化。
目录
- 版权信息
- 内容简介
- 前言
- 第1章 工欲善其事,必先利其器
- 1.1 代码编辑工具:Vim
- 1.1.1 安装Vim
- 1.1.2 Vim常用命令
- 1.1.3 Vim配置文件:vimrc
- 1.1.4 Vim的按键映射
- 1.2 程序编译工具:make
- 1.2.1 使用IDE编译C程序
- 1.2.2 使用gcc编译C源程序
- 1.2.3 使用make编译程序
- 1.3 代码管理工具:Git
- 1.3.1 什么是版本控制系统
- 1.3.2 Git的安装和配置
- 1.3.3 Git常用命令
- 第2章 计算机体系结构与CPU工作原理
- 2.1 一颗芯片是怎样诞生的
- 2.1.1 从沙子到单晶硅
- 2.1.2 PN结的工作原理
- 2.1.3 从PN结到芯片电路
- 2.1.4 芯片的封装
- 2.2 一颗CPU是怎么设计出来的
- 2.2.1 计算机理论基石:图灵机
- 2.2.2 CPU内部结构及工作原理
- 2.2.3 CPU设计流程
- 2.3 计算机体系结构
- 2.3.1 冯·诺依曼架构
- 2.3.2 哈弗架构
- 2.3.3 混合架构
- 2.4 CPU性能提升:Cache机制
- 2.4.1 Cache的工作原理
- 2.4.2 一级Cache和二级Cache
- 2.4.3 为什么有些处理器没有Cache
- 2.5 CPU性能提升:流水线
- 2.5.1 流水线工作原理
- 2.5.2 超流水线技术
- 2.5.3 流水线冒险
- 2.5.4 分支预测
- 2.5.5 乱序执行
- 2.5.6 SIMD和NEON
- 2.5.7 单发射和多发射
- 2.6 多核CPU
- 2.6.1 单核处理器的瓶颈
- 2.6.2 片上多核互连技术
- 2.6.3 big.LITTLE结构
- 2.6.4 超线程技术
- 2.6.5 CPU核数越多越好吗
- 2.7 后摩尔时代:异构计算的崛起
- 2.7.1 什么是异构计算
- 2.7.2 GPU
- 2.7.3 DSP
- 2.7.4 FPGA
- 2.7.5 TPU
- 2.7.6 NPU
- 2.7.7 后摩尔时代的XPU们
- 2.8 总线与地址
- 2.8.1 地址的本质
- 2.8.2 总线的概念
- 2.8.3 总线编址方式
- 2.9 指令集与微架构
- 2.9.1 什么是指令集
- 2.9.2 什么是微架构
- 2.9.3 指令助记符:汇编语言
- 第3章 ARM体系结构与汇编语言
- 3.1 ARM体系结构
- 3.2 ARM汇编指令
- 3.2.1 存储访问指令
- 3.2.2 数据传送指令
- 3.2.3 算术逻辑运算指令
- 3.2.4 操作数:operand2详解
- 3.2.5 比较指令
- 3.2.6 条件执行指令
- 3.2.7 跳转指令
- 3.3 ARM寻址方式
- 3.3.1 寄存器寻址
- 3.3.2 立即数寻址
- 3.3.3 寄存器偏移寻址
- 3.3.4 寄存器间接寻址
- 3.3.5 基址寻址
- 3.3.6 多寄存器寻址
- 3.3.7 相对寻址
- 3.4 ARM伪指令
- 3.4.1 LDR伪指令
- 3.4.2 ADR伪指令
- 3.5 ARM汇编程序设计
- 3.5.1 ARM汇编程序格式
- 3.5.2 符号与标号
- 3.5.3 伪操作
- 3.6 C语言和汇编语言混合编程
- 3.6.1 ATPCS规则
- 3.6.2 在C程序中内嵌汇编代码
- 3.6.3 在汇编程序中调用C程序
- 3.7 GNU ARM汇编语言
- 3.7.1 重新认识编译器
- 3.7.2 GNU ARM编译器的伪操作
- 3.7.3 GNU ARM汇编语言中的标号
- 3.7.4 .section伪操作
- 3.7.5 基本数据格式
- 3.7.6 数据定义
- 3.7.7 汇编代码分析实战
- 第4章 程序的编译、链接、安装和运行
- 4.1 从源程序到二进制文件
- 4.2 预处理过程
- 4.3 程序的编译
- 4.3.1 从C文件到汇编文件
- 4.3.2 汇编过程
- 4.3.3 符号表与重定位表
- 4.4 链接过程
- 4.4.1 分段组装
- 4.4.2 符号决议
- 4.4.3 重定位
- 4.5 程序的安装
- 4.5.1 程序安装的本质
- 4.5.2 在Linux下制作软件安装包
- 4.5.3 使用apt-get在线安装软件
- 4.5.4 在Windows下制作软件安装包
- 4.6 程序的运行
- 4.6.1 操作系统环境下的程序运行
- 4.6.2 裸机环境下的程序运行
- 4.6.3 程序入口main()函数分析
- 4.6.4 BSS段的小秘密
- 4.7 链接静态库
- 4.8 动态链接
- 4.8.1 与地址无关的代码
- 4.8.2 全局偏移表
- 4.8.3 延迟绑定
- 4.8.4 共享库
- 4.9 插件的工作原理
- 4.10 Linux内核模块运行机制
- 4.11 Linux内核编译和启动分析
- 4.12 U-boot重定位分析
- 4.13 常用的binutils工具集
- 第5章 内存堆栈管理
- 5.1 程序运行的“马甲”:进程
- 5.2 Linux环境下的内存管理
- 5.3 栈的管理
- 5.3.1 栈的初始化
- 5.3.2 函数调用
- 5.3.3 参数传递
- 5.3.4 形参与实参
- 5.3.5 栈与作用域
- 5.3.6 栈溢出攻击原理
- 5.4 堆内存管理
- 5.4.1 裸机环境下的堆内存管理
- 5.4.2 uC/OS的堆内存管理
- 5.4.3 Linux堆内存管理
- 5.4.4 堆内存测试程序
- 5.4.5 实现自己的堆管理器
- 5.5 mmap映射区域探秘
- 5.5.1 将文件映射到内存
- 5.5.2 mmap映射实现机制分析
- 5.5.3 把设备映射到内存
- 5.5.4 多进程共享动态库
- 5.6 内存泄漏与防范
- 5.6.1 一个内存泄漏的例子
- 5.6.2 预防内存泄漏
- 5.6.3 内存泄漏检测:MTrace
- 5.6.4 广义上的内存泄漏
- 5.7 常见的内存错误及检测
- 5.7.1 总有一个Bug,让你泪流满面
- 5.7.2 使用core dump调试段错误
- 5.7.3 什么是内存踩踏
- 5.7.4 内存踩踏监测:mprotect
- 5.7.5 内存检测神器:Valgrind
- 第6章 GNU C编译器扩展语法精讲
- 6.1 C语言标准和编译器
- 6.1.1 什么是C语言标准
- 6.1.2 C语言标准的内容
- 6.1.3 C语言标准的发展过程
- 6.1.4 编译器对C语言标准的支持
- 6.1.5 编译器对C语言标准的扩展
- 6.2 指定初始化
- 6.2.1 指定初始化数组元素
- 6.2.2 指定初始化结构体成员
- 6.2.3 Linux内核驱动注册
- 6.2.4 指定初始化的好处
- 6.3 宏构造“利器”:语句表达式
- 6.3.1 表达式、语句和代码块
- 6.3.2 语句表达式
- 6.3.3 在宏定义中使用语句表达式
- 6.3.4 内核中的语句表达式
- 6.4 typeof与container_of宏
- 6.4.1 typeof关键字
- 6.4.2 typeof使用示例
- 6.4.3 Linux内核中的container_of宏
- 6.4.4 container_of宏实现分析
- 6.5 零长度数组
- 6.5.1 什么是零长度数组
- 6.5.2 零长度数组使用示例
- 6.5.3 内核中的零长度数组
- 6.5.4 思考:指针与零长度数组
- 6.6 属性声明:section
- 6.6.1 GNU C编译器扩展关键字:__attribute__
- 6.6.2 属性声明:section
- 6.6.3 U-boot镜像自复制分析
- 6.7 属性声明:aligned
- 6.7.1 地址对齐:aligned
- 6.7.2 结构体的对齐
- 6.7.3 思考:编译器一定会按照aligned指定的方式对齐吗
- 6.7.4 属性声明:packed
- 6.7.5 内核中的aligned、packed声明
- 6.8 属性声明:format
- 6.8.1 变参函数的格式检查
- 6.8.2 变参函数的设计与实现
- 6.8.3 实现自己的日志打印函数
- 6.9 属性声明:weak
- 6.9.1 强符号和弱符号
- 6.9.2 函数的强符号与弱符号
- 6.9.3 弱符号的用途
- 6.9.4 属性声明:alias
- 6.10 内联函数
- 6.10.1 属性声明:noinline
- 6.10.2 什么是内联函数
- 6.10.3 内联函数与宏
- 6.10.4 编译器对内联函数的处理
- 6.10.5 思考:内联函数为什么定义在头文件中
- 6.11 内建函数
- 6.11.1 什么是内建函数
- 6.11.2 常用的内建函数
- 6.11.3 C标准库的内建函数
- 6.11.4 内建函数:__builtin_constant_p(n)
- 6.11.5 内建函数:__builtin_expect(exp,c)
- 6.11.6 Linux内核中的likely和unlikely
- 6.12 可变参数宏
- 6.12.1 什么是可变参数宏
- 6.12.2 继续改进我们的宏
- 6.12.3 可变参数宏的另一种写法
- 6.12.4 内核中的可变参数宏
- 第7章 数据存储与指针
- 7.1 数据类型与存储
- 7.1.1 大端模式与小端模式
- 7.1.2 有符号数和无符号数
- 7.1.3 数据溢出
- 7.1.4 数据类型转换
- 7.2 数据对齐
- 7.2.1 为什么要数据对齐
- 7.2.2 结构体对齐
- 7.2.3 联合体对齐
- 7.3 数据的可移植性
- 7.4 Linux内核中的size_t类型
- 7.5 为什么很多人编程时喜欢用typedef
- 7.5.1 typedef的基本用法
- 7.5.2 使用typedef的优势
- 7.5.3 使用typedef需要注意的地方
- 7.5.4 typedef的作用域
- 7.5.5 如何避免typedef被大量滥用
- 7.6 枚举类型
- 7.6.1 使用枚举的三种方法
- 7.6.2 枚举的本质
- 7.6.3 Linux内核中的枚举类型
- 7.6.4 使用枚举需要注意的地方
- 7.7 常量和变量
- 7.7.1 变量的本质
- 7.7.2 常量存储
- 7.7.3 常量折叠
- 7.8 从变量到指针
- 7.8.1 指针的本质
- 7.8.2 一些复杂的指针声明
- 7.8.3 指针类型与运算
- 7.9 指针与数组的“暧昧”关系
- 7.9.1 下标运算符[]
- 7.9.2 数组名的本质
- 7.9.3 指针数组与数组指针
- 7.10 指针与结构体
- 7.11 二级指针
- 7.11.1 修改指针变量的值
- 7.11.2 二维指针和指针数组
- 7.11.3 二级指针和二维数组
- 7.12 函数指针
- 7.13 重新认识void
- 第8章 C语言的面向对象编程思想
- 8.1 代码复用与分层思想
- 8.2 面向对象编程基础
- 8.2.1 什么是OOP
- 8.2.2 类的封装与实例化
- 8.2.3 继承与多态
- 8.2.4 虚函数与纯虚函数
- 8.3 Linux内核中的OOP思想:封装
- 8.3.1 类的C语言模拟实现
- 8.3.2 链表的抽象与封装
- 8.3.3 设备管理模型
- 8.3.4 总线设备模型
- 8.4 Linux内核中的OOP思想:继承
- 8.4.1 继承与私有指针
- 8.4.2 继承与抽象类
- 8.4.3 继承与接口
- 8.5 Linux内核中的OOP思想:多态
- 第9章 C语言的模块化编程思想
- 9.1 模块的编译和链接
- 9.2 系统模块划分
- 9.2.1 模块划分方法
- 9.2.2 面向对象编程的思维陷阱
- 9.2.3 规划合理的目录结构
- 9.3 一个模块的封装
- 9.4 头文件深度剖析
- 9.4.1 基本概念
- 9.4.2 隐式声明
- 9.4.3 变量的声明与定义
- 9.4.4 如何区分定义和声明
- 9.4.5 前向引用和前向声明
- 9.4.6 定义与声明的一致性
- 9.4.7 头文件路径
- 9.4.8 Linux内核中的头文件
- 9.4.9 头文件中的内联函数
- 9.5 模块设计原则
- 9.6 被误解的关键字:goto
- 9.7 模块间通信
- 9.7.1 全局变量
- 9.7.2 回调函数
- 9.7.3 异步通信
- 9.8 模块设计进阶
- 9.8.1 跨平台设计
- 9.8.2 框架
- 9.9 AIoT时代的模块化编程
- 第10章 C语言的多任务编程思想和操作系统入门
- 10.1 多任务的裸机实现
- 10.1.1 多任务的模拟实现
- 10.1.2 改变任务的执行频率
- 10.1.3 改变任务的执行时间
- 10.2 操作系统基本原理
- 10.2.1 调度器工作原理
- 10.2.2 函数栈与进程栈
- 10.2.3 可重入函数
- 10.2.4 临界区与临界资源
- 10.3 中断
- 10.3.1 中断处理流程
- 10.3.2 进程栈与中断栈
- 10.3.3 中断函数的实现
- 10.4 系统调用
- 10.4.1 操作系统的API
- 10.4.2 操作系统的权限管理
- 10.4.3 CPU的特权模式
- 10.4.4 Linux系统调用接口
- 10.5 揭开文件系统的神秘面纱
- 10.5.1 什么是文件系统
- 10.5.2 文件系统的挂载
- 10.5.3 根文件系统
- 10.6 存储器接口与映射
- 10.6.1 存储器与接口
- 10.6.2 存储映射
- 10.6.3 嵌入式启动方式
- 10.7 内存与外部设备
- 10.7.1 内存与外存
- 10.7.2 外部设备
- 10.7.3 I/O端口与I/O内存
- 10.8 寄存器操作
- 10.8.1 位运算应用
- 10.8.2 操作寄存器
- 10.8.3 位域
- 10.9 内存管理单元MMU
- 10.9.1 地址转换
- 10.9.2 权限管理
- 10.10 进程、线程和协程
- 10.10.1 进程
- 10.10.2 线程
- 10.10.3 线程池
- 10.10.4 协程
- 10.10.5 小结
- 参考文献
展开全部
出版方
电子工业出版社
电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。