admin管理员组

文章数量:1531724

2024年6月3日发(作者:)

学术研究

Academic Research

Linux

环境下

PCI

设备驱动程序

    摘  要:本文在分析Linux驱动程序结构的基础上,详细介绍了一种Linux环境下网闸安全板

PCI驱动程序的设计方案,并结合实验结果对数据包长度和带宽之间的关系进行了分析。

马 肖  刘诗斌  肖永田/文

网闸的性能测试结果及结果分析。(1) PCI配置空间寄存器。PCI配

置空间独立于内存空间和I/O空间。

引  言

物理隔离网闸是带有多种控制功

能的、处于内外网之间的信息安全设

备。近年来在信息安全领域得到了越

来越广泛的应用。网闸是一个系统设

备,由外网主机、硬件通道、内网主

机三部分组成,其整体结构如图1所

示(虚线内的部分为网闸)。网闸可以

阻断内外网络之间基于通用网络协议

(例如TCP/IP协议)的数据通信,在

网闸一侧的主机上使用专用协议对数

据重新打包并通过PCI卡将其传递到

另一侧的主机上进行检测,“安全”的

数据将被恢复为通用网络协议的格式

并传送到目标主机,有效地遏制了基

于通用网络协议的攻击行为。作为内

外网服务器之间的数据通道,网闸

PCI卡承担了重要的角色,我们称该

PCI卡为安全板,两块安全板分别插

在内外网主机的PCI槽上,安全板之

间通过IDE总线进行通信。鉴于Linux

操作系统具有较高的稳定性与安全

性,网闸内外网的主机分别在Linux

平台上对数据进行处理。本文在参照

Linux-2.4.20内核源代码中的有关数

据结构和函数原型基础上设计并实现

了网闸安全板的驱动程序,并给出了

图2  安全板主控芯片的架构

2. 网闸安全板寄存器的设计

编写驱动程序离不开对设备寄存

器进行各种操作,在FPGA内部实现

网闸安全板的寄存器:PCI配置空间

寄存器和本地总线寄存器。PCI配置

寄存器是每一个PCI设备必须具备

的,它们在初始化中要用到;而设备

本地总线寄存器则在整个驱动程序中

都要被使用。下面对PCI配置空间寄

存器和安全板的本地

总线寄存器加以简要

图1  网闸的整体结构

介绍。

网闸安全板的硬件设计

1. 安全板主控芯片的架构

安全板使用FPGA(选用Xilinx公

司的XC2VP2-6FG256)作为主控芯

片。FPGA外围接口有PCI总线控制接

口、EEPROM控制接口与ATA控制接

口,芯片内部由PCI Master、FIFO与

ATA Master构成DMA数据通道。其

芯片的体系结构如图2所示。

它的大小为256B,其中低64B称为头

标区,这部分区域的格式是固定的,

内容包括:PCI设备号、厂商识别号、

命令寄存器、状态寄存器、基址寄存

器等重要信息;其余的192B称为设备

有关区,不同的设备可以对这部分寄

存器进行不同的定义。PC-AT兼容的

系统中使用CF8h和CFCh等两个双字

I/O单元来访问配置空间,有关配置

空间的详细信息请查阅相关资料。

(2) 网闸安全板的本地总线寄存

器。网闸安全板在本地总线上需要定

义必要的寄存器来保存本地总线的各

种信息,驱动程序可以对这部分寄存

器产生读写访问。本网闸采用散列表

模式的DMA传输方式,因此定义了与

之相关的寄存器。

本地总线定义的主要寄存器包

括:命令寄存器;状态寄存器;数据

发送缓冲区散列表基地址寄存器;数

据接收缓冲区散列表基地址寄存器;

数据传输长度寄存器。

Linux环境下的PCI设备

驱动程序

Linux将所有外部设备看成是一

类特殊文件,称之为“设备文件”,设

备驱动程序向应用程序屏蔽了硬件在

实现上的细节,使得应用程序可以像

46

WWW.cismag.com.cn

学术研究

Academic Research

操作普通文件一样来操作外部设备。中定义,这是Linux内核版本2.4之/* 读取PCI配置信息 */

Linux操作系统将外设分为字符后为新型的PCI设备驱动程序所添加card->iobase=pci_resource_start

设备、块设备、网络设备三种类型。字的,其中最主要的是用于识别设备的(dev,0);

符设备是以字节为单位逐个进行I/Oid_table结构,以及用于检测设备的card->dma_length = 0;

操作的设备,在对字符设备发出读写函数probe()和卸载设备的函数re-......

请求时,硬件I/O随即发生;块设备move()。/*在内核空间中动态申请内存

主要是针对磁盘等慢速设备设计的,(2) pci_dev。在<linux/pci.h>中,kmalloc返回逻辑地址*/

其目的是避免耗费过多的CPU时间来定义,详细描述了一个PCI设备几乎if((card==kmalloc(sizeof

等待操作的完成;网络设备通过BSD所有的硬件信息,包括厂商ID、设备(structnetb_card),GFP_KERNEL))

套接字界面实现数据存取。本文中的ID、各种资源等。==NULL){...}

网闸安全板属于字符设备。(3) file_operations。在<linux/fs./*申请I/O资源, card结构中包

1. PCI的地址空间h>中定义,描述了对一个设备所需含网闸安全板的若干信息*/

PCI设备上有三种地址空间:I/O要的各种操作函数,如open()、writeif(!request_region(card->iobase,

空间、存储空间以及配置空间。CPU()、ioctl()等。0x20,card->name))

可以访问PCI设备上的所有地址空{...}

间,其中I/O空间和存储空间提供给

网闸安全板PCI驱动程序

/*在缓冲区中为数据接收而建

设备驱动程序使用,而配置空间则由

的实现

立散列表,SCAT_GATH为散列表的

Linux内核中的PCI初始化代码使用。在本设计中,网闸安全板的驱动数据结构;PSCAT_GATH为指向

内核在启动时负责对所有PCI设备进程序主要由以下六个模块组成:设备SCAT_GATH的指针*/

行初始化,配置好所有的PCI设备,包初始化模块、设备开启模块、读写操card->rx_psg=(PSCAT_GATH)

括中断号以及I/O基址,并在文件/作及控制模块、中断处理模块、设备kmalloc(sizeof(SCAT_GATH) ,

proc/pci中列出所有找到的PCI设备,释放模块、设备卸载模块。下面重点GFP_KERNEL);

以及这些设备的参数和属性。介绍初始化、读写、中断处理三个模/*如果register_chrdev操作成

2. PCI驱动程序的基本框架块的设计方法:功,设备名将出现在/proc/devices文

在用模块方式实现PCI设备驱动—设备的初始化模块。在初始件里*/

程序时,通常要实现以下几个部分:化模块中,实现如下功能:探测并配result_reg = register_chrdev(250,

初始化设备模块、设备打开模块、数置网闸设备、申请分配各种资源(I/O

据读写和控制模块、中断处理模块、端口、中断号以及缓冲区)以及初始

设备释放模块、设备卸载模块。化硬件和变量等。如果在初始化探测

3. 关键数据结构以及申请分配资源时出现失败,则必

Linux驱动程序通常使用结构须根据失败的状态及时释放已分配的

(struct)来表示一种设备,而结构体资源。初始化处理流程如图3所示。

中的变量则代表某一具体设备,该变static int init_module(struct

量存放了与该设备相关的所有信息。pci_dev *dev)

好的驱动程序应该能驱动多个同类设{ ...

备,同类设备之间用次设备号进行区/*扫描PCI总线,如返回值为0,

分;如果采用结构数据来代表所有可说明系统未发现PCI设备*/

以由该驱动程序驱动的设备,就可以dev=pci_find_device

简单地使用数组下标来表示次设备(PCI_VENDOR_ID_netb ,

号。在PCI驱动程序中,下面几个关PCI_DEVICE_ID_netb,dev);

键数据结构起着非常核心的作用:/*启动PCI设备*/

(1) pci_driver。在<linux/pci.h>if(pci_enable_device(dev))

图3  PCI设备的初始化处理流程

信息安全与通信保密 .2005.4

47

学术研究

Academic Research

“tnetb”,&netb_fops);

—读写模块。字符设备的读写

操作相对比较简单,可直接调用函数

read()和write()来实现数据的读写。

读写操作的流程如图4和图5所示。

其中写操作的具体的部分代码

如下:

ssize_t netb_write(struct file

*filp,const char *buf,size_t count,

loff_t *f_pos)

{......

/*向安全板的命令寄存器写命

令,要求PCI设备开始DMA写传输*/

outb_p(DMA_START_TX,

dev->iobase+BUS_MASTER_CMD);

/*从用户空间拷贝数据到内核

空间*/

result =copy_from_user(dev->

dma_tx_buffer,(void*)buf,count);

......

static void netb_interrupt

(int irq, void *dev_id,struct

pt_regs *regs)

{  ......

/*读网闸安全板本地总线状态

寄存器的值

status = inb(card_int->iobase

+BUS_MASTER_STATUS);

if( ! (status & DMA_TX) ) /

*DMA读数据*/

{ /*主机从状态寄存器读取

DMA传输的数据长度*/

card_int->dma_length=inl

(card_int->iobase+DMA

_DATA_LENGTH);

/*清除状态寄存器中的中断标

志位*/

outb(status,card_int->iobase

+BUS_MASTER_STATUS);

......

else  /*DMA写数据*/

{...... }

图4  读数据处理流程

—中断处理模块。驱动程序

设计中,对于中断服务程序的处理

非常重要。中断处理程序首先负责

对中断进行识别,然后再做进一步

的处理。在本设计中,当一次DMA

传输完成时,产生一个中断信号;若

是接收数据中断,要读取接收数据

长度并唤醒读进程;若是发送中断,

要停止主设备发送并唤醒读进程。

最后,两种类型的中断处理例程都

性能测试与结果分析

网闸安全板以DMA方式传输数

据,驱动程序只做收发控制,因此传

要清中断标志位。其处理流程如图6

所示。

图5  写数据处理流程

read()函数处理功能很少,因

为接收缓冲区以及接收数据散列表都

在初始化模块中进行处理。write()

函数则不同,由于发送的数据长度

是可变的,故每次发送时需要构造

不同的发送散列表(但发送缓冲区可

以在初始化时分配)。

图6  中断服务程序处理流程

数据包长(KB)

图7  数据包长度对系统带宽的影响

输速率较高。为了分析安全板的性

能,我们用如下方法进行了测试:

内外网主机同时向对方不停地发送固

    本研究得到中科院计算所青年创新基金项目“可复用的IP软核及其

互连研究”(课题编号20026180-12)的支持。

48

WWW.cismag.com.cn

学术研究

Academic Research

视频压缩编码标准及其发展

    摘  要:本文论述了视频压缩的必要性和可能性,并着重介绍了MPEG系列视频压缩编码标准与

AVS标准及其发展。

殷晓莹  龚建荣/文

×240/288×3/2×8×30/25≈30Mbps

媒体与数据压缩

随着信息技术和互联网的飞速发展,消费类电子、通

信、电视电影广播、计算机技术日益紧密地结合起来,计

算机与通信、娱乐融合的趋势不可逆转,使得基于互联网

的多媒体产业成为本世纪初发展最快、规模最大的产业。

多媒体信息已成为人类获取信息的最主要载体,同时

也成为电子信息领域技术开发和研究的热点。多媒体信息

经数字化处理后具有易于加密、抗干扰能力强、可再生中

继等优点,但同时也伴随着海量数据的产生,这对信息存

储设备及通信网络提出了很高的要求,从而成为阻碍人们

有效获取和使用信息的重大瓶颈。

人类获取的信息中70%来自于视觉,视频信息在多

媒体信息中占有重要地位,但是数字化了的视频信号的数

据量之大是惊人的,如:

用于可视电话QCIF:176×144×3/2×8×30≈

9.1Mbps

用于视频会议CIF: 352×288×3/2×8×30≈

37Mbps

用于VCD、WWW、MPEG-1中等质量视频流SIF:352

用于DVD、SDTV、MPEG-2(4~8Mbps)高质量视频

流:720×480/576×3/2×8×60/50≈124Mbps

而用于传输通信的网络带宽是非常有限的:

PSTN:33.6Kbps,56Kbps

DDN:(1~31)×64Kbps,2048Kbps(E1和T1)

ISDN:(2B+D)144Kbps

ADSL/XDSL:1.1Mbps/1.5Mbps

LAN:10/100Mbps

GSM/GPRS/CDMA:9.6Kbps/(9.06~13.4~15.6~

21.4)Kbps/(64~144~384)Kbps

用于存储信息的存储媒质容量也是非常有限的:

CDROM:750MB

U盘:512MB

HardDisk:40~80GB  40G44分For124Mbps 40G8.2

分钟ForHDTV664Mbps

在这种情况下,数据压缩就变得非常必要了。而且由

于视频信息具有很强的相关性,存在着空间冗余、时间冗

余、视觉冗余、知识冗余、结构冗余等,使视频信息压缩

成为可能。

定长度的数据包,记录固定时间内

发送的数据包的总数,然后求平均

值,从而获得系统带宽的平均值。

在研究过程中,我们发现数据包的

长度与系统带宽存在密切的联系,

实验结果如图7所示。

网闸系统的开销由应用软件、

驱动程序及硬件三部分组成。当数

据包较小时,带宽较低且较稳定;当

数据包长度增加且数据包的增加幅

度相比系统开销的增加幅度更具优

势,则整个系统的带宽有较大幅度

的提高;当数据包增大到一定程度

时,系统开销也大幅度提高且PCI总

线可能存在访问冲突,导致带宽增

加缓慢且趋于恒定。

以上结论与分析对应用程序设

计有重要意义。在应用程序设计时,

选择大小合适的数据包能够显著提

高网闸系统的带宽性能。如图7所

示,当数据包大于50KB时,可以比

较充分地发挥网闸的性能。

结  语

我们设计的网闸安全板驱动程

序与Linux操作系统完全兼容,网闸

安全板能够完成预计功能而且运行

稳定。 

信息安全与通信保密 .2005.4

49

本文标签: 设备模块网闸寄存器驱动程序