- Vxworks 介绍
VxWorks 是专门为实时嵌入式系统设计开发的操作系统内核,为程序员提供了高效的实时多任务调度、中断管理,实时的系统资源以及实时的任务间通信。在各种 CPU 平台上提供了统一的编程接口和一致的运行特性,尽可能的屏蔽了不同 CPU 之间的底层差异。应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于VxWorks 操作系统的应用程序可以在不同 CPU平台上轻松移植。
VxWorks是一种功能强大而且比较复杂的操作系统,包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分。VxWorks 只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。所以,仅仅依靠人工编程调试,很难发挥它的功能并设计出可靠、高效的嵌入式系统,必须要有与之相适应的开发工具。TornadoII就是为开发 VxWorks 应用系统提供的集成开发环境,TornadoII中包含的工程管理软件,可以将用户自己的代码与 VxWorks 的核心有效的组合起来,可以按用户的需要裁剪配置VxWorks 内核;vxSim原型仿真器可以让程序员不用目标机的情况下,直接开发系统原型,作出系统评估;功能强大的 CrossWind 调试器可以提供任务级和系统级的调试模式,可以进行多目标机的联调;优化分析工具可以帮助程序员从多种方式真正地观察、跟踪系统的运行,排除错误,优化性能。
- Vxworks下文件系统与块设备框架
VxWorks的文件系统并不是直接与块设备驱动交互,VxWorks6.8以后在块设备驱动之上封装了XBD(extend block device)层,应用软件的读写请求通过文件系统提供的标准文件存取控制接口访问XBD层,并由XBD层对块设备发起读写请求,块设备根据接收到的读写命令调用自身的读写驱动函数,操作硬件。
- SATA驱动和dos文件系统源代码的操作流程
- dosFs文件体统初始化
1.1 dosFs 文件系统上电后首先进行初始化操作(dosFsLibInit),对dos文件系统注册接口函数,完成与上层IO子系统之间的衔接工作。
1.2 其次还会进行FAT 文件系统初始胡,格式化等一系列初始化动作如图所示
2. 1是纯粹的的dosFs文件系统的初始化,我们找到调用它的地方是,usrDosfsInit,可以看到调用玩dosFsInit 之后会有fsmProbeInstall (dosFsDiskProbe, dosFsMonitorDevCreate);,这个动作,这里边便会有和底层驱动建立链接的举动,但现在先不看这两个函数,再退回到调用dosFsInit的地方。
3. 调用 dosFsInit就已经到了系统刚上电最初运行的函数中usrRoot了,usrRoot 中同时会对XBD层进行初始化,这里不对XBD层进行详细说明
XBD初始化完后紧接着会有 fsMonitorInit()初始化函数,看该函数内容大致乐意看到初始化了,fsmProbeList,fsmNameList这两个list ,并且注册了关于XBD的事件处理函数。
4. usrRoot中还能看到对SATA的初始化函数如下
首先usrAtaInit进行了ata设备初始化,此处调用了函数ataDrv,该函数完成了stata设备的初始化动作。
5. stata设备初始化完毕后,调用usrAtaConfig,主要做了两件事情。、
5.1 调用fsmNameInstall,向文件系统添加SATA设备名,添加到fsmNameList列表中
5.2 调用ataXbdDevCreate将SATA底层驱动接口函数注册到XBD层
ataDevCreate完成成 BLK_DEV 结构初始化以及所有其他准备工作。当 ataBlkDevCreate 函数返回后,底层块设备驱动以及块设备本身将处于正常工作状态,等待上层设备操作请求
BLK_DEV结构非常重要,。 BLK_DEV 结构是文件系统层与底层块设备驱动层之间信息交互的唯一“媒介“,即 BLK_DEV 结构必须包含文件系统层需要底层块设备驱动提供的所有信息。从块设备实际使用的角度来看,这些信息必然包含:(1)块设备数据写入函数;(2)块设备数据读取函数;(3)块设备控制函数(如复位块设备,重新定位磁头位置);(4)块设备本身关键参数信息,如总扇区数(或总块数),磁道数,磁头数,每磁道扇区数,对于非硬盘块设备,还需提供每个块的字节数(对于硬盘块设备,一个块通常被称为扇区,固定为 512字节)
6. 经过ataDevCreate之后,底层的SATA块设备驱动就已经准备好,再回过头看2中的dosFsMonitorDevCreate这个函数,dosFS在初始化之后,掉用dosFsMonitorDevCreate这个函数,进一步调用dosFsDevCreate这个函数
dosFsDevCreate函数实现功能如下:
(1)完成 dosFs 文件系统与底层块设备驱动之间的衔接工作,具体上是通过传递一个由底层驱动初始化的 BLK_DEV 结构给 dosFs 中间层完成的,正如前文对 rawFs 的讨论,BLK_DEV 结构包含着底层块设备驱动的关键信息(如块设备读写函数地址),该结构将在下一节进行详细讨论;
(2)完成块设备节点的创建和向系统设备列表注册的工作,这个工作完成后,底层块设备就对用户可见了,用户可以使用标准接口函数对块设备进行操作,如创建一个新的文件,写入文件数据等等;
(3)对 dosFs 文件系统本身的一些参数进行初始化,如最大文件句柄数,文件系统一致性检查级别。
dosFsDevCreate 函数调用完成后,应用层程序就可以对底层块设备进行操作了。但是在操作方式上不同于字符设备和基于 rawFs 的块设备,字符设备和基于 rawFs 的块设备是将整个设备作为一个单一的个体被读写和控制,而基于 dosFs 的块设备将以文件和目录层次性的视图提供给用户层,所以用户只是对块设备中一个区域进行操作,从上层来看,就是对某个文件或者目录的操作。此时用户程序不再是打开整个设备,而是打开存储在底层块设备上的某个文件或者目录。
dosFsDevCreate 函数中创建的块设备节点表示的是整个块设备,如“/dosFsBlk”,以一个用户 open 函数调用为例,如下代码所示。
int fd;
fd=open(“/dosFsBlk/greet.txt”, O_RDWR, 0);
以上是VxWorks下文件系统与SATA设备驱动整个流程的衔接过程,具体代码细节还需深入源代码去看