2 BSP与VXWORKS的关系以及它在整个系统中的地位?
3 BSP在系统中起的作用
VXWORKS的启动顺序和具体的处理器和硬件环境有关,一般的初始化包括:在内存中特殊的地方放置一段代码,这段代码在系统复位和上电的时候执行;将处理器置于一个特别的状态;初始化内存和内存地址;关闭中断;传递控制结构到另外的启动陷入代码;加载必须的VXWORKS段到内存当中去;在初始化VXWORKS内核之前将硬件置于静止状态。
有一些驱动是由BSP例程提供的,驱动定义了一些ISR(中断服务程序),这些ISR由BSP连接到某一个中断向量。由BSP提供,驱动来使用的一些偏移常量和一些访问宏。
4 BSP的组成
主要的BSP文件:头文件,源文件和MAKEFILE文件。与一个CPU板有关的文件都放在两个文件中,源文件就是那些C文件,与特定结构有关的文件是用汇编写的经过优化了的汇编代码。MAKEFIEL文件负责所有文件的编译和连接规则。继承文件由主要的BSP文件,驱动源程序文件和VXWORKS结构库中的模块组成。继承文件可分为一下几类:硬件初始化对象模块,VXWORKS启动对象模块,VXWORKS镜像和VXWORKS二进制符号表。一个完整的BSP将产生所有这些文件,最终用户在配置这些文件时可能还要重新创建这些文件。还有两个非标准的继承文件:如果镜像的文本段写保护被激活的时候,就要有一个文件来保证在内存当中,文本段和代码段部共享同一个内存页面。应为同一个内存页面的读写权限只有一个,而此时代码段和文本段的读写权限是不一样的,所以要分开来放。这个对象文件就是用来保证能做到这一点的。还有一个文件就是由另一个文件继承过来的ASCII文件。
5 BSP开发步骤
开发BSP应该采用一种渐进的方法:首先建立一个开发环境(下载路径,调试策略等等),编写内核运行之前的初始化代码,利用串口或者网口激活WDB代理和TORNADO工具,从最精简的VXWORKS内核开始,慢慢在系统上增加系统时钟和中断处理,直至在自己的硬件环境中所需要的所有功能,之后测试和编写文档。
6 vxworks的镜像类型
镜像类型有三种,可加载型镜像,基于ROM型镜像和ROM驻留型镜像。可加载型镜像是有BOOT加载近内存的,BOOT是一个单独的VXWORKS应用程序,它其实是烧在ROM或者FLASH上的一段代码。基于ROM的镜像也是要加载到内存种去的,不过它的加载是它自己完成的。ROM驻留型镜像只是把数据段和BSS段加载到内存种去运行。代码段还留在ROM中运行。
7 vxworks镜像的组成
vxworks镜像由文本段,数据段和BSS段组成,文本段相当于代码段,是由一些指令组成的,数据段就是由一些初始化过的全局和静态变量组成。BSS段也是由全局变量和静态变量组成,只不过他们都没有经过初始化。
8 vxworks镜像的启动顺序
虽然vxworks的镜像有好几种类型,不过他们的启动顺序还是一样的。系统加电后,处理器会跳到BOOT陷入代码处去执行,这段代码的作用主要有:关中断,初始化目标机内存,加载镜像到内存,跳转到使目标机处于静止状态的代码处运行。下面分别叙述每种镜像的启动顺序。
1 可加载型镜像
BOOT陷入代码首先执行,加载文本段和数据段到内存中,如果BOOT代码是压缩的,加载时解压,如果没压缩,就直接加载,如果BOOT是ROM驻留的,就只加载数据段。然后BOOT开始运行,加载VXWORKS镜像,跳到VXWORKS镜像开始点运行。系统的初始化代码静态连接到已经加载的VXWORKS镜像,完成系统初始化。在这个过程中,一开始BOOT用的那段内存空间在VXWORKS镜像执行后,还要被VXWORKS回收。然后再次分配利用。执行的流程图如下:
这里注意几个地址:
LOCAL_MEM_LOCAL_ADRS是RAM的起始地址。
RAM_LOW_ADRS是VXWORKS镜像加载到内存中的开始地址,也是镜像中文本段的开始地址。
FREE_RAM_ADRS是VXWORKS镜像在内存中布局的结束地址,这个地址同时也是系统内存或者目标服务器的内存开始地址。
RAM_HIGH_ADRS是BOOT的开始地址,也是BOOT文本段的开始地址,如果BOOT是ROM驻留型的镜像,则这个地址相应的就是数据段的开始地址。
2 ROM驻留型镜像的启动顺序
BOOT陷入代码加载VXWORKS镜像到内存中,数据段和文本段都加载,然后跳转到VXWORKS镜像中初始化代码处运行。完成系统初始化。内存布局见下图:
3 ROM驻留型镜像
BOOT陷入代码开始执行,只加载VXWORKS镜像的数据段到内存,程序跳转到VXWORKS镜像初始化代码处运行,完成系统的初始化。内存布局见下图:
9 VXWORKS初始化代码做的工作
在完成VXWORKS镜像的加载后,就跳转到VXWORKS初始化代码处运行,这段代码做的工作有:
l 将系统硬件环境置于一个静止状态
l 初始化并且开始WIND内核的运行
l 开始一个完成系统初始化的任务
可加载型镜像并部认为自己是由BOOT加载的,因此由BOOT陷入代码做的初始化工作在VXWORKS的初始化代码中还会再重复做一遍。VXWORKS中的系统初始化任务会安装驱动和ISR,创建设备和 初始化I/O体统,一般这个任务在结束之前,会产生一个用户程序的初始化任务。
10 TORNADO的目录结构
TORNADO是一些模块的集合,模块的目的在于可移植性,灵活性和系统的易维护性。这些模块之间的依赖性被设计为最小。主要模块有:
l 主机支持包(HSP),与主机有关的TORNADO组件。
l 一般的目标无关VXWORKS,主要有WIND内核和I/O模块等
l 结构模块,提供对目标机处理器的支持。
l BSP 提供对目标硬件的支持
l WDB代理,提供主机上的工具和目标机的通信。
各个模块之间的关系图:
总体目录树结构:
主机目录树结构:
目标机目录树结构:
11 与BSP有关的一些文件
系统上电时执行的代码处于config目录底下,一般的驱动代码可提供为多个BSP使用,BSP驱动代码是提供给某一个特定硬件使用的,别的BSP一般不可使用。WRS提供的一般的驱动代码处于系统../src/drv 和 ../h/drv.子目录底下,不是由WRS提供的一般驱动代码处于<bspName>目录下或者它的子目录下。
12 与BSP有关的一些硬件
l 特定的体系结构,比如cache MMU 中断控制器等等。
l 总线 ,总线控制器和总线桥
l 内存,内存控制器和芯片
l 设备,架构,总线
对这些硬件提供的支持有初始化和访问。
13 BSP和CPU
管理CPU的组件是TORNADO组件的一部分。一些CPU结构和BSP开发相关。比如MMU,中断处理,浮点支持和CACHE缓存。这些结构在启动VXWORKS系统初始化的时候非常重要。
14 MMU内存管理单元
内存管理单元控制内存的访问,包括:
l 分配和释放内存
l 解决CACHE一致性问题
l 对内存的写保护
l 虚拟内存交换
l 分页和分段机制
l 垃圾回收
MMU要求一个驻留于内存的映射表,标明物理内存地址和虚拟内存地址之间的映射关系。
MMU由于访问延时和内存开销,对于实时系统来说可能不是太合适。
MMU硬件实现可能和CPU在同一个集成电路板上。
VXWORKS启动的时候,MMU功能是关闭的,直到WIND内核启动后才打开,启动过程中还要建立映射表。这个映射表在VXWORKS的任务中并不是任务上下文的一部分。任务不会处于虚拟内存当中,默认的虚拟内存映射是全局和平面的。
15 CACHE缓存
cache是CPU和内存之间的一个接口,大部分现代处理器都支持指令缓冲和数据缓存。提高了访问数据的速度,CACHE工作的模式有两种:
l 直写方式-数据直接由处理器写入到CACHE中,然后再更新主存。
l COPYBACK-数据只写入到CACHE中。
CACHE在板上的位置,一级缓存和CPU同处于一个ASIC,二级缓存在CPU的ASIC外部。二级缓存后面,是扩展的一级缓存。由特殊的总线和CPU相连。有一些体系结构的CPU提供了专门用来访问CACHE的指令,如果支持CACHE,则CPU每次访问内存的时候总是先查看CACHE,如果数据在CACHE中存在,则命中,不访问内存,如果不存在,则访问内存。
CACHE一致性问题:理想情况下,CACHE是内存的写照,两者是一致的。总线控制器和DMA控制器更新内存的时候可能不更新CACHE。CPU在更新CACHE的时候可能不更新内存。造成两者的不一致。因此为了保持一致性,更新一个的同时必须更新另外一个,或者通过硬件电路的检测来自动更新。这是最快的方法。
在启动VXWORKS的时候,在系统处于一个静止状态之前,CACHE一直是关闭的,配置好CACHE模式后,在WIND内核启动前,打开CACHE。当MMU打开的时候,CACHE的管理和控制是由MMU库来完成的。
[/replyview]
[/replyview][/replyview] [align=right][color=#000066][此贴子已经被作者于2005-1-13 19:04:29编辑过][/color][/align]