迅为嵌入式Linux学习笔记1——框架学习法
知识体系
- C语言
- 数字电路基础(单片机)
- ARM体系结构
- 硬件设计(ARM接口技术)
- Linux系统与管理
- Linux系统开发
- Linux驱动开发
- BootLoader(UBOOT)
- QT和C++
- Android系统和JAVA
UBOOT学习框架
入门级
- 了解UBOOT是首先执行的片外程序
- UBOOT的主要任务是引导Linux内核启动
- UBOOT生命周期,调用关系
- UBOOT编译、烧写及UBOOT命令
工程师级
- 启动过程简单分析
- 修改读秒时间
- 启动模式配置
- CMDLINE
- 启动时的电灯方法
专家级
- 源码分析
- 系统移植
- 增加功能及创新开发
Linux系统框架
- Linux大部分用C语言编写,少量汇编
- Linux是个大程序,函数库
- Linux提供了大量的资源(如:网络协议、多任务、内存管理、设备管理)
- Linux让产品开发更简单
- Linux架构越来越复杂,但使用越来越方便
- 使用的方便性是以复杂的架构为代价
应用和驱动
- 有了Linux,使软件开发人员分化成两类:应用于驱动
- 应用开发人员可以不懂底层驱动,应用开发只关注业务逻辑,而驱动开发关注硬件特性
- 应用程序通过‘系统调用’来使用内核资源
- 驱动是Linux内核的一部分,驱动的架构越来越复杂,目的是为了我们做的事情越来越少
内核态和用户态
- 用户态的程序不能直接访问硬件资源
- 内核态和用户态不仅是软件上的抽象,ARM处理器本身就在硬件上支持这两种状态
- ARM处理器的工作模式: 用户模式、系统模式、中断模式
- 应用直接访问硬件会触发异常终端
- 内核态和用户态的划分使系统更加安全,内核级有更高的特权
- 进一步理解“系统调用”,他是用户态调用内核态函数的方法,一般通过“软中断”的方式
- 软中断是软件指令触发,ARM有对应的指令,不同于按键等外部中断
Linux的文件系统
- 文件系统可以直观理解为Windows上的文件资源管理器,应用程序放在文件系统当中
- Linux启动后一定要挂接一个文件系统,但VxWorks,ucos等并不需要挂接
- 文件系统可大可小,通过构造文件系统可衍生QT, Ubuntu, Android等系统
- Linux的重要思想:一切皆文件
- 硬件的操作(串口、led、按键)都可归结为:read, write, open, close
### Linux初学者要搞清楚三个文件
- 引导程序(bootloader): uboot.bin / uboot.imx
- Linux内核镜像:zImage
- 文件系统镜像:system.img / rootfs.tar.bz2
- 初期很多工作都是围绕这三个知识点展开的(开发环境搭建、编译系统、烧写系统)
- 不同的系统文件名有差异
- 设备树文件(可看成Linux内核的一部分)
Linux应用程序编程
- 应用编程即Linux系统编程
- 基于Linux内核之上,基于“系统调用”或者库函数的编程
- Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用
- 系统调用由操作系统核心提供,运行于和心态;而普通函数调用由函数库或用户自己提供,运行于用户态
- “系统调用”在ARM系统中一般用“软中断”的方式来实现
- ARM处理器工作模式:用户模式、系统模式、终端模式
Linux应用编程框架
入门:
- 文件I/O基础
- 多线程多进程基础
- 网络socket编程
- 时间函数
进阶:
- 五种I/O模型
- 进程通信
- 线程同步
- 标准IO/文件共享dup/文件锁fcntl
系统调用
包括:
- 文件io
- 多进程
- 多线程
- 网络socket编程
- 时间函数、文件系统操作
- 用户管理、内存管理等
Linux文件I/O五种模型
- 阻塞
- 非阻塞
- 信号
- 多路复用
- 异步
Linux多进程
- 多进程是多任务在Linux上的具体实现,多任务是操作系统的基本功能
- 进程的三种状态:就绪、阻塞、运行
多进程使用fork(),分岔;进程间通信方式:
- 管道(匿名管道和命名管道)
- 信号
- 信号量
- 消息队列
- 共享内存
- 套接字
Linux多线程
- 单个进程内可以运行多个线程,线程是操作系统时间片调度的最小单位
- 每个线程可使用进程的全局变量
- 线程生成函数:pthread_create()
- 线程同步(共用资源,合理分配资源的方式):互斥锁、条件变量、读写锁、信号量
网络通信(socket编程)
网络通信是重点,很多操作系统的网络编程方式是一样的,都采用了socket方式。
Linux驱动开发
驱动演进历史:
时间 | 架构 | 系统版本 |
---|---|---|
2001 – 2004 | 原始架构 | V2.4 |
2004 – 2011 | 平台总线 | V2.6 |
2012 – 至今 | 设备树 | V3.1以后 V3.x |
- 总体上讲,产品开发越来越方便
- 架构越来越复杂,但使用越来越简单,开发工作量减少
Linux驱动的原始架构(Linux V2.4)
- “设备节点”,即设备文件(/dev/xxx),它是上层应用和底层驱动的桥梁
- Linux:设备即文件(read, write)
- 主设备号,次设备号,mknod()
- 结构体 file_operations(函数指针)
- register_chdev() – 系统注册
- 用户态 read()->sys_read()->vfs_read()->驱动read
- 原始架构依然很重要,里面的知识并没有被淘汰,而是被封装和继承了。
平台总线架构(platform)
- Linux2.6版本,封装了原始架构,更加抽象
- 引入了设备模型(sysfs),使得热插拔、电源管理得以加强
- 好处:做产品更省事省力
- 实现了BSP(板级支持包)和驱动的分离
Linux设备树
- 设备资源独立了出来(arch/arm/mach-xxx/board-xxx.c),从C文件发展为DTS设备树脚本文件(arch/arm/boot/dts/xxx.dts)
- 换个板子,不需要编译Linux系统,只要换个设备树文件就好
- BootLoader参与传递设备资源(启动时需要把设备树文件传给内核)
Linux驱动演进的趋势
- 越来越先进易用,但内部架构越来越复杂
- “分离”,实际是一种模块化设计思路
- “分层”,Linux中应用很普遍,屏蔽了底层的细节,增加了易用性