这几天进度比较慢,读书有些枯燥,开始看第三章:硬件支持。我看了一下第一版的CHM,不知道是不全呢还是第二版丰富了很多。
在这章中将被讨论没有MMU的结构,虽然这已经在linux 2.6版本中支持,这是对8bit的低价格微处理器,用于打印,家庭娱乐的方式,这本书不包含这些方面,针对32bit的CPU。
CPU的介绍
ARM:久闻大名,很多终端使用,例如iPod、iPhone。ARM使用RISC(Reduce Intruction Set Computing)『和使用CISC(负责计算指令集)的x86的CPU不一样。RISC可以使电路更为紧凑,不需要BIOS,低功耗、低成本 』 。 和他的竞争芯片厂家(IMB、Intel等)不一样,ARM公司不生产自己的芯片,他根据ARM的架构为他的客户设计芯片,这些芯片具有共同的ARM指令 集,使得上面的软件可以兼容,这并不意味着可以在ARM的板块上进行同样的编程开发,只是汇编或者二进制代码在相同的修订架构上是一致的。修订架构包括有 ARMv4T、ARMv5TE(Xscale)、ARMv6(其中ARMv6KZ是用于Apple iPhone)等家族系列。
AVR32:惭愧,没怎么听过。和AVR(8bit处理器)是同一厂家,但是结构没有什么相关,支持通用的DSP和JAVA加速指令,兼容16bit指令和扩展32bit指令。AVR32在2006开始发展,目前Linux kernel支持at32ap这种型号。
Intel x86:这个大家都看起来很熟悉,包括Intel的、AMD的。有一个新的趋势是SoC。虽然在Linux系统中使用很多,但是在嵌入式OS中,占的份额 比较少,原因是比较复杂、电源利用(正在改善)和价格。现在,x86架构在linux内核中有一个内置的debugger。
M32R:在里面提到一个词FPGA,需要到网上共产主义学习一下。ASIC(Application Specific Intergrated Circuits)即专用集成电路,是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。目前用CPLD(复杂可编程逻辑器件)和 FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一。FPGA(现场可编程门阵列)是专用集成电路(ASIC)中集成度最高的一种,用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑, 因而也被用于对CPU的模拟。用户对FPGA的编程数据放在Flash芯片中,通过上电加载到FPGA中,对其进行初始化。也可在线对其编程,实现系统在 线重构,这一特性可以构建一个根据计算任务不同而实时定制的CPU。 对M32R进行很简单的介绍,用于PDA、摄像头、引擎控制等。
MISP:用于游戏机和其他电子设备。和ARM有些类似,就是将CPU core的license给第三方,和ARM不同,但是不同系列的MISP的指令有很大的差异。MISP对Linux的支持不如Intel x86,PowerPc,当时仍有一些用于嵌入式草组哦系统,例如MontaVista。
motorola 68000:是个古老的可用于嵌入式操作系统的架构,现在已经很少使用。
PowerPC:在工作站(Apple macs)和嵌入式操作系统中都大量使用,是IBM、Apple、Freescale共同发起的。
SuperH:有日立发展起来,方式和ARM、MISP相似。SH-1和SH-2是没有MMU,linux不必支持,SH-3|4|5的某些系统Linux支持。
总线和接口(Bus and Interface)
总线和接口连接CPU和外设。先是著名的PCI,有120I/O线的 32bitPCI,184线的64bitPCI,以及新的串口的PCI-Express。为了使驱动能够工作,PCI需要软件支持,第一步的支持是 bootup的时候初始化和配置PCI设备,对于PC设备,由BIOS来完成,kernel从BIOS的表额中获取PCI的信息,但是kernel也可以 自己对PCI进行初始化和被指。这两种方式,kernel都提供了一个API给设备驱动,这样他们可以获取设备的信息并控制设备。
ExpressCard替代PCMCIA,在手提电脑中常用。还介绍了PCI/104和PCI/104-Express、SCSI。
Compact PCI应该是以前我们搞VxWorks的那些多个可插拔多个板块那种插口,他的接口是pin,支持热插拔(hot swap)。热插拔分为三种:一、基本热插拔,需要控制台进行操作;二、全热插拔,通过操作者按动卡的推进或退出,系统自动进行,并给出相关的LED显示 灯;三、高可靠性,各板块受到监控,如果板块块了,将关闭它并启动备用板块。这个在很多电信基本的设备中看到,也是vxworks使用的环境。正在发展 CompactPCIe,将提高吞吐量,并提供PCI-Express的一些优点。
USB,名词解析一下先,Universal Serial Bus。IEEE1394(火线),在Linux 2.6的版本得到了很好的支持。Linux还支持InfiniBand,一种高性能的光交换接口,由1-12条点对点的链接组成,最大吞吐量为 2-96Gbps,端到端的时延非常小,用于高性能的计算,特别在超级计算机中。I2C(Inter-Integrated Circuit,集成电路间),最初是Philips用于TV内部组件相互通信的,目前在嵌入式设备中常见,提供有线的数据交互,例如LCD驱动,DSP 等等,并在检测传感器中大量使用。I2C使用两根线连接设备,一个是串行时钟线,一个是栓行数据线。初始化transaction的一方为master, 虽然允许有多个master的存在,但是绝大部分的应用只有一个master。
I/O
kernel对I/O设备有两种支持,一种是native的方式,令一种I/O设备通过USB层连接。对于USB的驱动也是基于直连设备的驱动,增加了USB stack。
串口,以RS232我们最为常见,这是硬件接口,kernel不需要提供支持,而是包含了实现RS232通信芯片UART(通用异步收发)的驱动,位置 在drivers/char/serical.c。Linux将串行设备作为一个终端设备处理,而不理会底层的硬件和相关的驱动,从/dev/ttyS0 到/dev/ttyS191。
并口,在嵌入式操作系统中很少使用,通常用于打印机,但是打印去可以使用USB或者IEEE1394,所以碰 到的情况很少。有一种使用场景是multibit I/O,可以在并口出链接LED,在程序的不同位置,加入命令,显示不同的LED,这样可以跟踪程序的运行位置。
Modem:和Unix一 样,Linux将Modem看作是串口,对于真正的modem,通过在/dev的串口设备接口,以及被相同的驱动控制。有一些新的“modem”,在声卡 上稍加改装而成,叫WinModems,OS的软件可以将它们跑起来,就像真的Modem设备,但是目前只在Windows支持,Linux虽有在这方面 有些project,但是没有能对各种的WinModems提供统一支持。
DAQ:数据获取器,这在工厂和科学实验室中房间,通过转换器,将物理的事件转为一个电气值,并进行采样。在UNIX或者其他OS
中标准的借口,Comedi包是主要DAQ Linux设备借口,可以适配很多DAQ板块,Comedi还提供Comedilib,一个统一的API给上层软件,Kcomedilib,内核模块API。
键盘:在传统的嵌入式系统中,键盘被视为笨拙的东西,现在很多面向客户的可上网的嵌入式系统有某种类型的键盘,例如一个蓝牙键盘。键盘输入作为终端的的 input,属于终端I/O驱动。有其他的一些方式来避免使用物理键盘来进行终端输入,例如按键输入(手机方式),书写识别等方式,这些方式,程序获取输 入的字需要temrminal I/O编程。
Mouse在很多终端采用触摸屏的方式。在linux中,指示设备的输入事件在/dev/input。但是程序员应无须在这么低层进行操作,有很多方便的API可以获取指示的输入。
显示:显示有些在kernel中支持,但是大部分给于上层程序,在Linux中最常用的图形接口是X Window System,还有其他的包。X window System之提供基本的图形窗口环境,没有高级的lib,可以在GNOME和QT工程中看看他们的GUI,很多著名的嵌入式Linux设备提供他们自己 的UI。声音方面,有很多工程提供sound server,在device借口上的软家,著名的有PulseAudio(PA)和JACK。这些高层的音频服务有他们的API或者支持ALSA API标准。打印原来在嵌入式操作系统中不常见,但是现在家庭路由器,办公打印服务器甚至PDA都很难需要和远端的打印机通信,虽然打印机并不是直接连到 这些设备。Linux支持CPUS(通用Unix打印系统)来实现对打印设备的配置、管理等。
存贮
嵌入式操作系统需要至少 一个固态存贮,用于存贮boot进程的最早阶段,Linux嵌入式OS也使用这个存贮,作为后续操作,包括执行代码和获取数据。Linux的术语 中,MTDs(memory technology devices)包括从传动的ROM到NOR/NAND Flash卡的各类存贮,他们之间的差异非常大,在linux kernel中提供一个统一层用于无缝连接低成的MTD芯片和成为用户模块(user module)的高层接口(这个高层接口指的是内核中的高层接口,不是app层的)。
PATA和SATA都是ATA标准的,也就是常说的 IDE。IDE在工作站和服务器中常用,存放OS的bootloader、root 文件系统,还可能包括swap区,但是在很多的嵌入式操作系统中,不一定都具备ATA/IDE能力,如果想在系统中使用IDE硬盘,但在flash中没有 具备ATA能力的监控程序(boot monitor)或者引导加载程序,需要在kernel和引导监控程序一同放置在flash或者ROM中,才能在系统开启的时候取得它,然后设定引导监控 程序,让它在启动时使用该内核以便存取IDE磁盘。现在的CompactFlash、SD不属于MTD,linux可以很好地支持这些。
网络
网络部分介绍了以太网,红外线网络(需要近距离,因此对入侵的防范比较好)。
无线网络802.11,也就是wifi,802.11有A、B、G、N,A使用5GHz的频率,提供54Mbps的带宽,B使用2.4GHz频率,提 供11Mbps的带宽,G提供54Mbps,N提供248Mbps的带宽。Linux支持B、G、N,据说A的功耗大,距离短,穿透力差。GNOME工程 的networkManager提供图形界面。在Linux2.6中,重写了stack,使得更好地支持最新的芯片。
蓝牙设备不需要配置可作恶wipivonet的一部分,设备自动检测其他设备,并公布他们的服务,使得其他piconet的设备可以使用这些服务。Linux的蓝牙堆栈是BlueZ,具有GPL。
上面讲述的都是通用的网络,还有工业级别的网络。在工业应用上,由于电磁等环境特性,在一些场合不能使用通用的网络类型。例如有汽车制造发展的CAN,是最为普片的fieldbus。Linux在2.6.25开始支持CAN。此外还有Modbus.
系统监控
虽然我们在设计和开发时候减少错误的出现,但是硬件和软件的错误总是很难完全避免的,因此需要系统监控进行错误检测和恢复。Linux支持两种系统监 控:watchdog定时器和硬件健康检查(例如电压是否符合要求、温度是否过热等),watchdog timer可以是软件也可以是硬件,通过是否在定期内清空来决定是否reboot系统。硬件健康检查是硬件方式。Linux内核支持很多watchdog timer,可以在kernel尽力配置菜单中的watchdog cards子菜单中查看。我们可以在/dev/watchdog中查看,这个需看门狗监控程序周期重写以避免系统的reboot。Linux通过 lm_sensors工程支持一些硬件的检测设备。