• VxWorks 6.9 内核编程指导之读书笔记 -- POSIX


    POSIX能力

    VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件。VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSIX.1可选功能中的一些实时接口。

    POSIX和实时系统

    VxWorks提供了很多POSIX兼容的API,但并非全部POSIX API都适合嵌入式和实时系统,或完全兼容VxWorks操作系统。因此,VxWorks在少量情况下强加了以下很小的限制来满足实时系统和VxWorks兼容。

    • 交换内存到磁盘不适合实时系统,VxWorks没有提供这种能力。它提供了POSIX的页锁定功能方便移植到VxWorks。这函数并没有其它用途--在VxWorks中页总是被锁定。
    • VxWorks任务在系统层被调度,进程本身不被调度。因而,POSIX访问函数允许2种植(PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS),VxWorks只实现了系统层范围。

    配置VxWorks使用POSIX能力

    默认配置并不包含POSIX支持。BUNDLE_POSIX捆绑组件为内核空间提供了通用POSIX的支持。如果要细粒度控制POSIX的支持,可以选择单个的组件。

    注意:对于内核空间和用户空间的POSIX支持的组件是不同的。

    POSIX的组件配置

    下表提供了支持内核空间的POSIX的独立组件

    POSIX能力 内核要求的组件 进程要求的VxWorks组件
    Standard C Library INCLUDE_ANSI_*组件 Dinkum C 类库(libc)

    Asynchornous I/O with

    system driver

    INCLUDE_POSIX_AIO

    INCLUDE_POSIX_AIO_SYSDRV

    INCLUDE_PIPES

    INCLUDE_POSIX_CLOCKS

    INCLUDE_POSIX_TIMERS

    Clocks INCLUDE_POSIX_CLOCKS INCLUDE_POSIX_CLOCKS
    Diretory and file utilities INCLUDE_POSIX_DIRLIB N/A
    ftruncate() INCLUDE_POSIX_FTRUNC N/A
    Memory locking INCLUDE_POSIX_MEM N/A
    Memory management N/A INLUCE_RTP
    Memory-mapped files N/A INCLUDE_POSIX_MAPPED_FILES
    Shared Memory objects N/A

    INCLUDE_POSIX_MAPPED_FILES

    INCLUDE_POSIX_SHM

    Message queues INCLUDE_POSIX_MQ INCLUDE_POSIX_MQ
    pthreads INCLUDE_POSIX_THREADS

    INCLUDE_POSIX_CLOCKS

    INCLUDE_POSIX_PTHREAD_SCHEDULE

    INCLUDE_PTHREAD_CPUTIME

    Process Scheduling API INCLUDE_POSIX_SCHED N/A
    Semaphores INCLUDE_POSIX_SEM INCLUDE_POSIX_SEM
    Signals INCLUDE_POSIX_SIGNALS N/A
    Timers INCLUDE_POSIX_TIMERS INCLUDE_POSIX_TIMERS
    Trace N/A INCLUDE_POSIX_TRACE
    POSIX_PSE52 support N/A BUNDLE_RTP_POSIX_PSE52

    通用POSIX支持

    VxWorks提供了大多数POSIX兼容类库。这些类库如下

     功能  类库
     Asynchronous I/O   aioPxLib 
     Buffer manipulation  bLib
     Clock facility  clockLib
     Direcotry handling  dirLib
     Environment handling  C library
     File duplication  iosLib
     File management  fxPxLib and ioLib
     I/O functions  ioLib
     Options handling  getopt
     POSIX message queues   mqPxLib
     POSIX semaphores  semPxLib
     POSIX timers  timerLib
     POSIX threads  pthreadLib
     Standard I/O and some ANSI  C library
     Math  C library
     Memory allocation  memLib and memPartLib
     Network / Socket APIs  network libraries
     String manipulation  C library
     Trace facility  pxTraceLib

    注意:风河公司建议不要同时使用POSIX类库和类似功能的本地VxWorks类库。这样做将导致不可预期的行为。

    在运行时检查是否支持POSIX

    POSIX应用程序可以在运行时使用以下API来判断POSIX支持的状态:

    • sysconf函数返回当前可配置系统变量的值,运行应用程序判断是否支持可选特性及系统限制的精确值。
    • confstr函数返回与可用系统相关的字符串这个版本,confstr只返回系统默认路径的字符串。

    uname函数让应用程序获得真正运行的系统信息。VxWorks提供的标识消息是系统名称VxWorks,系统的网络名称,系统的发布版本、机器名称(BSP模块),架构的大小端,内核版本,处理器名称(CPU家族),BSP的修订版本和系统构建日期。

    POSIX的头文件

    POSIX 1003.1标准定义了一系列头文件作为应用程序开发环境的一部分。用户端的开发环境比内核的开发环境有更多的POSIX头文件,它们的内容也比内核的头文件与POSIX标准更一致。

    内核环境的头文件

     Header File  Description
     aio.h asynchornous input and output
     assert.h verify program assertion
     ctype.h  character types
     dirent.h  format of directory entries
     errno.h  system error Numbers 
     fcntl.h  file control options
     limits.h  implementation-defined constants
     locate.h  category macros
     math.h  mathematical declarations
     mqueue.h  message queues
     pthread.h  pthreads
     sched.h  execution scheduling
     semaphore.h  semaphores
     setjmp.h  stack environment declarations
     signal.h  signals
     stdio.h  standard buffered input/output
     stdlib.h  standard library dfinitions
     string.h  string operations
     sys/mman.h  memory management declarations
     sys/resource.h   definitions for XSI resource operations 
     sys/stat.h  data returned by the stat() function
     sys/un.h  definitions for UNIX domain socket
     time.h  time types 
     trace.h  trace facility
     unistd.h  standard symbolic constants and types 
     utime.h  access and modification times structure 
     sys/typs.h data types
       

    POSIX命名空间

    用户模式的RTP进程可用POSIX命名空间。

    POSIX Clocks 和 Timers

    VxWorks提供了POSIX 1003.1b标准的 Clocks和Timer接口。

    POSIX Clocks

    POSIX定义了各种软(虚拟)时钟,作为CLOCK_REALTIME时钟,CLOCK_MONOTONIC时钟,处理CPU-time时钟及线程的CPU-time的时钟。这些时钟都使用一个系统硬件时钟。real-time和monotonic时钟是系统级时钟,因此支持内核和进程。CPU-time时钟在VxWorks中不支持。线程CPU-time时钟只支持RTP进程。POSIX线程可以为它的进程使用real-time时钟、monotonic时钟和线程CPU-time时钟。

    real-time时钟只能被内核复位。monotonic时钟不能被复位,它表示系统从启动到现在流逝了多少时间。real-time时钟可以被用CLOCK_REALTIME作为clock_id参数使用的POSIX时钟和定时器函数访问。real-time可以在运行时被复位,通过从内核中调用clock_settime函数(不是进程中)。

    monotonic时钟可以通过使用CLOCK_MONOTONIC参数作为clock_id来调用clock_gettime函数来访问。monotonic时钟指示了系统从启动到现在使用了多少时间,即,该函数的返回值是系统启动到现在的秒和纳秒数。monotonic不能被复位。因此,应用程序可以依赖于这样的事实:可以对时间间隔的测量,来证明系统没有被clock_settime()篡改。

    CLOCK_REALTIEM和CLOCK_MONOTONIC定义在time.h。

    POSIX时钟函数

     Routine   Description
     clock_getres()  得到时钟分辨率 (CLOCK_REALTIME和CLOCK_MONOTONIC) 
     clock_setres()  设置时钟分辨率。(废弃,是为了保留向前兼容)
     clock_gettime()   得到当前时间 (CLOCK_REALTIME和CLOCK_MONOTONIC)
     clock_settime() 为CLOCK_REALTIME设置指定时间(不能用于CLOCK_MONOTONIC怕;不支持在内核中的线程CPU-time时钟)

    为了包含clockLib类库,配置INCLUDE_POSIX_CLOCKS组件。对于线程CPU-time时钟,使用INCLUDE_POSIX_PTHREAD_SCHEDULER和INCLUDE_POSIX_THREAD_CPUTIME组件。

    POSIX定时器

    POSIX定时器提供了任务在将来某个时候通知本身的能力。提供了创建,设置和删除定时器的函数。

    定时器基于时钟。在内核中,CLOCK_REALTIME和CLOCK_MONOTONIC时钟支持定时器。在进程中,除了这2个,还支持线程CPU-time时钟(CLOCK_THREAD_CPUTIME_ID时钟)。

    当定时器触发,默认signal,SIGALRM,被发送给任务。使用sigaction函数来安装signal处理函数。VxWorks的timerLib类库包含了一系列以下函数:timer_open(),timer_close(),tiemr_cancel(),timer_connect()和timer_unlink()。这些函数比使用POSIX定时器更容易、更强大。

     Routine   Description
     timer_create()   使用指定的时钟分配一个定时器基于(CLOCK_REALTIME或CLOCK_MONOTONIC)
     timer_delete()  删除前面创建的定时器
     timer_open()  打开命名的定时器。VxWorks特定的POSIX扩展函数
     timer_close()  关闭命名的定时器。VxWorks的扩展函数
     timer_gettime()   在过期和重新加载之前得到剩余时间。
     timer_getoverun()   返回过期溢出定时器
     timer_settime()  Set the time until the next expiration and arm timer。
     timer_canncel()  取消定时器
     timer_connect()  连接用户函数到定时器信号。
     timer_unlink() 解除命名定时器的连接。
     nanosleep() 挂起当前线程(任务)直到时间间隔用完。
     sleep()  延迟一定数量的时间
     alarm()  为signal提交设置一个报警时钟。

    注意:在VxWorks中,不是用"/"开头的命名的定时器是私有的,不能从其它进程访问。以"/"开始命名的定时器是公开的,其它进程可以访问。

    POSIX的nanosleep提供了秒或毫秒的睡眠和延迟,而不是VxWorks的taskDelay的tick数,但是两者的进度是一样的,由时钟率决定,只是单位不同而已。

    要使用timerLib类库,必须配置INCLUDE_POSIX_TIMERS组件。

    POSIX异步I/O (AIO)

    POSIX异步I/O函数由aioPxLib类库提供。VxWorks的AIO实现满足POSIX 1003.1标准。

     

  • 相关阅读:
    沈询:事务与分布式事务原理与实现
    c++ 幕客网
    Meet Dgraph — an open source, scalable, distributed, highly available and fast graph databas
    开发与系统管理----开发工具 左蓝
    奇虎360技术博客
    java 相关软件使用趋势
    长亭技术专栏 安全攻防技术分享
    tcp/ip RFC
    gentoo and arclinux
    孙鑫视频VC++深入详解学习笔记
  • 原文地址:https://www.cnblogs.com/C-Sharp2/p/5923872.html
Copyright © 2020-2023  润新知