导图社区 嵌入式操作系统
嵌入式开发必备知识与课程,该思维导图是对清华出版社嵌入式开发操作系统的核心整理。
编辑于2020-09-18 16:42:58嵌入式操作系统
第四章 MTD子系统
NOR Flash和NAND flash的区别与概念
Nor Flash特点是芯片内执行,程序可直接在芯片上运行
使用方便,储存和读写方式上与内存类似,读写速度高并支持片上运行与随机读写,非常适合嵌入式系统的小容量储存
NAND Flash要将程序拷贝至内存中运行
MTD概念
memory technology device 内存技术设备 是用于访问memory设备的Linux子系统
mtd在硬件和上层之间提供了一个抽象的接口,目的是为了使新的memory设备的驱动更加简单
MTD将文件系统与底层的flash储存器进行了隔离,使Flash驱动工程师无须关心Flash作为字符设备和块设备与Linux内核的接口
Flash设备驱动层次结构
设备节点
MTD设备层
MTD原始设备
硬件驱动层
Linux的常用工具
交叉工具链
arm-linux-objcopy(文件格式转换器)
arm-linux-ld(链接器)
arm-linux-gcc(编译器)
makefile工程管理工具
make的工作主要依赖于makefile文件
makefile文件描述了整个程序的编译,连接等规则
makefile的构成
规则
用于说明如何生成目标文件
变量
可以将重复出现的文件编成变量,$(obj)
怎么单独执行某一条规则
make后面加上某一条规则的目标
怎么执行全部规则
输入make命令即可
第三章 文件系统
文件系统的定义
是操作系统用于明确储存设备或分区上的文件的方法和数据结构
WINDOWS文件系统类型
FAT(File Allocation Table)
FAT32 多用于U盘
exFAT
NTFS(New Technology File System)
Linux文件系统类型
ext2
ext3
ntfs
嵌入式Linux文件系统(简答)
jffs2,yaffs,cramfs,romfs,ramdisk
文件类型
普通文件,-
目录文件,d
符号链接文件,l
块设备,b
字符设备文件,c
VFS(虚拟文件系统)
vfs是linux和unix文件系统中采用的一种技术机制,旨在一个操作系统中支持多个不同类型的文件系统
vfs提供上/下两类接口,上层接口是提供给用户使用,下层接口提供给真实的文件系统
第二章 Linux基础
设备驱动模型
驱动程序
使用设备文件调用硬件驱动,然后操作硬件
用户如何使用驱动程序
用户程序通过设备文件来使用驱动程序操作字符设备和块设备
在Linux中驱动程序就是内核模块
设备文件
Linux将所有外部设备看成一种特殊文件
设备文件放置位置
/dev
字符型设备驱动
驱动初始化
分配cdev
静态分配
struct cdev mdev;
动态分配
struct cdev *pdev = cdev_alloc()
初始化cdev
cdev_init()
注册cdev
cdev_add()
实现设备操作
驱动注销
cdev_del()
内核模块
为什么会有内核模块
如果将Linux内核的所有组件都编译进内核文件会占用内存过多,将一些组件编译成内核模块,在使用时动态添加
内核模块的特点
本身不被编译进内核文件
根据需求在内核运行期间动态的安装或卸载
安装/卸载
安装
insmod
卸载
rmmod
查看
ismod
gcc编译器
常用选项的功能
-o
确定可执行文件的名称,不给就是默认的a.out
-c
只编译,生成.o为后缀的目标文件
-g
产生调试工具gdb所必要的符号信息
linux常用命令
ls
cd
pwd
chmod
修改文件权限,后面跟3位八进制数
第五章 调试技术
gdb的使用和调试程序的流程
1,编译生成可执行文件,gcc -g test.c -o test
2,启动gdb,gdb test
3,设置断点,break main
4,运行程序,run
更多gdb命令
list(l),查看程序
b 函数名,在某函数入口处添加断点
b 行号,在指定行添加断点
break(b)文件名:行号,在指定文件的指定行添加断点
info break,查看所有设置的断点
delete 断点编号,删除断点
c,继续运行程序
p 变量名,查看指定变量值
set var=value 设置变量的值
q,退出gdb
n 单步运行程序,不进入子函数
s,单步运行程序,进入子函数
core dump
定义
核心转存,当程序在运行过程中发生异常,这时Linux系统可以把程序出错时的内存内容储存在一个core文件中,这种过程叫core dump
作用
主要用来应付段错误(segment falut)
访问空指针
栈溢出
数组访问越界
修改只读内存
内核调试技术
交叉调试(远程调试)
宿主机
上位机
调试器运行的平台
目标机
下位机
运行嵌入式软件的平台
嵌入式Linux调试技术
在线仿真器ice技术
JTAG技术
源程序模拟器技术
调试代理技术(KGDB)
利用打印消息调试
利用/proc文件系统调试
利用ioctl命令调试
KGDB
提供了一种使用gdb调试内核的机制
使用kjdb可以像调试普通的应用程序那样,在内核中进行,设置断点,检查变量值,单步跟踪程序运行等操作,使用kgdb调试,需要两台机器,一台作为开发机,另外一台作为目标机
两台机器之间通过串口或者以太网口相连,串口连接线是一根rs-232接口的电缆,在其内部两端的第二脚(TXD)与第三脚(RXD)交叉相连,第七脚(接地)直接相连
调试过程中被调试的内核运行在目标机上,gdb调试器运行在开发机上
在内核中,打上kgdb补丁,补丁的主要作用是在内核中添加一个调试stub,调试stub是一小段代码,提供了运行gdb的开发机和所调试内核之间的媒介,这种通讯方式以gdp串行协议进行通讯
第一章 内核
嵌入式操作系统分类
嵌入式非实时系统
嵌入式实时系统
嵌入式操作系统类型
VxWorks
Windows CE
Android
嵌入式Linux
μC/OS-II
嵌入式系统定义
一般定义
以应用为中心,以计算机技术为基础,软硬件可裁剪,功能,可靠性,成本,体积,功耗严格要求的专用计算机系统
IEEE定义
嵌入式系统是用于控制,监视,或者辅助操作机器和设备的装置
嵌入式开发模型-交叉开发
目标机
运行嵌入式软件的硬件平台
宿主机
执行编译,链接嵌入式软件的计算机
串口,网络,Jtag
嵌入式系统的特征
系统内核小
专用性强
系统精简
高实时性OS
嵌入式软件开发走向标准化
嵌入式开发需要开发工具和环境
嵌入式系统的基本组成
软件
硬件
Linux内核版本命名规则
主版本号.次版本号.修正号
主版本号和次版本号,标志着重要的功能变动
修正号表示较小的功能变更
次版本号为偶数数字,表示是个稳定版,如果是奇数数字,表示是一个测试版
Linux内核的功能模块(简答)
进程调度
控制系统中的多个进程对CPU的访问,使得多个进程在CPU中,微观串行宏观并行的执行
内存管理
允许多个进程安全的共享主内存区域,支持虚拟内存
核心功能为虚拟地址与物理地址的映射,物理内存的分配
虚拟文件系统
隐藏各种硬件的具体细节,为所有的设备提供统一的接口
分为逻辑文件系统和设备驱动程序
网络接口
提供对各种网络标准的存取和各种网络硬件的支持
分为网络协议和网络驱动程序
进程间通信
支持提供进程之间的通信
通信机制包括信号量,共享内存,管道等
内核的配置和编译(简答)
为什么要配置内核
Linux内核版本,有非常多的特性,如果用户想要使用一些新特性或想根据自己的系统量身定制一个更高效,更稳定的内核,就需要重新编译内核
配置内核的命令
make config
至于文本模式的交互式配置
make menuconfig
至于文本模式的菜单式配置
< >
表示不选择该功能
<M>
表示该功能作为模块进行编译
<*>
表示必须编译该功能
内核编译的命令
mak zImage
make bzImage
内核模块编译的命令
make modules
编译生成.ko文件
make modules_install
将.ko文件从各个文件夹中复制到/lib/modules 为打包做准备
内核初始化流程
Bootloader的定义和作用
在操作系统内核运行之前运行的一段小程序,
初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备
Bootloader的两种工作模式
启动加载
自主模式,即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入
Bootloader正常工作模式
下载
在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件,保存到目标机的RAM中,然后再被Bootloader写到目标机的flash类固态存储设备中
这种模式,通常在第一次安装内核和根目录文件系统,或者以后更新时使用
根文件系统目录
/etc/
储存重要的配置文件
/bin/
存储常用且开机时必须用到的执行文件
/sbin/
存储着开机过程中所需的系统执行文件
/lib/
储存/bin及/sbin的执行文件所需的链接库,以及Linux的内核模块
/dev/
存储设备文件
执行init程序
启动init之后系统就转入用户态的运行
init()函数在启动后是一个核心线程,但在转到执行init程序后,内核的init()就变成了init程序,状态也就转变成了用户态
这种转变靠execve函数来实现
嵌入式Linux系统的典型结构
图会画,在flash上的储存情况
四个部分
Bootloader
硬件初始化,驱动和内核加载
参数区
存放一些系统参数,并且通常这个区是没有文件系统,参数以原始数据的格式来存放
内核映像
Linux内核压缩镜像
解压后运行于内存,作为Linux操作系统
文件系统
压缩的文件系统
对内核解压并挂载,作为各种应用程序文件的主要载体