购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 特殊硬件框架

Linux支持很多硬件框架,下面进行简单的概括。

RAPID I/O是一种物理连接方式,也有对应的软件驱动。用于芯片到芯片、板到板的连接,可作为嵌入式系统的背板连接,在非行业专用系统中很少见。

Linux硬件系统中可以包含FPGA芯片,由于FPGA可被硬件随意编程为实现特定功能的组件,其实现的功能是纯硬件的,又要被Linux操作系统所能利用,所以就需要一个内核中存在的基础设施来驱动FPGA以导出给用户使用。这个驱动组件就是XillyBus。用户必须在FPGA中将XillyBus模块的IP核放入FPGA硬件,内核中会运行一个XillyBus的数据转发模块,导出到用户空间供用户使用。由于这是一个通用性的组件,所以无法确切地指导数据流动的特点,因此其数据采用FIFO缓存。在用户空间的设备为:/dev/xillybus_*。

如此就可以读写其中的数据了。

一个板子上可能有多个CPU同时在运行多个操作系统,这些操作系统可能可以共享物理内存,也可能是分割的。这种架构在高端的嵌入式板子上很常见,这些板子上共享内存的操作系统之间也需要通信,但是如果采用传统的socket通信,那么代价太大。内核需要一种可以让两个CPU直接访问的缓存作为通信空间,从而创造一个通信协议,这种机制叫作rpmsg,在很多上游厂商的高端BSP(板级支持包)中都有类似的实现。一般的大型嵌入式系统都会自己实现一个CPU之间通信的协议,但大致上都是使用内存,将一块内存划分为一块块信道。这种板子还有谁先启动的问题,一般的做法是先启动一个操作系统(该操作系统叫作主操作系统),另外一个操作系统由先启动的操作系统来启动。主操作系统不但可以控制启动,还可以控制关闭重启、远程过程调用等。这个框架功能就叫作remoteproc。

还有“玩”嵌入式常遇到的PWN用于控制电机、LED等通用接口,类似于软件层次的GPIO。还有PIN Controller,很多硬件设备都有很多可以配置的引脚,通常是通过一系列寄存器对其进行配置和管理,而这些可用配置的种类又大致相同的,因此就产生了抽象化的需求。这些引脚的配置空间抽象化为PINController注册到内核的PINControll子系统中统一管理。还有例如“玩树莓派”这种板子经常用到GPIO接口,也在/dev目录下,但是一般会通过上层封装的库进行访问使用。

时钟是特殊硬件的一大类,这些硬件有物理存在的,也有虚拟的,有服务于网络时间同步的,也有服务于单机高精度时钟的。常见的有IEEE1588、NTP、SNTP、PTP、PPS、Watchdog、RTC、PIT、TSC、HPET、ACPI PMT这几种。其中IEEE1588、NTP、SNTP、PTP是服务于网络时间同步的机制或者设备,PPS、Watchdog、RTC在/dev目录下都有对应的时钟设备,可以给用户直接使用。PIT作为单机时钟信号提供者现在基本被淘汰,TSC、HPET、ACPI PM-Timer都是用于对PIT的替代产品。

IEEE1588定义了一种新的时钟同步方式。该方式的出现是因为局域网内的高精度同步没有很好的产品。NTP和SNTP这两种网络时钟同步算法的精度不能满足需求。PTP借鉴自NTP,主要思想是通过一个同步信号使周期性的设备与全网络中的设备同步校准。在一个网络中只有一个主时钟,用来产生最高精度的信号,其他的都为边界时钟,用来接收主时钟的同步信息来调整自己。由于PTP大部分用于局域网,而民间的局域网应用少有如此高的时间同步需求,所以PTP仍不被常用。

PPS是Linux内核抽象出的一种设备,位于/dev/pps*,PPS设备每一秒钟会发送一个脉冲。系统可以使用这种设备做到时钟同步,或完成其他定时操作。而Watchdog则要求用户必须在一定的时间间隔内向这个设备写入数据,否则该设备就会认为程序死亡,主动重启系统。Watchdog比较适用于程序与系统一体的嵌入式系统,但互联网服务器很少使用Watchdog,一般在出现紧急问题时都会人工尝试恢复。Watchdog的设备文件是/dev/watchdog。

RTC是在启动时经常使用的时间机制。PC电脑都有一个在离线状态下还可以运行的时钟。这个时钟在运行期可以看作是准确的、实时的,但是由于硬件原因,长期运行产生偏差也是不可避免的。Linux内核在启动的时候会去查询这个值,并用来维护自己的时间信息,启动后大部分Linux都会使用网络时间来重新确定本机的时间,还会向RTC(Real-Time Clock)硬件写入,用来校准。由于RTC硬件的时间是存储在寄存器中的,一般存储的都是自某一个时间(1900年或1970年)以来的秒数,而寄存器的大小是有限的,所以不同系统对这个算法的做法不一样。例如U-Boot读取一个值加上“1900年”就是现在的时间,但是Linux除此之外会判断如果小于1969年,会加上100年得到现在的时间。由于算法不一样,所以在Bootloader中与在Linux中看到的时钟时间不一样。

RTC是硬件也是一个软件子系统。RTC软件子系统的存在,使得不同的硬件时钟对于系统软件透明,省去了编程的麻烦。RTC与其他模块类似,也定义了设备,可以供用户在/dev目录下访问,叫作rtc或rtcn(n为整数,一个硬件系统可能会有多个RTC时钟,但大部分PC只有一个RTC时钟)。大多数的RTC带有中断功能,常见的x86系统中的8号中断就是时钟中断,内核可以使用该中断功能周期性地执行自己的任务。用户端也可以通过RTC设备使用这个中断机制。打开这个设备文件后,使用ioctrl设置频率后,周期性地去读取这个设备值,就能测量时间。因为设置频率就是设置了该时钟触发8号中断的频率,读取设备值得到的就是自上次读操作至今的中断数目。因此,每读一次就可以得到当前过去的时间。这个时间的粒度和准确度可以设置不同的频率和读取频率来控制。RTC用户端设备文件一次只允许一个用户单独打开。如图2-4所示。

图2-4

你可以在sys文件系统中查看RTC硬件的当前详细信息。我们平时常用的时间命令date、hwclock也是读取和设置RTC的。

虽然查询时间时可以查看RTC,但是RTC作为定时器频率过低,很难满足现代应用的定时需求。Linux内核中有一个通用的时钟抽象层,叫作timerkeeper,timerkeeper有一个clocksource的时钟源抽象封装。我们可以通过查看sys文件系统确定当前可用的和正在使用的时钟源。如图2-5所示。

图2-5

由图2-5所示可以看到RTC并没有在可用的时钟源里。acpi_pm的精度也相对一般,虽然hpet的精度很高,但是访问hpet的成本也相对较高。 6Nph0uO/HPHwzhfMMsNIARVoo8d6GV5VtGJ1h4bKZpxs5b9cG2B6Ia9VE0ZLC9Lb

点击中间区域
呼出菜单
上一章
目录
下一章
×