- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 硬件管理
尽管通过玩玩scull和类似的一些玩具程序来熟悉Linux设备驱动程序的软件接口显得很轻松,但是测试真正的设备还是要涉及硬件。驱动程序是软件概念和硬件设备间的一个抽象层;因此,我们两者都要谈谈。到目前为止,我们已经详细讨论了软件上的一些概念;本章将接着介绍驱动程序是如何在保证可移植的前提下访问I/O端口和I/O地址空间的。
和前面一样,我的示例代码也不针对特定的设备。但是我们不能再用象scull这样的基于内存的设备。本章的例子使用并口设备来讲解I/O指令,使用字符模式VGA卡的显示缓冲区来讲解基于内存映射的I/O。
这里我选择并口的原因是它能提供位信息的输入输出。写向设备的数据位出现在输出引脚上,而输入引脚的电压值可以由处理器控制。实际上,你可以将LED连到并口上来观察I/O操作的结果。并口比串口更容易编程,而且几乎每台计算机(甚至Alpha)都和PC机一样提供了并口。
至于基于内存映射的I/O,字符模式的VGA是标准的内存映射设备,而每台计算机都有VGA兼容的字符模式。遗憾的是,不是每台Alpha都有VGA显示卡,Sparc就肯定没有,所以我们的与VGA有关的代码就不象并口的例子那样可以移植了。并且,为了运行示例程序,你要切换到字符模式下,但这并不是个太大的限制。用VGA显示卡上上内存做实验可能造成的最大问题是示例驱动程序不可避免地会破坏前台的虚拟控制台。
使用I/O端口
I/O端口有点类似内存位置:可以用和访问内存芯片相同的电信号对它进行读写。但这两者实际上并不一样;断口操作是直接对外设进行的,和内存相比更不灵活。而且,有8位的端口,也有16位的端口和32位的端口,不能相互混淆*。
因此,C语言程序必须调用不同的函数来访问大小不同的端口。Linux内核头文件中(就在与体系结构相关的头文件asm/io.h中)定义了如下一些内联函数。
———————————————————————————————————————
注意 从现在开始,如果我只使用unsigned而不进一步指定类型信息的话,那我是在谈及一个与体系结构相关的定义,此时就不必关心它的准确特性。这些函数基本是可移植的,因为编译器在赋值时会自动进行强制类型转换(cast)-类型被强制转换成unsigned类型防止了编译时出现的警告信息。只要程序员赋值时注意避免溢出,这种强制类型转换就不会丢失信息。在本章剩余部分我会一直保持这种“不完整的类型定义”的方式。
———————————————————————————————————————
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
按字节(8位宽度)读写端口。port参数在一些平台上定义为unsigned long,而在另一些平台上定义为unsigned short。不同平台上inb返回值的类型也不相同。
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
这些函数用于访问16位端口(“字宽度”);Linux的M68k版本不提供,因为该处理器只支持字节宽度的I/O操作,unsigned inl(unsigned port);
void outl(unsigned doubleword, unsigned port);
这些函数用于访问32位端口。doubleword参数根据不同平台定义成unsigned long类型或unsigned int类型。
除了每次只能传输一个数据单位的in和out操作,绝大多数处理器还提供了能传输多个字节,字或long类型数据的特殊指令。这些指令就是所谓的“串指令”,将在本章稍后处的“串操作”一节中介绍。
注意这里没有定义64位的I/O操作。即使在64位的体系结构上,I/O端口也只使用32位的数据通路。
上面这些函数主要是提供给设备驱动程序使用的,但它们也可以在用户空间使用(预处理定义和内联声明没有用#ifdef __KERNEL__保护)。但是如果要在用户空间代码中使用inb及其相关函数,必须满足下面这些条件:
编译该程序时必须带-O选项来强制内联函数的展开。
必须用ioperm或iopl来获取对端口进行I/O操作的权限。ioperm用来获取对指定端口的操作权限,而iopl用来获取对整个I/O空间的操作权限。这两个函数都是Intel平台提供的。
必须以root身份运行该程序才能调用ioperm。或者,该程序的某个祖先已经以root身份获取了对端口操作的权限。
示例程序misc-progs/inp.c和misc-progs/outp.c是在用户空间通过命令行读
您可能关注的文档
- 德日苏宝冷水库管理局领导班子2014年度工作目标承诺.doc
- 德馨书院学生谈话记录.doc
- 德阳市供销合作社联合社.doc
- 德阳外国语学校2011至2012学年初2014级七年级上学期期中.doc
- 德育活动:飞凤呈祥.doc
- 登记类别: 注册 备案.doc
- 等比数列前n项和 第1课时.doc
- 低段朗读教学的误区及基本策略.doc
- 低段学生数学阅读能力培养的策略研究.doc
- 低年级情境下的语言训练.doc
- 浙江省平阳中学2025-2026学年高三上学期8月开学考地理试题 Word版无答案.docx
- 浙江省七彩阳光新高考研究联盟2025-2026学年高三上学期返校联考历史试题 Word版无答案.docx
- 浙江省Z20名校联盟(名校新高考研究联盟)2025-2026学年高三上学期第一次联考历史试卷 Word版无答案.docx
- 浙江省七彩阳光新高考研究联盟2025-2026学年高三上学期返校联考物理试题 Word版无答案.docx
- 单元总结提升.pptx
- 第22课 从局部抗战到全国抗战(练习,含解析).docx
- 浙江省强基联盟2025-2026学年高三8月联考语文试题 Word版无答案.docx
- 2024土工合成材料塑料土工格室.pdf
- 第23课 全民族浴血奋战与抗日战争的胜利.pptx
- 第23课 全民族浴血奋战与抗日战争的胜利.docx
文档评论(0)