• Linux与VxWorks的区别


    Linux与VxWorks的主要区别

    1、内核结构
      微内核:是一种只提供必要服务的操作系统内核;这些必要的服务包括任务管理、中断处理、内存管理等。其他服务,如文件管理、网络支持等通过接口连到微内核。
      在微内核中,用以完成系统调用功能的程序模块通常只进行简短的处理,而把其余工作通过消息传递交给内核之外的进程来处理。在典型情况下,每个系统调用程序模块都有一个与之对应的进程,微内核部分经常只不过是一个消息转发站,这种方式有助于实现模块间的隔离。这种内核设计的最根本思想就是要保持操作系统的内核尽可能小,因为内核是直接与计算机硬件相关的,内核越小,就越便于在不同的硬件系统间进行移植。
      微内核结构的另外一个优点是,可以使不需要的模块不加载到内存中,因此,微内核就可以更有效地利用内存。
      微内核具有很好的扩展性,并可简化应用程序开发。用户只运行他们需要的服务,这有利于减少磁盘空间和存储器需求。
      宏内核:又称单核心,是操作系统核心架构的一种,除了基本的服务,内核还包括文件系统、网络协议等。此架构的特性是整个核心程序都是以核心空间(Kernel Space)的身份及监管者模式(Supervisor Mode)来运行。
      宏内核的内部可被分为若干模块(或者是层次或其他),但在运行时,它是一个独立的二进制大映像。模块间的通信不是通过消息传递,而是通过直接调用其他模块中的函数来实现的。
      现在多数采行宏内核架构设计的操作系统,如OpenVMS、Linux、FreeBSD、以及Solaris等,在运作运行阶段中,以动态方式来加载(Load)、卸载(Unload)可运行的模块,不过这些模块是属于二进制代码的层次,或称镜像层次,而非核心架构的层次。即使宏内核进行模块化转化,也不会与微核心或混核心架构的核心产生区分上的混淆,因为微核心、混核心的模块是属于系统架构的层次。
      就实务上,动态加载/卸载模块的作法,等于是用一种较简易的方式来弹性管控运行中的操作系统核心,若没有动态加载/卸载机制,操作系统的核心想要进行任何的调整、变换,都必须重启才能达成。因此模块化是必然且必要的,如此才能让核心功效轻松地扩展、延伸,此外也能适时减轻硬件的运行运作负担。

    2、运行模式
      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。

    4、执行单元
      任务,是代码运行的一个映象,从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、IO设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行(宏观上如此)。VxWorks内核使任务能快速共享系统的绝大部分资源。
      进程(有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈以及其它记录其运行轨迹的辅助数据。操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间。

      也因为各个进程有自己的内存空间、数据栈等,所以只能使用进程间通讯(IPC),而不能直接共享信息。
      线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境。它们可以想像成是在主进程或“主线程”中并行运行的“迷你进程”。
      线程有开始,顺序执行和结束三部分。它有一个自己的指令指针,记录自己运行到什么地方。线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步。
    一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便地共享数据以及相互通讯。线程一般都是并发执行的,正是由于这种并行和数据共享的机制使得多个任务的合作变为可能。实际上,在单CPU 的系统中,真正的并发是不可能的,每个线程会被安排成每次只运行一小会,然后就把CPU 让出来,让其它的线程去运行。在进程的整个运行过程中,每个线程都只做自己的事,在需要的时候跟其它的线程共享运行的结果。
      当然,这样的共享并不是完全没有危险的。如果多个线程共同访问同一片数据,则由于数据访问的顺序不一样,有可能导致数据结果的不一致的问题。这叫做竞态条件。幸运的是,大多数线程库都带有一系列的同步原语,来控制线程的执行和数据的访问。
      另一个要注意的地方是,由于有的函数会在完成之前阻塞住,在没有特别为多线程做修改的情况下,这种“贪婪”的函数会让CPU 的时间分配有所倾斜。导致各个线程分配到的运行时间可能不尽相同,不尽公平。

    5、请求内核服务方式
    函数调用的实际(汇编)实现
    指针寄存器EBP和ESP
    EBP是所谓的帧指针,指向当前活动记录的上方(上一个活动记录的最下方)
    ESP是所谓的栈指针,指向当前活动记录的最下方(下一个将要插入的活动记录的最上方)
    这两个指针的值规定了当前活动记录的位置
    参数传递
    将函数参数压栈:mov eax,dword ptr [n] ;(n为参数变元)
    push eax
    函数调用分配空间
    函数调用将执行如下操作:
      ⒈将帧指针压入栈中:push ebp
      ⒉使得帧指针等于栈指针:mov ebp,esp
      ⒊使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态: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
    函数返回释放空间
    当函数返回时,编译器和硬件将执行如下操作:
      ⒈使栈指针等于帧指针: mov esp,ebp
      ⒉从栈中将旧的帧指针弹出: pop ebp
      ⒊返回:ret
    系统调用:由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口。是应用程序同系统之间的接口。
    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、实时性
      实时操作系统是相对于分时操作系统的一个概念。在一个分时操作系统中,计算机资源会被平均地分配给系统内所有的工作。在分时系统中,各项任务需要花多长时间来完成,这一点并不重要;而在一个实时操作系统之中,最关注的是每个任务在多长时间内可以完成。简单地说,实时和分时操作系统最大的不同在于 “时限”这个概念。
    实时操作系统的特点:
    1、异步事件的响应
    2、切换延迟和中断延迟时间的确定
    3、优先级中断和调度
    4、抢占式调度
    5、内存锁定
    6、连续文件
    7、同步
      从上述区别中可以看出,在实时操作系统中,系统必须在特定的时间内完成指定的应用,具有较强的“刚性”,而分时操作系统则注重将系统资源平均地分配给各个应用,不太在意各个应用的进度如何,什么时间能够完成。不过,就算是实时操作系统,其“刚性”和“柔性”的程度也有所不同,就好像是系统的“硬度”有所不同,因而有了所谓的“硬实时”和“软实时”。
      硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。而软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,例如在网络中仅仅是轻微地降低了系统的吞吐量。
      硬实时与软实时之间最关键的差别在于,软实时只能提供统计意义上的实时。比如,用户在操作DVD播放机时,只要98%的情况都能正常播放,用户可能就满意了;而发射卫星、控制核反应堆的应用系统,这些系统的实时性必须达到100%,是绝对不允许出现意外的。

    7、文件系统差异,主要讲Linux方面:
    a)文件共享
    多进程可以同时访问一个文件,文件会在内存中存在一个映像
    一个进程修改,其他进程都可能更新,特别是通过map方式
    b)文件按需加载
    如果系统都只访问文件一个片段,最小情况下内存只有一段文件片段的buffer

    VxWorks文件系统的总体系统结构:

      我们通常使用的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文件的记录形式
      linux文家系统使用索引节点(inode)来记录文件信息。索引节点是一种数据结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
      一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一的元素对应。每个索引节点在数组中的索引号,称为索引节点号。
      linux文件系统将文件索引节点号和文件名同时保存在目录中,所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。对于一个文件来说,有一个索引节点号与之对应;而对于一个索引节点号,却可以对应多个文件名。
      连接分为软连接和硬连接,其中软连接又叫符号连接。
      硬连接:原文件名和连接文件名都指向相同的物理地址。目录不能有硬连接;硬连接不能跨文件系统(不能跨越不同的分区),文件在磁盘中只有一个拷贝。由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此硬连接可以防止不必要的误删除。
      软连接:用 ln -s 命令建立文件的符号连接。符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。没有防止误删除的功能。

  • 相关阅读:
    neutron 多租户隔离的实现以及子网间路由的实现
    neutron是一个超级脚本的理解
    LVS + nginx实现高性能精准负载均衡
    LVS + HAProxy实现跨网负载均衡
    Linux 线程实现模型
    Linux 进程调度的主要策略
    Linux PCI设备驱动的实现思路与思想
    网络控制器intel 82599, powerpc 830的BD描述符结构
    Linux网络设备驱动的实现
    大规模分布式服务的核心思想
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15901160.html
Copyright © 2020-2023  润新知