众所周知,VxWorks 是美国Wind River System 公司( 简称风河公司,即 WRS 公司)推出的一个实时操作系统。Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似Microsoft Visual C,但是提供了更丰富的调试、仿真环境和工具。

Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于Linus Torvalds。

Linux与vxWorks的主要区别

1、内核结构
Linux VxWorks
宏内核 微内核

微内核(英文中常译作micro kernel)

是一种只提供必要服务的操作系统内核;这些必要的服务包括任务管理、中断处理、内存管理等。其他服务,如文件管理、网络支持等通过接口连到微内核。

在微内核中,用以完成系统调用功能的程序模块通常只进行简短的处理,而把其余工作通过消息传递交给内核之外的进程来处理。在典型情况下,每个系统调用程序模块都有一个与之对应的进程,微内核部分经常只不过是一个消息转发站,这种方式有助于实现模块间的隔离。这种内核设计的最根本思想就是要保持操作系统的内核尽可能小,因为内核是直接与计算机硬件相关的,内核越小,就越便于在不同的硬件系统间进行移植。

微内核结构的另外一个优点是,可以使不需要的模块不加载到内存中,因此,微内核就可以更有效地利用内存。

微内核具有很好的扩展性,并可简化应用程序开发。用户只运行他们需要的服务,这有利于减少磁盘空间和存储器需求。

宏内核(英语:Monolithic kernel)

又称单核心,是操作系统核心架构的一种,除了基本的服务,内核还包括文件系统、网络协议等。此架构的特性是整个核心程序都是以核心空间(Kernel Space)的身份及监管者模式(Supervisor Mode)来运行。

宏内核的内部可被分为若干模块(或者是层次或其他),但在运行时,它是一个独立的二进制大映像。模块间的通信不是通过消息传递,而是通过直接调用其他模块中的函数来实现的。

现在多数采行宏内核架构设计的操作系统,如OpenVMS、Linux、FreeBSD、以及Solaris等,在运作运行阶段中,以动态方式来加载(Load)、卸载(Unload)可运行的模块,不过这些模块是属于二进制代码的层次,或称镜像层次,而非核心架构的层次。即使宏内核进行模块化转化,也不会与微核心或混核心架构的核心产生区分上的混淆,因为微核心、混核心的模块是属于系统架构的层次。

就实务上,动态加载/卸载模块的作法,等于是用一种较简易的方式来弹性管控运行中的操作系统核心,若没有动态加载/卸载机制,操作系统的核心想要进行任何的调整、变换,都必须重启才能达成。因此模块化是必然且必要的,如此才能让核心功效轻松地扩展、延伸,此外也能适时减轻硬件的运行运作负担。

2、运行模式
Linux VxWorks
保护模式 实模式

VxWorks上应用程序运行在“实模式”下,无用户模式和内核模式之分;

Linux则是采用“保护模式”,用户进程、线程运行在用户模式下,内核线程运行于内核模式。

实模式、保护模式,从寻址方式来说,CPU中的IP(EIP)中存放虚地址,把虚地址转换到物理地址,各个模式有各自的转换方式。

实模式,是指寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。

保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。

内核模式操作的一种高特权模式,其中的程序代码能直接访问所有内存(包括所有的用户模式进程和应用程序的地址空间)和硬件。也称为“管理员模式”、“保护模式”或“Ring 0”。 内核模式又称系统模式,在这种模式下,监控程序可以执行特权指令,而且受保护的内存区域也是可以访问的。

如果再细致地对此进行分类:它又可以被分为单内核模式和微内核模式两种。 单内核模式代码结构紧凑、执行速度快,但是缺乏层次;微内核正好相反。 单内核模式的代表如Linux;微内核模式的代表如Windows。

3、内存访问和内存保护
Linux VxWorks
虚拟存储 实存储

VxWorks的内核采用实存储管理方式,所有任务运行于同一物理地址空间,用户程序直接操作物理地址,不能直接地提供内存保护,不能防止错误蔓延。一个模块崩溃,将导致整个系统崩溃。更换组件或者升级只能重启系统。

Linux的内核采用虚拟存储管理方式,用户具有独立的地址空间,用户进程只能访问本进程的虚拟空间,提供了内存保护,可以防止错误蔓延。进程间内存隔离,一个进程故障崩溃,其他进程不受影响;进程和核心隔离,进程异常地址访问核心不受影响。统一的内存管理,按需分配。

Linux & VxWorks Memory difference

4、执行单元
Linux VxWorks
进程、线程 任务

任务,是代码运行的一个映象,从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、IO设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行(宏观上如此)。VxWorks内核使任务能快速共享系统的绝大部分资源。 在VxWorks6.4中,进程是指Rtp,进程包含任务,任务是调度的最小单元。

进程(有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈以及其它记录其运行轨迹的辅助数据。操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间。也因为各个进程有自己的内存空间、数据栈等,所以只能使用进程间通讯(IPC),而不能直接共享信息。

线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境。它们可以想像成是在主进程或“主线程”中并行运行的“迷你进程”。

线程有开始,顺序执行和结束三部分。它有一个自己的指令指针,记录自己运行到什么地方。线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步。

一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便地共享数据以及相互通讯。线程一般都是并发执行的,正是由于这种并行和数据共享的机制使得多个任务的合作变为可能。实际上,在单CPU 的系统中,真正的并发是不可能的,每个线程会被安排成每次只运行一小会,然后就把CPU 让出来,让其它的线程去运行。在进程的整个运行过程中,每个线程都只做自己的事,在需要的时候跟其它的线程共享运行的结果。

当然,这样的共享并不是完全没有危险的。如果多个线程共同访问同一片数据,则由于数据访问的顺序不一样,有可能导致数据结果的不一致的问题。这叫做竞态条件(race condition)。幸运的是,大多数线程库都带有一系列的同步原语,来控制线程的执行和数据的访问。

另一个要注意的地方是,由于有的函数会在完成之前阻塞住,在没有特别为多线程做修改的情况下,这种“贪婪”的函数会让CPU 的时间分配有所倾斜。导致各个线程分配到的运行时间可能不尽相同,不尽公平。

5、请求内核服务方式
Linux VxWorks
系统调用,更安全 函数调用,更快

函数调用:计算机编或运行时,使用某个函数来完成相关命令。C语言中,函数调用的一般形式为:函数名(实际参数表)对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。

在C语言中,可以用以下几种方式调用函数:

1. 函数表达式:

函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。

2. 函数语句:

函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",&b);都是以函数语句的方式调用函数。

3. 函数实参:

函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。

函数调用的实际(汇编)实现

指针寄存器EBP和ESP

EBP是所谓的帧指针,指向当前活动记录的上方(上一个活动记录的最下方)

ESP是所谓的栈指针,指向当前活动记录的最下方(下一个将要插入的活动记录的最上方)

这两个指针的值规定了当前活动记录的位置

参数传递

将函数参数压栈:mov eax,dword ptr [n] ;(n为参数变元)

push eax

函数调用分配空间

函数调用将执行如下操作:

  1. 将帧指针压入栈中:push ebp
  2. 使得帧指针等于栈指针:mov ebp,esp
  3. 使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态:sub esp,0CCh

注意:0CCh为0xCC,随着具体函数的不同而不同。

传入保存状态

    push ebx ;保存ebx寄存器的值
    push esi ;保存esi寄存器的值
    push edi ;保存edi寄存器的值

装入edi

    lea edi,[ebp-0CCh] ;0cch是当前活动记录的大小。
    EDI是目的变址寄存器。

恢复传入的保存状态

    00411417 pop edi
    00411418 pop esi
    pop ebx

栈指针上移,恢复空间

add esp,0CCh

函数返回释放空间

当函数返回时,编译器和硬件将执行如下操作:

  1. 使栈指针等于帧指针: mov esp,ebp
  2. 从栈中将旧的帧指针弹出: pop ebp
  3. 返回:ret

系统调用:由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。

Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的的函数。主要包括如下几部分:

1、进程控制
如:fork 创建一个新进程   clone 按指定条件创建子进程 等
2、文件系统控制
a)文件读写操作 如:open 打开文件   creat 创建新文件 等 b)文件系统操作 如:chdir 改变当前工作目录  chmod 改变文件方式 等
3、系统控制
如:reboot 重新启动 sysinfo 取得系统信息 等
4、内存管理
如:mmap 映射虚拟内存页 msync 将映射内存中的数据写回磁盘 等
5、网络管理
如:getdomainname 取域名   setdomainname 设置域名 等
6、socket控制
如:socketcall socket系统调用   socket 建立socket 等
7、用户管理
如:getuid 获取用户标识号   setuid 设置用户标志号 等
8、进程间通信
如:semctl 信号量控制   semget 获取一组信号量   semop 信号量操作 等
6、实时性
Linux VxWorks
软实时 硬实时

实时操作系统 (Real-time OS) 是相对于分时操作系统 (Time-Sharing OS) 的一个概念。在一个分时操作系统中,计算机资源会被平均地分配给系统内所有的工作。在分时系统中,各项任务需要花多长时间来完成,这一点并不重要;而在一个实时操作系统之中,最关注的是每个任务在多长时间内可以完成。简单地说,实时和分时操作系统最大的不同在于 “时限(deadline)”这个概念。

实时操作系统的特点:

  1. 异步事件的响应
  2. 切换延迟和中断延迟时间的确定
  3. 优先级中断和调度
  4. 抢占式调度
  5. 内存锁定
  6. 连续文件
  7. 同步/li>

从上述区别中可以看出,在实时操作系统中,系统必须在特定的时间内完成指定的应用,具有较强的“刚性”,而分时操作系统则注重将系统资源平均地分配给各个应用,不太在意各个应用的进度如何,什么时间能够完成。不过,就算是实时操作系统,其“刚性”和“柔性”的程度也有所不同,就好像是系统的“硬度”有所不同,因而有了所谓的“硬实时(hard real-time)”和“软实时 ( soft real-time)”。

硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。 而软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,例如在网络中仅仅是轻微地降低了系统的吞吐量。

硬实时与软实时之间最关键的差别在于,软实时只能提供统计意义上的实时。例如,有的应用要求系统在95%的情况下都会确保在规定的时间内完成某个动作,而不一定要求100%。在许多情况下,这样的“软性”正确率已经可以达到用户期望的水平。比如,用户在操作DVD播放机时,只要98%的情况都能正常播放,用户可能就满意了;而发射卫星、控制核反应堆的应用系统,这些系统的实时性必须达到100%,是绝对不允许出现意外的。

其他解释:

硬实时, 顾名思义是由硬件、即计算机主机板上的硬件 - 集成电路,如CPU, BIOS等来进行实时控制。也就是说将CPU的运算周期(CPU cycle)按照事先设定的标准,如平均分配(所谓的Time slice)、或按某些硬件优先权分配,等等,来防止某个硬件夺去整个系统的反应时间, 让各个外接部件, 特别是输入输出设备等, 能够得到系统的及时反馈,也就是说,某个外接部件在多长的时间里能够得到系统的反馈,得到CPU完成计算的时间,是可以得到保证的, 这也就是所谓的deterministic real time。 其实,真正的实时系统不仅需要硬件的支持,还需要专门的实时操作系统, 所以一般这种都是专门的设备,如工业自动化控制,军用电子设备等。它们的操作系统都是专门做的。

软实时指的是在对非实时的操作系统,比如桌面计算机操作系统,如Windows, 进行某些改动,来达到近乎实时的效果,但是严格来说还不是真正的实时,只是接近实时而已。它的做法是用一个专门的软件部件,代替桌面计算机操作系统中的进行控制的功能,如 process control和kernel,以达到一个接近于能够准时得到系统反馈和完成计算的反应速度。

著名的硬实时系统包括:

VxWorks,rtems, rtlinux, ThreadX, QNX,Nucleus等

软实时系统包括:Linux2.6.X, winCE

在学术文献中的解释:

1、硬实时是指那些对时间要求非常严格的系统一旦系统不能满足程序对时间的要求的话系统就要崩溃

软实时是指那些对时间要求不是很严格的系统一旦系统不能满足程序对时间的要求也不至于引起系统的崩溃

2、硬实时是指任务必须在一定的时间内,或者某个时间点前完成

软实时则指对任务的完成时间有要求,但如果任务偶尔没有在规定的时间内完成,系统仍能正常运行

3、硬实时是指这种时限的要求是绝对的,任何一个实时任务都能够在时限之前完成

软实时的要求就没有这么严格,允许偶尔有实时任务不满足时限的要求

4、软实时是指统计意义上的实时,一般整体吞吐量大或整体响应速度快,但不能保证特定的任务在指定的时间内完成

硬实时则是指时间要求必须被严格保证的实时

7、文件系统差异,主要讲Linux方面:
  • 文件共享

多进程可以同时访问一个文件,文件会在内存中存在一个映像

一个进程修改,其他进程都可能更新,特别是通过map方式

  • 文件按需加载

如果系统都只访问文件一个片段,最小情况下内存只有一段文件片段的buffer

我们通常使用的fopen/fread/fwrite/fseek/fclose等接口都是上图中的buffer层接口,该层是在io层基础上封装了一个缓冲,大小是1K byte。

下面就是io管理层,该层管理所有VxWorks的设备,文件系统作为一个设备也挂接在io层中,除了文件系统外,还有串口/socket等都是VxWorks的设备。 在这层统一使用函数open/read/write/close/ioctrl/lseek等接口统一操作。这层内部实现上,使用设备管理表来统一管理各个设备。

VxWorks的设备管理表中记录了各个设备的设备号、设备名、驱动指针。devs命令列出了设备号和设备名。sockte、串口设备和文件系统等都是VxWorks的设备。VxWorks的其他设备也是作为文件来管理的。

Linux文件系统简介:

一个“分区”实质上是介质上的一片连续的扇区。如果介质是磁盘,则是磁盘分区,如果介质是内存,则为内存分区。它本身可以与文件系统无关(例如在我们对它进行格式化之前)。它不隶属于任何目录,不存在“某个分区所在的目录的”说法。

“文件系统”可以理解为一个“分区”上存储文件的一种管理方式和布局,简称“管理布局”。如一个分区可以以ext2的布局方式来管理文件,也可以以ntfs的布局方式来管理文件等。有不同“管理布局”的分区,可以有相同的目录/文件树结构。

当分区被格式化后(即有了布局后),就可以用来存储文件。这时这样的一片连续的扇区,需要有一个入口(或者指针),即挂载点。一个分区的挂载点可以是“/”的任意目录。进入挂载点,就等于进入到了该分区的所谓的最上层目录。显而易见,一个分区可以有多个挂载点,即多个入口。也可以更换入口。也可以没有任何入口,即把该分区的所有挂载点都umount。

访问一个分区有两种方法,一是可以通过挂载点来访问,此时可以看到分区的目录/树结构。二是绕过文件系统和挂载点,直接访问物理设备(通过设备文件)。此时看不到分区的目录/树结构,只能读写扇区裸数据。未格式化或尚未挂载的分区,只能通过这种方法。当然即使拥有挂载点(入口)的分区也可以直接读写扇区裸数据。

a)linux文件系统分配策略:

块分配( block allocation ) 和扩展分配( extent allocation )

块分配:磁盘上的文件块根据需要分配给文件,避免了存储空间的浪费。但当文件扩充时,会造成文件中文件块的不连续,从而导致过多的磁盘寻道时间。每一次文件扩展时,块分配算法就需要写入文件块的结构信息,也就是 meta-dada 。meta-data总是与文件一起写入存储设备,改变文件的操作要等到所有meta-data的操作都完成后才能进行,因此,meta-data的操作会明显降低整个文件系统的性能。

扩展分配:文件创建时,一次性分配一连串连续的块,当文件扩展时,也一次分配很多块。meta-data在文件创建时写入,当文件大小没有超过所有已分配文件块大小时,就不用写入meta-data,直到需要再分配文件块的时候。

扩展分配采用成组分配块的方式,减少了SCSI设备写数据的时间,在读取顺序文件时具有良好的性能,但随机读取文件时,就和块分配类似了。

文件块的组或块簇 ( block cluster) 的大小是在编译时确定的。簇的大小对文件系统的性能有很大的影响。

注:meta-data 元信息:和文件有关的信息,比如权限、所有者以及创建、访问或更改时间等。

b)文件的记录形式

linux文家系统使用索引节点(inode)来记录文件信息。索引节点是一种数据结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。

一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一的元素对应。每个索引节点在数组中的索引号,称为索引节点号。

Linux文件系统将文件索引节点号和文件名同时保存在目录中,所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。对于一个文件来说,有一个索引节点号与之对应;而对于一个索引节点号,却可以对应多个文件名。

连接分为软连接和硬连接,其中软连接又叫符号连接。

硬连接:原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨文件系统(不能跨越不同的分区),文件在磁盘中只有一个拷贝。由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此硬连接可以防止不必要的误删除。

软连接:用 ln -s 命令建立文件的符号连接。符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。没有防止误删除的功能。

c)文件系统类型:

ext2 : 早期linux中常用的文件系统

ext3 : ext2的升级版,带日志功能

RAMFS : 内存文件系统,速度很快

NFS : 网络文件系统,由SUN发明,主要用于远程文件共享

MS-DOS : MS-DOS文件系统

VFAT : Windows 95/98 操作系统采用的文件系统

FAT : Windows XP 操作系统采用的文件系统

NTFS : Windows NT/XP 操作系统采用的文件系统

HPFS : OS/2 操作系统采用的文件系统

PROC : 虚拟的进程文件系统

ISO9660 : 大部分光盘所采用的文件系统

ufsSun : OS 所采用的文件系统

NCPFS : Novell 服务器所采用的文件系统

SMBFS : Samba 的共享文件系统

XFS : 由SGI开发的先进的日志文件系统,支持超大容量文件

JFS :IBM的AIX使用的日志文件系统

ReiserFS : 基于平衡树结构的文件系统

udf: 可擦写的数据光盘文件系统