深入理解驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入理解驱动程序
一直以来,发现很多搞上层软件的朋友没有时间了解CPU、编译器、操作系统等底层技术,偶恰好在计算机微体系结构与集成电路实验室,有幸接触到这些底层的东东,所以想写一些自己以前学这些东东的感想,以消除对底层技术不熟悉的朋友对底层技术的神秘感,同时想和搞底层技术的朋友切磋切磋,共同提高。当然偶所谈的内容都不是先进或深奥的,而是最直观和最容易理解的,偶所写的文章不是阐述各个专题的专著,而是入门读物,希望读者读完偶的文章后具有读懂各个专题专著的能力。
闲话少说,让我们切入正题。我们从驱动程序出发,慢慢讲解计算机的各个部分是如何各自为政,而又互相协作,从而完全各种复杂功能的。本文的题目虽然叫《深入理解驱动程序》,但其实“文不对题”,本文不具体阐述如何编写驱动程序,而是从体系结构的观点着手,力争用通俗易懂的语言阐述各种外设的共同特点,使读者具备举一反三、融会贯通、驾驭各种外设的能力。另外,笔者喜欢从不同的角度分析同一个问题,所以行文中难免出现重复的内容,累赘的阐述,笔者正是希望通过这种重复和累赘来加深读者对所述内容的理解。计算机发展到今天,其外设早已是五花八门,象硬盘、软盘、光盘、U盘、鼠标、键盘、声卡、网卡、SD卡、手柄等等,真是层出不穷。五花八门的外设给我们带来便利的同时也带来了许多问题,比如:主板上的接口个数有限,怎样保证各种离奇古怪的外设能连接主板并跟主机通信?怎样保证CPU能一个不漏地控制外设工作?CPU
能够控制什么样的外设?CPU对外设的控制能达到什么程度?怎样保证CPU不会误操作外设?怎样保证外设之间不会“打架”、互相干扰?外设怎样向CPU报告处理结果?多个进程怎样共享外设?高级语言怎样支持驱动程序的编写?外设怎样给CPU提供配置信息等等,这些问题是否让各位看官头大了?不要紧张,且听我慢慢道来。
首先,讲讲外设的基本构成。每个外设都有一个控制器,这个控制器是数字电路,控制器里有一些叫“寄存器”的存储单元,这些东东的物理结构跟内存单元不一样,但作用跟内存单元一样,都能保存信息。寄存器各有各的作用,比如:软驱、硬盘上有保存磁头号、磁道号、扇区号等参数的寄存器,这些寄存器的值告诉硬盘这次读磁盘操作要读的是哪个盘面哪个磁道哪个扇区的数据。根据寄存器的作用,可将寄存器分为两类,分别叫控制寄存器和状态寄存器。控制寄存器用来告诉外设:CPU要求它干什么活以及它干活时需要的参数;状态寄存器用于外设向CPU报告外设目前的状态,比如,外设目前在干什么活,在干活的过程中是否发生了错误,外设是否还有能力接受新任务等等,状态寄存器没有能力主动告诉CPU外设当前的状态,而是被动地等待着CPU来取状态信息,CPU把状态寄存器的值读出来就能知道外设当前的工作状态。当然,外设也有主动报告CPU的能力——中断。寄存器有的是只写的,有的是只读的,还有的是可读可写的。一般而言,控制寄存器是只写或可读可写的,状态寄存器是只读的。除了控制器外,大多数外设还有一个用来具体干活的模拟电路,如硬盘有控制磁头移动、盘片转动的模拟电路,打印机有控制打
印纸滚动,控制喷墨或打印针击打打印纸的模拟电路,MP3有数模转换器和功率放大器等等。控制器和模拟电路通常是集成在一块芯片里,这种集成电路叫数模混合电路。数模混合电路是目前IT领域颇具挑战性的技术之一,如果某天你能设计数模混合电路了,那么恭喜你,这辈子你再也不用愁吃穿住行了!当然,也有纯数字电路的外设,如DMA控制器。以前的外设由于技术不成熟,其控制器、模拟电路、电机等部件是分离的,现在大多数外设把控制器、模拟电路及电机、盘片(如果有的话)等等各个部件集成在一起,如硬盘。有的外设只是把控制器、模拟电路及电机集成在一起,盘片是可移动的,如光驱、软驱。这种把控制器、模拟电路及电机等部件集成在一起的外设称为智能外设。
那么,怎样保证CPU能一个不漏地控制多个外设呢?原来,多个外设和CPU都挂在一组总线上,硬件工程师给外设的每个寄存器都分配一个地址,CPU拿一个地址去访问某个寄存器时,只有该寄存器发生动作,或接收数据总线上的数据(对应于写操作),或把自己的数据送到数据总线上(对应于读操作),同一个外设的其他寄存器和其他外设的寄存器都不会动作。这样,CPU用不同的地址就可以访问不同的寄存器,也就可以一个不漏地控制多个外设了。CPU访问某个寄存器时,别的寄存器不会发生动作,所以,外设之间不会“打架”、不会互相干扰。同样地,CPU访问内存时,其地址不是外设的寄存器的地址,所有的外设都不会动作,所以CPU不会误操作外设。
根据外设的基本结构,你是否已经猜到CPU控制外设的能力了?
显然,CPU控制外设的方法和能力无非就是读写寄存器。比如,CPU 要从硬盘读文件,那么CPU只需要把磁头号、磁道号、扇区号、要读的数据量等参数填入硬盘控制器的对应寄存器,然后向硬盘控制器的对应寄存器填一个开始命令,硬盘控制器就命令接在其后面的模拟电路开始工作——如:控制电机移动磁头到对应的磁道、对准扇区,读数据等等。至于磁头目前在什么位置,怎样移动到对应的磁道,顺指针移动还是逆时针移动,以多快的速度移动,磁头移动到对应磁道后以多大的加速度减速等等,这些事情不是CPU所能控制的,而是由硬盘控制器和接在硬盘控制器后面的模拟电路共同控制的。遗憾的是,集成电路和印制电路板(PCB板)的技术已经很成熟,硬盘控制器、接在硬盘控制器后面的模拟电路以及磁头、盘片、控制磁头移动的电机等部件早已集成在一个小小的长方体盒子里,我们已经没有机会一睹各个部件的芳容了。总之,CPU只能控制外设中数字部分的程序员可见的寄存器,无法控制程序员不可见的寄存器,更加无法控制模拟电路、电机等部件,也就是说CPU只能告诉外设要干什么活以及干活过程中需要的参数,至于外设是怎么干活,如:硬盘怎么移动磁头、音频芯片怎么把数字信号转成模拟信号,怎么把模拟信号放大等等,这些事情是CPU无法控制的。
外设一般有两种方式报告CPU外设的工作状态——程序查询方式和中断方式。程序查询方式就是利用状态寄存器报告CPU外设的工作状态,外设只需要把其工作状态的信息填到状态寄存器里,可惜的是状态寄存器没有能力主动告诉CPU它里面的值是多少,而只能