现在的位置: 首页 > 综合 > 正文

从PC总线的发展看设备驱动程序的发展

2013年02月11日 ⁄ 综合 ⁄ 共 3136字 ⁄ 字号 评论关闭

PC总线的发展看设备驱动程序的发展

 

20100603修改版)

 

0 前言

 

让我们把时光倒流13年。

 

1997年,随着所谓“第一种能破坏硬件的Windows 95病毒”——CIH病毒的出现,之前很少有人感兴趣的Windows 95设备驱动程序技术——虚拟设备驱动程序(VxD)——这种被CIH病毒“歪用”来“破坏硬件”的技术,似乎一夜之间成为了“热点”。

 

笔者当时正对加密解密、反病毒和内核编程有着浓厚兴趣,于是也开始研究VxD,当时只要在书店里看到关于Windows设备驱动程序的书籍,不管是VxDNT Driver还是WDM,不管对于当时的笔者有多贵,都掏钱买下来看。

 

看着看着,觉得这些书怎么有些看不太懂啊?这些书里讲的更多的是总线、即插即用、USB之类的内容,没讲多少Windows内核编程呀?失望之余,一些书就这样被打入冷宫了。

 

2004年,笔者开始转向硬件和嵌入式系统开发,一块块电路板被制作出来,使用串口、USB接口……连接到PC上,需要开发USB设备驱动程序了……

 

嵌入式系统硬件和PC硬件原理本来就是相通的,一些当年很模糊的概念,逐渐变得清晰起来,再找出当年被打入冷宫的书籍一看,恍然大悟,原来是这样啊!Windows设备驱动程序是Windows内核应用程序没错,可是设备驱动程序的基本用途是驱动外设硬件,和硬件打交道是它们的基本工作,不弄懂硬件能真正看懂吗?

 

可是,现在设备驱动程序——“驱动”的名声似乎很不好,经常可以听到这样一些声音:

 

“这个病毒使用了驱动,难于查杀……”

“这个病毒使用了驱动,Windows连安全模式都进不了……”

“这个木马使用了驱动——Rootkits,隐藏自身,逃避检测……”

“这个恶意程序使用了Rootkits,清除不干净……”

“我们的XX杀毒软件,独有XX技术,专门对付Rootkits……”

 

本来用于驱动外设硬件的“驱动”,现在和病毒、黑客、Rootkits等让普通电脑用户“闻之色变”的一些名词挂上了钩。假如设备驱动程序有自我意识的话,它一定会觉得很冤枉:我本来不是用来干这些“坏事”的呀!谁让某些人把我“歪用”的呀!我好冤哪……

 

现在,是到了还设备驱动程序本来面目的时候了!

 

笔者准备写一组名为“硬件工程师学驱动”的系列文章,结合笔者这些年内核编程以及硬件开发的经验,向需要学习设备驱动程序开发的硬件工程师全景式地展现设备驱动程序的原理和开发方法。本系列文章不打算使用一般书籍中通过编程开始学习设备驱动程序开发的讲述模式,而使用一种较新颖的讲述模式:通过自制简单的外设硬件学习设备驱动程序开发,尽快让设备驱动程序开发与实际硬件相结合,还设备驱动程序本来面目!

 

当然,本系列文章也会讲述一些Windows内核编程的基本知识,以补充一些必需的背景知识,不过如果读者是想开发病毒或者Rootkits,笔者还是劝您不要看这个系列文章了,会让您很失望的。

 

本系列文章中的设备驱动程序,未经特殊说明,均指Windows设备驱动程序。

 

1 80868088 CPU开始谈总线

 

如果读者有大学计算机专业《微机原理》或者《微机原理与接口技术》的教材,不妨将它拿出来重新阅读一下。

 

您可能觉得这样做没有什么意义,大学教材很多内容都过了时,上述教材大部分内容还是讲基于8088(或者80868088CPU,可以说是最早型号的IBM PC微机。808816CPU,只能工作于实模式,今天的PC早已使用32位甚至64位的x86 CPU,工作于保护模式,保护模式和实模式连编程方式都不一样了,还读这些教材干什么?!

 

实际上,无论x86系列CPU怎样发展,从80868088一直到今天的Core i7,基本的硬件原理没有改变,至少冯·诺依曼体系结构没有变,PC采用总线结构以及外设连接在总线上的方式没有变,而且,由于“向下兼容”的需求,x86 CPU访问外设的一些基本方式,例如独立IO地址空间,一直没有改变。了解基于8088IBM PC怎样连接和访问外设,对于了解今天的PC怎样连接和访问外设,仍然不失其意义。

 

基于8088IBM PC系统板(主板)框图如图1-1所示(图1-1和图1-2来自超星数字图书馆中李克春主编的《IBM PC系列微机接口与通讯原理及实例》一书,19906月第1版)。

 

1-1  IBM PC系统板框图

 

IBM PC主板上,IO通道又称为PC总线或者PC/XT总线,现也称为8ISA总线。总线是一组信号线的集合,是计算机系统各部件之间传输地址、数据和控制信息的公共通路。总线的特点在于其公用性,可同时挂接多个部件或设备,对于只连接两个部件或设备的信息通道,不称为总线。PC总线插槽中可以插入显示卡、XT多功能卡等,用于连接显示器、软驱、硬盘、打印机等外设,也就是说外设最终连接到PC总线上。

 

容易看出,IBM PC主板上的PC总线是直接连接到IBM PC系统总线上的,IBM PC系统总线实际上是工作在最大模式下的8088系统总线。IBM PC系统总线框图如图1-2所示。

 

1-2  IBM PC系统总线框图

 

工作在最大模式下的8088系统总线包括数据总线、地址总线和控制总线,其中控制总线有两组读写信号,分别是内存(存储器)读写信号/MEMR(信号前的正斜线表示低电平有效,下同)和/MEMW,以及外设(IO端口)读写信号/IOR/IOW,这两组不同的读写信号分别受8088MOV指令以及INOUT指令控制。

 

因此,8088访问内存使用MOV指令,当PC总线连接有外设时,如果外设带有存储器并映射到内存地址空间(例如显卡显存),也使用MOV指令访问,但访问外设使用INOUT指令,这样我们称8088有着“独立IO地址空间”。实际上,所有x86系列CPU都有独立IO地址空间,时至今日,x86 CPU访问外设,归根结底是使用MOVINOUT指令。

 

如果外设和CPU之间采用中断方式完成通信,那么外设还要能够引发CPU中断,为了管理多个硬件中断源,通常将外设中断请求信号通过可编程中断控制器(PIC)连接到CPU芯片中断引脚上。PC总线插槽中有连接到PIC——8259的引脚(图1-1中未画出),这样一来连接到PC总线上的外设即可使用中断方式与8088完成通信。时至今日,PC中的PIC仍然具有8259的功能。

 

2 PC总线的发展

 

随着基于80286 CPUIBM PC/AT微机和兼容机(286微机)的推出,PC总线——8ISA总线发展成为16ISA总线。但无论是8位还是16ISA总线,ISA总线仍然可以认为是直接连接到CPU的系统总线,ISA总线中的中断请求信号仍然可以认为是直接连接到8259,这意味着CPU使用MOVINOUT指令还是可以直接访问ISA总线设备,ISA总线设备也还是可以直接使用中断方式与CPU完成通信。

 

基于80386 CPUIBM PS/2微机使用了非开放标准的MCA(微通道)总线,迫使兼容机厂商在基于80386的兼容机(386微机)上继续使用ISA总线,这样一来使得ISA总线有了顽强的生命力,ISA总线设备直到19951996年仍然大量存在,此时Windows 95Windows NT 4.0已相继推出。

 

ISA总线生命力虽顽强,但无法实现32位数据传输,传输速度有限,为了解决这些问题,出现了各种新的PC总线标准,有代表性的是PCI总线(严格地说是PCI局部总线)。关于PCI总线的细节,例如北桥芯片、南桥芯片等,不是本文准备讨论的问题,感兴趣的读者可以参考相关资料。ISA总线设备通常需要手工配置,配置不当容易引起内存地址空间、IO地址空间或者IRQ冲突,即插即用(PnP

抱歉!评论已关闭.