没有合适的资源?快使用搜索试试~ 我知道了~
首页linux pci驱动总线开发
linux pci驱动总线开发
需积分: 9 9 下载量 26 浏览量
更新于2023-03-03
评论
收藏 157KB DOC 举报
以Intel 386体系结构为主,探讨了在Linux下开发PCI设备驱动程序的基本框架。
资源详情
资源评论
资源推荐
PCI 是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如 EISA)的新特性,
目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准。 Linux 的内核能较
好地支持 PCI 总线,本文以 Intel 386 体系结构为主,探讨了在 Linux 下开发 PCI 设备驱动
程序的基本框架。
一、PCI 总线系统体系结构
PCI 是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总
线接口标准,它在目前的计算机系统中得到了非常广泛的应用。 PCI 提供了一组完整的总
线接口规范,其目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式
连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了
计算机系统中的各个不同部件之间应该如何正确地进行交互。
无论是在基于 Intel 芯片的 PC 机中,或是在基于 Alpha 芯片的工作站上,PCI 毫无疑问都
是目前使用最广泛的一种总线接口标准。同旧式的 ISA 总线不同,PCI 将计算机系统中的
总线子系统与存储子系统完全地分开,CPU 通过一块称为 PCI 桥(PCI-Bridge)的设备来
完成同总线子系统的交互,如图 1 所示。
(CPU 与硬盘是通过什么总线连接的)
图 1 PCI 子系统的体系结构
由于使用了更高的时钟频率,因此 PCI 总线能够获得比 ISA 总线更好的整体性能。PCI 总
线 的 时 钟 频 率 一 般 在 25MHz 到 33MHz 范 围 内 , 有 些 甚 至 能 够 达 到 66MHz 或 者
133MHz,而在 64 位系统中则最高能达到 266MHz。尽管目前 PCI 设备大多采用 32 位数
据总线,但 PCI 规范中已经给出了 64 位的扩展实现,从而使 PCI 总线能够更好地实现平
台无关性,现在 PCI 总线已经能够用于 IA-32、Alpha、PowerPC、SPARC64 和 IA-64 等
体系结构中。
PCI 总线具有三个非常显著的优点,使得它能够完成最终取代 ISA 总线这一历史使命:
在计算机和外设间传输数据时具有更好的性能;
能够尽量独立于具体的平台;
可以很方便地实现即插即用。
图 2 是一个典型的基于 PCI 总线的计算机系统逻辑示意图,系统的各个部分通过 PCI 总线
和 PCI-PCI 桥连接在一起。从图中不难看出,CPU 和 RAM 需要通过 PCI 桥连接到 PCI 总
线 0(即主 PCI 总线),而具有 PCI 接口的显卡则可以直接连接到主 PCI 总线上。PCI-
PCI 桥是一个特殊的 PCI 设备,它负责将 PCI 总线 0 和 PCI 总线 1(即从 PCI 主线)连接
在一起,通常 PCI 总线 1 称为 PCI-PCI 桥的下游(downstream),而 PCI 总线 0 则称为
PCI-PCI 桥的上游(upstream)。图中连接到从 PCI 总线上的是 SCSI 卡和以太网卡。为
了兼容旧的 ISA 总线标准,PCI 总线还可以通过 PCI-ISA 桥来连接 ISA 总线,从而能够支
持以前的 ISA 设备。图中 ISA 总线上连接着一个多功能 I/O 控制器,用于控制键盘、鼠标
和软驱。
图 2 PCI 系统示意图
在此我只对 PCI 总线系统体系结构作了概括性介绍,如果读者想进一步了解, David A
Rusling 在 The Linux Kernel(http://tldp.org/LDP/tlk/dd/pci.html)中对 Linux 的 PCI 子系
统有比较详细的介绍。
二、Linux 驱动程序框架
Linux 将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是 Linux
内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux 内核与外部设备之间
的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作
普通文件一样来操作外部设备。
1. 字符设备和块设备
Linux 抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使
用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和 I/O 控制操作,而
驱动程序的主要任务也就是要实现这些系统调用函数。Linux 系统中的所有硬件设备都使
用一个特殊的设备文件来表示,例如,系统中的第一个 IDE 硬盘使用/dev/hda 表示。每个
设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使
用的驱动程序;另一个是次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文
件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将
无法访问到设备驱动程序。
在 Linux 操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符
设备是以字节为单位逐个进行 I/O 操作的设备,在对字符设备发出读写请求时,实际的硬
件 I/O 紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访
问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动
程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,
否则就调用相应的请求函数来进行实际的 I/O 操作。块设备主要是针对磁盘等慢速设备设
计的,其目的是避免耗费过多的 CPU 时间来等待操作的完成。一般说来,PCI 卡通常都属
于字符设备。
所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从/proc/devices 文件中
得到。使用 mknod 命令可以创建指定类型的设备文件,同时为其分配相应的主设备号和次
设备号。例如,下面的命令:
将建立一个主设备号为 6,次设备号为 0 的字符设备文件/dev/lp0。当应用程序对某个设备
文件进行系统调用时,Linux 内核会根据该设备文件的设备类型和主设备号调用相应的驱
动程序,并从用户态进入到核心态,再由驱动程序判断该设备的次设备号,最终完成对相
应硬件的操作。
2. 设备驱动程序接口
Linux 中的 I/O 子系统向内核中的其他部分提供了一个统一的标准设备接口,这是通过
include/linux/fs.h 中的数据结构 file_operations 来完成的:
!"#"$!$#
%"#"$&$%$!#
%"#"$&$%$!#
"#"$$#
"#"$'#
"#"$$$#
"#"$#
"#"$#
"(&#"#
"#"$#
")#"$$#
")#"$$#
"#"$$#
%"#"$$$!
#
%"#"$$$!
#
%"#"$$$%$!$#
剩余11页未读,继续阅读
yetaowho
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0