摘要
针对网络处理器这一复杂的硬件,以Intel IXP2400为例,针对在实际使用Intel SDK进行网络应用开发时所遇到的问题,通过分析Teja NP开发平台所提供的开发方法,提供了一种进行网络处理器上应用开发的新方法,旨在介绍一种降低网络处理器上应用开发难度、加快开发进度的思路和方法。
关键词
网络处理 Teja NP 微引擎 XScale
引言
因特网普及程度的逐步提高几乎影响着所有的网络技术,建立在因特网形式之上的新网络体系结构,呈现出宽带化和综合化的趋势。这就对下一代网络设备提出了如下要求:具有优异的性能,支持高速分组处理;具有高度灵活性,支持不断变换的高层网络服务。不论是通用处理器还是专用处理器度不能很好地满足这样的要求。网络处理器(Network Processor,简称NP)通过良好的体系结构设计和专门针对网络处理优化的部件,既弥补了通用处理器和专用处理器在网络处理方面的不足,又很好地结合了二者在网络处理方面的优势。网络处理器同时具备通用处理器的可编程性和专用处理器的高速包处理能力的特点,很好地实现了网络处理的灵活性和高性能的融合。
由于网络处理器硬件复杂程度的增加,并且传统的嵌入式操作系统,不论是嵌入式Linux还是VxWorks,都没有对网络处理器部分提供充分地支持,所以在网络处理器上进行网络应用开发的难度颇大。Teja公司在Teja NP这一软件开发平台上实现了内存管理、进程通信和同步、事件调度以及系统初始化等网络应用所需的服务,把这些服务以Teja C API的形式提供给开发人员,从而降低了网络应用开发的难度。Teja NP的NPOS软件函数库通过封装屏蔽了底层硬件的复杂性,Teja NP ADE开发环境以统一的界面进行网络应用整体的开发和调试,可以显著地提高开发效率和网络应用的性能。
1 网络处理器的复杂性
网络处理器是一种专用的、可编程的硬件芯片,它结合RISC处理器的低成本、灵活性以及定制硅片(ASIC)的速度和可扩展性,正成为构建网络系统和网络安全设备的重要组件之一。由于网络处理器需要满足高速的包处理能力(OC-12、OC-48等),以及具备适应不同网络协议或者不同的网络应用在的能力,所以在设计上通常具有很高的复杂性。就Intel IXP2400而言,其硬件结构如图1所示:

图 1 Intel IXP2400硬件结构框图
IXP2400主要有如下一些特性:
- 处理器和线程
- 8个可编程的包处理微引擎
- 每个微引擎有8个独立的、可编程的硬件线程
- 每个微引擎上有4K长字(Long Word)指令存储空间
- 具有数据和指令高速缓存的XScale嵌入式处理器
- 内存和寄存器
- 每个线程可用多达32个局部寄存器(Local Register)
- 每个线程可用多达32个传输寄存器(Transfer Register)
- 每个微引擎可用多达32个共享寄存器(Shared Register)
- 每个微引擎可用640个长字局部内存(Local Memory)
- 芯片上集成16K字节暂存存储器(Scratchpad Memory)
- 对双倍数据速率动态RAM(Double Data Rate Dynamic RAM,DDR-DRAM)的2GB寻址空间
- 对四倍数据速率静态RAM(Quad Data Rate Static RAM,QDR-SRAM)的32MB寻址空间
- 256个通用寄存器
- 512个传送寄存器
- 通信
- 每个线程可用15个用户可编程的信号及信号处理句柄
- 相邻的微引擎间单向的下一邻接寄存器(Next Neighbor Register)
- 16个暂存环(Scratch Ring)
- 每个SRAM通(Channel)可用多达64个SRAM环(SRAM Ring)
- 每个SRAM通道可用多达64个SRAM链表(Link List)
- 接口
- 特殊的硬件单元
- 40字节,16个条目的按内容寻址存储器CAM(Content Addressable Memory)
- 48、64或者128字节的哈希表(Hash)
- 校验单元(Checksum)
网络处理器硬件设计上的复杂性,灵活性和编程上的特殊性必然会大大增加网路处理器上应用开发的难度。
2 使用Intel SDK开发工具的问题
Intel针对其IXP系列的网络处理器提供了Intel SDK开发工具包,但使用SDK进行网络处理器上应用的开发有很多不尽如人意的地方。在实际的开发过程中,Intel SDK主要存在以下不足:
1.缺乏一个系统整体开发调试的环境
网络处理器上的应用通常由数据层面(Data Plane)、控制层面(Control Plane)和管理层面(Management Plane)三个部分组成。Intel SDK主要用于数据层面的开发,缺乏对控制层面应用开发(运行在XScale核上的应用)的有效支持(需要第三方的C/C++编译器的支持),所以在Intel SDK的环境下无法有效地进行完整系统的功能模拟和调试,在实现数据层面和控制层面的集成时往往会遇到比较大的困难。
2.系统重构时大量的代码需要重写
运行在IXP2400的XScale核上的逻辑通常采用C/C++来实现,而微引擎上的逻辑一般使用微码来进行编写。按照Intel可移植性框架(IXA Portability Framework)的要求,运行在微引擎上的逻辑通常是由调度环(Dispatch Look)把若干个微块(MicroBlock)组合在一起来实现的。如果需要把一部分逻辑有一个微引擎移到另外一个微引擎上时,需要重新编写相关微引擎的调度环。如果需要把有关逻辑由微引擎转移到XScale核上,因为微引擎和XScale核上的逻辑是分别用微码和C/C++来实现的,所以需要重新编写有关的代码,这样不仅会延长项目的进度,而且会带来另外的代码错误。
3.开发人员需要充分了解网络处理器的硬件特性
要充分发挥网络处理器的硬件特性,必须对网络处理器有深入的理解。对IXP2400的存储模块而言,就有SRAM、DRAM、Local Memory、Scratchpad Memory、Next Neighbor Register等不同的存储空间,不同的存储空间的时延和性能均有较大差异,并且有不同的操作指令,这就要求开发人员充分了解他们的硬件特性,在系统构建时就要考虑到不同存储空间的硬件特性。如果需要调整某个模块所占用的存储空间,通常需要重新编写有关代码,这一点在系统调优的过程中会显得非常的繁琐,并且会引人不可预知的错误。
4.应用没有经过专业测试
为了加快在Intel IXP系列网络处理器上应用的开发,Intel SDK中提供了IPv4/IPv6等有关的参考代码,但这些代码没有经过专业的测试。要把这些代码应用到实际的系统当中,还需要做大量的代码移植和测试工作。
3 Teja NP开发环境的特点
对于网络处理器这一复杂的硬件,嵌入式操作系统,不论是Linux还是VxWorks都没能提供完整的支持。要降低网络处理器上应用开发的难度,加快开发的进度,就需要有一个能在分布式环境下提供内存分配、事件驱动和调度、进程间通信等相关服务的框架,使得在该框架下,不论是XScale核,还是微引擎上的逻辑都能在同一的界面下来进行开发,并且最后编译得到代码能够充分利用网络处理器的硬件特性。Teja NP这一开发平台所提供的开发方法就是基于这样一个思路。Teja NP主要有以下几个部分组成:
NPOS把网路处理器上应用开发所需要的内存管理、通信和同步管理、线程管理、设备管理、事件驱动调度和系统初始化等有关的服务以API的形式提供出来,使得开发人员以统一的形式通过调用API的方式来使用NPOS所提供的有关服务,从而大大降低了开发的难度,并确保了应用的可移植性。并且实现NPOS的有关代码都是根据特定的硬件平台而编写的,所以可以保证最后所生成代码的运行效率。
在Teja NP的ADE(Application Development Environment)开发环境中,可以定义所需的数据结构、软件体系结构、硬件体系结构、软件到硬件的映射关系和应用运行环境等有关内容。不论是部署在XScale核上的逻辑,还是部署在微引擎上的逻辑,都是在ADE的前端部分(Front End)采用统一的Teja C,在图形化的界面下开发的。ADE的后端部分(Back End)根据所定义的软件到硬件的映射关系自动地生成优化的C/C++和汇编代码,也就是说在定义软件到硬件的映射关系时,如果逻辑是映射到XScale核上,则后端部分会自动生成C/C++代码,如果逻辑是映射到微引擎上,那么后端部分就会自动生成微码。这样就可以通过简单地修改软件到硬件的映射关系来调整有关逻辑的部署。对于系统调优或者调整系统的整个架构来说是非常方便的。所生成的代码通过调用NPOS所提供的API来取得高性能。
在集成化开发环境中,XScale核和微引擎上有关逻辑的实现都是通过状态机的方法来实现的。对于时序要求较强的网络应用的开发来说,状态机这一工具非常便于用来表达有关应用的逻辑。
Teja公司随Teja NP开发平台一起提供了IPv4/IPv6转发、TCP卸载(Offload)、IDS/IPS等有关的模块,这些模块都是在ADE的环境中通过使用Teja C、调用NPOS所提供的API来实现的,并且都在相关平台上进行了测试。因为可以得到相关模块的源码,所以可以很方便地进行修改、重用。
Teja NP开发环境采用的是一种与硬件无关的应用开发方式,这种开发方式非常利于代码重用,并且可以提高系统的灵活性,使得用Teja NP所开发的产品可以在很短的时间内移植到不同的网络处理器平台上。但由此而带来的问题是:最终所自动生成的代码,在代码大小和执行效率上是不是要劣于比手工编写的代码?Teja NP通过以下方法来确保最终生成代码的效率和大小问题:
- Teja NP ADE的后端校验和代码自动生成部分,是把系统作为一个整体来进行优化和生成代码的。这样就可以充分利用网络处理器的硬件特性。并且通过迟后联编(Late Binding)技术,来灵活地定义软件到硬件的映射(Mapping)关系,例如可以灵活定义有关的逻辑在不同的微引擎,甚至在微引擎和XScale核之间的映射;修改数据空间到不同的物理存储器的映射,改变映射关系根本不需要改动任何应用的逻辑。另外通过优化关键路径的分支处理(根据不同分支的优先级的不同,把优先级高的分支单独组织起来)进一步确保了关键路径的高性能。
- NPOS所提供API的实现代码都是根据特定硬件平台来编写的,充分利用了网络处理器的硬件特性。最后在代码自动生成时,通过全局内联函数(Global Inline Function)技术只把所用的API的有关代码编译到所生成代码中,这样就可以确保了代码的执行效率和代码所占用的空间。并且Teja NP所提供的应用模块都针对特定的硬件平台进行了优化,进一步确保了代码的执行效率。
- Teja NP所使用的与硬件无关的开发方式以及迟后联编技术,在实现系统功能时,不需要关心太多的硬件细节,并且在Teja NP的开发环境中是把系统作为一个整体来考虑,可以进行整个系统的模拟调试和测试,这一技术对于系统的整合和性能调优是非常有帮助的。
另外Teja NP在与Intel SDK等第三方软件的结合方面做得也很出色。Teja NP所生成的微码是完全符合Intel的可移植性框架(Portability Framework)要求的。原有的采用Intel SDK开发的微块(MicroBlock)可以很方便地导入(Import)到Teja NP的开发环境当中,所导入的微块在Teja NP当中被当作内嵌的组件(Inline Component)来处理。同样在Teja NP当中用于表示状态机逻辑的组件(Component)也可以方便地导出(Export)成微块,以供使用Intel SDK开发工具的有关人员来使用。
为了便于保护用于已有的开发成果以及便于与第三方软件的结合,Teja NP提供了本地源代码(Native Code)的方法,可以直接把已有的C代码或者汇编代码嵌入到Teja C代码当中。如果第三方的软件是以库文件的形式提供的,在Teja C当中可以直接调用库文件所提供的API。通过这种方法很好地保护了用户已有的投资和开发成果。
4 Teja IPv4转发模块在Radisys ENP2611平台上的应用
Teja NP Ipv4 转发模块(IPv4 Forwarding Foundation Application)为3层IPv4分类和转发应用提供了一个高性能的转发平面方案,极大地简化了基于IP的产品开发。这个协议构件块是以控制平面(Control Plane)和数据平面(Data Plane)的模块化组件形式开发的,这为开发人员快速构建复杂而高性能的增值产品提供了很好的基础。Teja NP IPv4 转发模块是一个完整遵循产品协议的构件块,它实现了Intel IXP2XXX NPU微引擎支撑的数据平面上POS和以太网IPv4包线速地RFC兼容处理(RFC 1812),也支持Xscale核控制平面上FIB(Forwarding Information Base)的路由管理。其中对性能提高起关键作用的是Teja 3层查找算法,它只使用最多3级查找来解析“下一跳”路由,同时还采用了特别的工程方法来突破线速转发平面包处理内存访问和带宽限制。
控制平面和数据平面使用通用的数据结构,以及在Xscale核和微引擎间的包传递通道进行通信。系统管理软件通过调用Teja Control Plane Date Plane (CPDP) 的API来实现接口的管理、FIB更新以及收发例外包,该API完全符合网络处理器论坛(Network Processor Forum,NPF)的有关标准。
目前,在网络系统和网络安全设备当中,运行在Xscale核上的嵌入式操作系统越来越多地采用嵌入式Linux。下面以RadiSys公司的ENP2611开发板为硬件平台,MontaVista Linux为运行在Xscale核上的嵌入式Linux操作系统,通过实现一个以Teja IPv4转发模块为基础的流媒体播放环境来介绍一下Teja IPv4模块在Intel IXP2400网络处理器上的具体应用。
编译Teja IPv4应用模块,需要两个不同的编译工具链,运行在Xscale核上的控制层面应用需要调用MontaVista Linux所提供的Xscale核交叉编译工具链来进行编译,运行在微引擎上的数据层面应用需要调用Intel SDK所提供的微码编译工具来进行编译。所以在编译Teja IPv4应用模块时,需要把MontaVista Linux交叉编译工具链所在的目录,以及Intel SDK微码编译工具所在的目录加到PATH环境变量当中,然后Teja NP就可以自动生成相关代码并调用相应的编译器来编译Teja IPv4应用了。
编译的结果主要得到三个文件,一个是运行在微引擎上的ixp2400.uof文件,另外一个是运行在Xscale核上的可执行代码Control_2611,该执行代码中包含由Teja NP所自动生成的把ixp2400.uof文件下载到微引擎,然后启动微引擎的有关代码。第三个文件Control_2611.sh是一个启动Control_2611及相关Teja服务的脚本文件。
因为MontaVista Linux对Intel IXP2XXX系列网络处理器提供了很好的支持,例如,提供了针对IXP2400的内核、交叉编译工具链、根文件系统以及其他相关的应用开发包,所以在ENP2611上部署嵌入式Linux的运行环境就变得非常简单,通常只需要进行一下几个步骤即可:
- 裁剪、编译一个可以在IXP2400 Xscale核上运行的Linux内核
- 配置在IXP2400 Xscale核上运行Linux所需的NFS、DHCP、TFTP等服务
- 把编译得到的Teja IPv4应用模块放到NFS服务所导出的目录下。
- 在ENP2611平台上搭建运行环境
实现流媒体的播放,需要有三台PC,一台运行Darwin流媒体服务器(Darwin Streaming Server)(在quicktime.apple.com上可以下载到),另外一台运行流媒体的客户端,第三台PC主要提供运行Linux所需的NFS、DHCP等有关的服务(该台机器上需要安装MontaVista Linux)。运行环境如下图所示:
图2 Teja NP IPv4模块应用实例连接图
其中的PC1和PC2的IP地址的子网掩码都是255.255.255.0,即他们处在不同的网段。ENP2611上运行Teja IPv应用模块(ENP2611和PC1相连的网口的IP地址为10.1.0.10,和PC2相连的网口的IP地址为10.2.0.10),通过Teja IPv4模块的转发功能实现了两个不同网段的数据包转发。配置当中需要注意分别把PC1和PC2的默认网关分别指向与他们相连的ENP2611的相应网口IP地址,并且需要在PC1和PC2中分别增加一条静态IP地址解释,用于解释ENP2611两个网口的IP地址和其对应的MAC地址。
搭建好了运行环境后,进行流媒体的播放就很容易了。在PC1上运行Darwin流媒体服务器(可以通过运行http://localhost:1220来对其进行配置),在PC2上打开一个流媒体播放器,输入“rtsp://PC1的IP地址/streamname.sdp”即可实现流媒体的播放。
结语
网络处理器的出现,很好地满足了网络带宽飞速增长和网络应用灵活多变的需求,但由此而来的是网络应用开发难度的大大增加。Teja NP通过提供一个集成化的开发环境,采用一种软、硬件分离、迟后联编方法、映射机制,以及代码自动生成方法,大大降低了网络处理器上应用软件的开发难度,可以比较显著地加快开发进度。
参考文献
转载《单片机与嵌入式系统应用》2006年第七期13页