高性能路由器硬件的关键技术研究

http://tech.ddvip.com   2007年09月17日    社区交流 收藏本文

内容摘要:本文针对高性能路由器体系结构的特点,研究了硬件抽象层在实现过程中的关键技术。主要包括虚拟驱动的动态加载模式、基于分隔符的TCP实时传输方法、基于地址映射的内核态与用户态间的阻塞式数据交换机制几个内容。

  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传入内核空间后,他本身并没有发生改变,需要进行虚拟地址到物理地址的映射才可以对其进行读写操作。

  由文献[4]分析可知,可以使用内核kiobuf机制,他能提供从内核空间对用户内存的直接访问。内核kiobuf机制的设计初衷就是为了便于将用户空间的缓冲区映射到内核。使用他能够获得数据的页面起始位置、页数和偏移量等具体参数,因此可在内核空间对用户态申请的内存进行操作。

责编:豆豆技术应用

正在加载评论...