高性能路由器硬件抽象层的关键技术研究
时间:10-11
来源:互联网
点击:
1 引言
随着Internet的飞速发展和宽带技术的不断出现,骨干网络核心路由器的体系结构也发生了一些变化。近年来,高性能路由器体系结构的研究和国内外主流厂商生产的大部分商用高端路由器的实现方案中,普遍采用了集中式交换、分布式报文处理和转发的体系结构。
文献提出了硬件抽象层(Hardware AbstractionLayer,HAL)的设计思想,成功地解决了分布式路由器面临的通用性支撑软件系统结构设计问题,为构建开放通用的路由器软件基础平台提供了保证。硬件抽象层包括虚拟驱动、系统管理和内部通信3大模块,在整个路由器系统中的位置如图1所示。
结合国家863重大课题“高性能IPv6路由器基础平台及实验系统”,将文献中提出的硬件抽象层在嵌入式实时操作系统Hard HatLinux中进行了实现。本文针对高性能路由器体系结构的特点,研究了硬件抽象层在实现过程中的关键技术。主要包括虚拟驱动的动态加载模式、基于分隔符的TCP实时传输方法、基于地址映射的内核态与用户态间的阻塞式数据交换机制几个内容。
2 支撑软件在高性能IPv6路由器中实现的关键技术
2.1 虚拟驱动的动态加载模式
虚拟驱动模块是模拟线路接口单元动作的重要部分,他的灵活性和可扩展性直接影响硬件抽象层的可用性。
在Linux操作系统下,该模块是作为一个内核模块来实现的。他可以实现实时动态加载,与静态加载相比具有很大的灵活性。编译时,内核模块可单独进行模块的编译调试,缩短了调试时间;使用时,将该模块链接到内核,便可发挥模拟线路接口单元的作用;扩展或升级时,可以将其卸载后进行修改。除此之外,动态加载还可以缩减Linux内核的大小,使编译后的内核小巧,占用内存较少,提高了运转速度。
2.2 基于地址映射的内核态与用户态间的阻塞式数据交换机
Linux操作系统中的进程分为用户态进程和内核态进程2类,用户态进程不能直接执行运行在内核态的内核代码或者存取操作系统内核的数据结构。在内存管理方面,Linux系统采用虚拟内存管理机制,设置了两级页表结构,通过页面地址和在该页中的偏移量就可以惟一确定虚拟地址所对应的物理地址。
在硬件抽象层的实现中,内部通信处于用户态,虚拟驱动处于内核态。而他们之间不可避免地需要进行一些数据的传递,即处于Linux 不同空间的2个进程要进行通信。但是,这2个模块分处于Linux系统的用户空间和内核空间,数据指针如何传递是一个问题,指针传递后如何映射又是一个问题。因此用户态与内核态之间内存地址的传递和转换成为了提高硬件抽象层工作效率的关键。
2.2.1 内核态与用户态的指针传递
先来解决内存地址的传递问题,根据Linux驱动程序的特点,选择ioctl()函数来传递指针。该函数属于系统调用,调用后将一个类型为ifreq的结构指针变量ral_ifr从用户态传入内核态,该结构的定义在/include/linux/if.h中。
使用了其中的ifrn_name和ifru_data两个域,其中ifrn_name代表设备的名称,即虚拟网络接口设备名,ifru_data为所要传递的数据指针。使用系统调用ioctl()之后,用户空间到内核空间的指针传递就完成了。内核空间到用户空间的指针传递过程与其相反。因此,下一步要进行的是内核空间与用户空间数据指针的映射。
2.2.2 内核态与用户态的内存映射
由2.2.1可知,用户空间的指针通过ioctl传入内核空间后,他本身并没有发生改变,需要进行虚拟地址到物理地址的映射才可以对其进行读写操作。
由文献分析可知,可以使用内核kiobuf机制,他能提供从内核空间对用户内存的直接访问。内核kiobuf机制的设计初衷就是为了便于将用户空间的缓冲区映射到内核。使用他能够获得数据的页面起始位置、页数和偏移量等具体参数,因此可在内核空间对用户态申请的内存进行操作。
首先分配一个内核I/O向量(kiovec)来产生kiobuf,使用函数如图2所示。
然后再对其进行初始化,如图3所示。
最后,将通过ioctl传入的用户空间指针ifru_data映射到内核态,使用函数map_user_kiobuf,如图4所示。
这样就完成了将指针由用户空间映射到内核空间的过程,实现了从虚拟地址向物理地址的转换。
至此,内核空间与用户空间的内存映射问题得到了很好的解决。通过解决内存地址映射的问题,内部通信和虚拟驱动之间就可以只传递数据指针,大大提高了模块的运行效率。
2.3 基于分隔符的TCP实时传输方法
2.3.1 Nagle算法的弊端
糊涂窗口综合症(Silly WindowSyndrome)的出现使网络开销过大,从而造成TCP性能变坏。根据文献所述,糊涂窗口综合症的解决方法就是采用文献中所建议的Nagle算法。但是在实际应用时发现,Nagle算法的不足之处主要有2点:
(1)在限制数据报头部信息消耗的带宽总量的同时,是以牺牲网络延迟为代价的。
(2)在发送方的缓冲区中,应用程序发送的数据包发生了粘滞的现象,即发送的若干数据包到接收方接收时变成一包,分不出各个包的界线。
前者因为数据被排队而不是立即发送的,因此不适用于需要快速响应时间的系统。后者则会影响到接收方的数据处理的准确性。第一种不足可以通过使用PUSH标记来实现,发送方如果使用了该标志,会立即将缓冲区中的数据发送出去。对于第二个问题,解决起来就比较复杂,因为出现数据包粘滞现象的原因既可能由发送方造成,也可能由接收方造成。
随着Internet的飞速发展和宽带技术的不断出现,骨干网络核心路由器的体系结构也发生了一些变化。近年来,高性能路由器体系结构的研究和国内外主流厂商生产的大部分商用高端路由器的实现方案中,普遍采用了集中式交换、分布式报文处理和转发的体系结构。
文献提出了硬件抽象层(Hardware AbstractionLayer,HAL)的设计思想,成功地解决了分布式路由器面临的通用性支撑软件系统结构设计问题,为构建开放通用的路由器软件基础平台提供了保证。硬件抽象层包括虚拟驱动、系统管理和内部通信3大模块,在整个路由器系统中的位置如图1所示。
结合国家863重大课题“高性能IPv6路由器基础平台及实验系统”,将文献中提出的硬件抽象层在嵌入式实时操作系统Hard HatLinux中进行了实现。本文针对高性能路由器体系结构的特点,研究了硬件抽象层在实现过程中的关键技术。主要包括虚拟驱动的动态加载模式、基于分隔符的TCP实时传输方法、基于地址映射的内核态与用户态间的阻塞式数据交换机制几个内容。
2 支撑软件在高性能IPv6路由器中实现的关键技术
2.1 虚拟驱动的动态加载模式
虚拟驱动模块是模拟线路接口单元动作的重要部分,他的灵活性和可扩展性直接影响硬件抽象层的可用性。
在Linux操作系统下,该模块是作为一个内核模块来实现的。他可以实现实时动态加载,与静态加载相比具有很大的灵活性。编译时,内核模块可单独进行模块的编译调试,缩短了调试时间;使用时,将该模块链接到内核,便可发挥模拟线路接口单元的作用;扩展或升级时,可以将其卸载后进行修改。除此之外,动态加载还可以缩减Linux内核的大小,使编译后的内核小巧,占用内存较少,提高了运转速度。
2.2 基于地址映射的内核态与用户态间的阻塞式数据交换机
Linux操作系统中的进程分为用户态进程和内核态进程2类,用户态进程不能直接执行运行在内核态的内核代码或者存取操作系统内核的数据结构。在内存管理方面,Linux系统采用虚拟内存管理机制,设置了两级页表结构,通过页面地址和在该页中的偏移量就可以惟一确定虚拟地址所对应的物理地址。
在硬件抽象层的实现中,内部通信处于用户态,虚拟驱动处于内核态。而他们之间不可避免地需要进行一些数据的传递,即处于Linux 不同空间的2个进程要进行通信。但是,这2个模块分处于Linux系统的用户空间和内核空间,数据指针如何传递是一个问题,指针传递后如何映射又是一个问题。因此用户态与内核态之间内存地址的传递和转换成为了提高硬件抽象层工作效率的关键。
2.2.1 内核态与用户态的指针传递
先来解决内存地址的传递问题,根据Linux驱动程序的特点,选择ioctl()函数来传递指针。该函数属于系统调用,调用后将一个类型为ifreq的结构指针变量ral_ifr从用户态传入内核态,该结构的定义在/include/linux/if.h中。
使用了其中的ifrn_name和ifru_data两个域,其中ifrn_name代表设备的名称,即虚拟网络接口设备名,ifru_data为所要传递的数据指针。使用系统调用ioctl()之后,用户空间到内核空间的指针传递就完成了。内核空间到用户空间的指针传递过程与其相反。因此,下一步要进行的是内核空间与用户空间数据指针的映射。
2.2.2 内核态与用户态的内存映射
由2.2.1可知,用户空间的指针通过ioctl传入内核空间后,他本身并没有发生改变,需要进行虚拟地址到物理地址的映射才可以对其进行读写操作。
由文献分析可知,可以使用内核kiobuf机制,他能提供从内核空间对用户内存的直接访问。内核kiobuf机制的设计初衷就是为了便于将用户空间的缓冲区映射到内核。使用他能够获得数据的页面起始位置、页数和偏移量等具体参数,因此可在内核空间对用户态申请的内存进行操作。
首先分配一个内核I/O向量(kiovec)来产生kiobuf,使用函数如图2所示。
然后再对其进行初始化,如图3所示。
最后,将通过ioctl传入的用户空间指针ifru_data映射到内核态,使用函数map_user_kiobuf,如图4所示。
这样就完成了将指针由用户空间映射到内核空间的过程,实现了从虚拟地址向物理地址的转换。
至此,内核空间与用户空间的内存映射问题得到了很好的解决。通过解决内存地址映射的问题,内部通信和虚拟驱动之间就可以只传递数据指针,大大提高了模块的运行效率。
2.3 基于分隔符的TCP实时传输方法
2.3.1 Nagle算法的弊端
糊涂窗口综合症(Silly WindowSyndrome)的出现使网络开销过大,从而造成TCP性能变坏。根据文献所述,糊涂窗口综合症的解决方法就是采用文献中所建议的Nagle算法。但是在实际应用时发现,Nagle算法的不足之处主要有2点:
(1)在限制数据报头部信息消耗的带宽总量的同时,是以牺牲网络延迟为代价的。
(2)在发送方的缓冲区中,应用程序发送的数据包发生了粘滞的现象,即发送的若干数据包到接收方接收时变成一包,分不出各个包的界线。
前者因为数据被排队而不是立即发送的,因此不适用于需要快速响应时间的系统。后者则会影响到接收方的数据处理的准确性。第一种不足可以通过使用PUSH标记来实现,发送方如果使用了该标志,会立即将缓冲区中的数据发送出去。对于第二个问题,解决起来就比较复杂,因为出现数据包粘滞现象的原因既可能由发送方造成,也可能由接收方造成。
- 蓝牙无线电调制解调器Siw1701原理与应用(02-19)
- 嵌入式移动数据库的关键技术(03-20)
- 在嵌入式SQL中怎样使用游标(08-12)
- 嵌入式Linux系统软件开发学习思路详细介绍 (08-20)
- 基于AVR单片机的嵌入式“瘦服务器”系统设计思想(03-11)
- 嵌入式系统设计中的存储碎片收集策略(05-04)