学好linux的基础:C语言(GNU C语言与GCC);硬件基础;熟悉操作系统内核代码,熟悉多线程和网络知识。分驱动开发(驱动程序模型即框架)和应用程序开发,目标是驱动开发
驱动开发特点:
不能使用标准C库(5M太大不适合嵌入式设备(1MB));
不像应用程序有操作系统守护,内核驱动程序出错不好排查。
应用程序可以动态申请和释放较大内存,而内核常驻内存固定(32位的8KB;64位的16KB).
多平台移植:应用程序靠API;而驱动靠虚拟机(类JAVA)。
嵌入式硬件平台:龙芯、MIPS/TI的OMAP /strongARM(ARM7/9/E/10/11/secur core,用的最多的是S3C2440
嵌入式开发环境的构建:
1 在WINDOWS上安装虚拟机:VM ware 或virtual PC(被微软收购后只支持有限的linux版本OS/2);
2设置共享文件夹:虚拟机和WINDOWS通过网络(保证网络良好)通讯的,所以先在WINDOWS下设置共享文件夹,然后在虚拟机中设置共享内容就可以了。
3 代码编写查看分析工具sourceInsight
四嵌入式系统:linux vxworks WINCE
4.1 linux内存分配:为每一个进程创建虚拟地址空间,同时设备驱动程序也需要内存分配。
4.2
4.2文件系统:支持所有格式的文件系统,每种文件系统都有特有的功能:ext2用来读写设备;ext3用来写日子,sysfs:用来显示设备、驱动、总线的一些信息。
4.3设备管理:各设备和CPU内存之间的交互
4.4网络设备:驱动负责收据包的收发,然后通过接口交给应用程序的进程(不负责具体的网络通信)
4.5目录:融入内核,增加配置最终编译进内核:
4.5.1:drive:包含各驱动
4.5.2:fs文件系统
4.5.3:内核配置:通过配置文件、工具/kconfig/makefile来完成,
- 常规配置:
- 模块配置:
- 块设备配置:硬盘调度器等
- 设备驱动:字符设备。块设备和网络接口设备
- 网络设备
- CPU类型特性
- 电源管理
- 总线配置
- 文件配置:根据介质类型容量和速度进行配置。为便于管理有统一的接口:虚拟文件系统VFS.存储介质:NORflash:片内执行适合1~4MB效率高(写入和擦除速度慢)。JFFS2:用在ecos或linux/uclinux;YAFFS:只适合NANDFLASH,速度快容量大占用内存小。内核驱动后先创建根文件系统(以FHS为标准的树形结构,可以用BUSYbox构建),同时又有不同分区(分区分别对应内核镜像文件,系统启动的所需的文件。)
字符设备:应用程序和驱动程序通过字符设备的参数(读写)进行数据交换。
并发程序的处理:自旋锁(忙闲)、信号量、完成量(线程间等待完成的信号)
异步事件的处理:阻塞(等待队列即返回前挂起)和非阻塞两种方式。中断(中断注册)和时钟机制(长短延时)
内存管理:驱动程序的良好运行依赖于内核正确的分配内存资源(Kmalloc和虚拟分配内存Vmalloc(为了解决内存碎片)按页分配(32位每页4K;64位的8K),高速缓存是对于不断申请和撤销内存操作建立一个内存池;IO空间的访问都是通过先申请资源然后通过虚拟内存映射后进行操作的。
设备驱动模型:通过设备驱动模型,驱动程序编写从而简单起来,三要素:总线(设备间通讯连接驱动程序也依附在总线上,有属性和方法)、设备(又有一个device的结构体来描述添加到驱动模型中)、驱动程序(只有子啊驱动程序中注册的设备才能使用),内核通过sysfs来映射驱动模型的关系。
平台设备模型:平台设备简言之就是CPU内置的功能设备入内置的RTC和ADC等,是为了更容易开发设备驱动。linux通过设备号(主设备号和子设备号)来标识设备,由于主设备号比较紧张所以一些混杂设备通过子设备号来标识。
I2C设备:分为设备层和总线层连个层次,并利用数字ID和设备对应的方法操作总线上的各个设备。