VxWorks 代码分析 1

由于项目关系,有幸接触到了 VxWorks 的源代码,于是带着膜拜的心态开始阅读并分析其源代码,并将分析的结果记录在这里。我分析的版本是 VxWorks 6.7。

网上找到的资料不少是针对 VxWorks 5.x 的,和旧版比起来,VxWorks 6.x 增加了对多核硬件(SMP)的支持,并且加入了实时进程(RTP),可以开发用户态的应用程序。

文件组织结构

假设 VxWorks 开发套件安装在 C:\WindRiver,那么 VxWorks 6.7 的源代码位于 C:\WindRiver\vxworks-6.7\target。其中有如下子目录:

  • config:这个目录中包括所有的 BSP
    • comps/VxWorks:包含系统默认的组件定义文件(CDF)
    • comps/src:这个目录下包含 configlettes,也就是一些短小的配置代码
  • h:VxWorks 内核头文件
    • private:私有头文件,只有 src 中的代码能够访问
    • make:Makefile 片段文件,这些文件会被各个工程的 Makefile 中引用
    • tool:包含与工具链相关的 Makefile 片段,以及链接脚本
  • src:VxWorks 内核的源文件
  • lib:这个目录保存编译生成的内核库(单核版本)
  • lib_smp:这个目录保存编译生成的内核库(多核版本)
  • usr:所有用户态相关的文件都放在这里(RTP)
    • h:用户态代码使用的头文件
    • src:用户层库的源文件
    • lib:保存编译生成的用户库

内核库,用户库

VxWorks 系统的编译是分两步进行的,首先是把 VxWorks 代码编译成静态链接库,称作内核库,保存在 liblib_smp 目录下。接下来是编译用户代码和 BSP 代码,并且与内核库一起链接,生成一个可执行的系统镜像。

内核库可以直接在 src 目录下运行 make CPU=PENTIUM TOOL=gnu 来构建,也可以在 Workbench 中创建 VSB 项目来构建。如果使用 VSB 项目,那么生成的内核库会位于 VSB 项目目录之下。后续在创建 VIP 项目时,可以选择使用 VSB 项目中的内核库,还是使用标准位置的内核库。

之所以将编译 VxWorks 的过程分为两步,一个原因是这可以加快 VIP 项目的构建速度,另一个原因则是用户可以在没有源代码的情况下使用 VxWorks 开发。用户可以创建 BSP 项目开发自己的版级支持包,也可以创建 VIP 项目,编写自己的内核应用程序,但是系统核心部分的代码是不变的。因此首先把系统核心部分编译成静态链接库,这样在构建 BSP 项目时就可以直接链接已经生成的库。

用户层的代码也类似,首先把VxWorks提供的用户层代码(例如标准库、系统库)编译成用户库,放在 usr/lib 中,在编译 RTP 项目时再进行链接。用户库可以通过在 usr/src 目录下执行 make CPU=PENTIUM TOOL=gnu 命令来构建。

内核库可以使用 VSB 中的版本,但是用户态的程序只能链接 usr/lib 下的静态库。

组件

VxWorks 是一个可定制的操作系统,在 VIP 项目中,用户可以修改 Kenrel Configuration,选择哪些组件添加到内核中。