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方式传输数
据,驱动程序只做收发控制,因此传
数
据
传
输
率
(
M
b
p
s
)
列
列
要清中断标志位。其处理流程如图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
版权声明:本文标题:Linux环境下PCI设备驱动程序 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1717424282a570601.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论