- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
I-O端口编程
下载
下载
第22章 Linux I/O端口编程
本章介绍有关Linux I/O端口编程的内容,如在C语言下使用I / O端口、硬件中断与I M A存取
等方面的内容。
22.1 如何在 C 语言下使用I/O端口
22.1.1 一般的方法
用来存取 I/O 端口的子过程都放在文件 /usr/include/asm/io.h 里(或放在内核源代码程序的
linux/include/asm-i386/io.h 文件里) 。这些子过程是以嵌入宏的方式写成的,所以使用时只要以
#includeasm/io.h 的方式引用就够了,不需要附加任何函数库。
因为 g c c 以及 e g c s 的限制,你在编译任何使用到这些子过程的源代码时必须打开最优化选
项 (gcc -O1或较高层次的) ,或者在做 #include asm/io.h 这个动作前使用 #define extern 将
extern 定义成空白。
为了除错的目的,你编译时可以使用 gcc -g -O (至少现在的 gcc 版本是这样) ,但是最优化
之后有时可能会让调试器的行为变得有点奇怪。如果这个状况对你而言是个困扰,你可以将所
有使用到 I / O端口的子过程集中放在一个文件里,并只在编译该文件时打开最优化选项。
在你存取任何 I/O 端口之前,你必须让程序有如此做的权限。要完成这个目的,你可以在
程序一开始的地方 (但是,要在任何 I/O 端口存取动作之前) 调用 i o p e r m ( )这个函数 (该函数在
文件 u n i s t d . h 中,并且被定义在 内核中) 。 使用语法是 i o p e r m ( f r o m ,n u m ,t u r n _ o n ) ,其中
from 是第一个允许存取的 I/O 端口地址,n u m 是接着连续存取 I/O 端口地址的数目。 例如,
i o p e r m ( 0 x 3 0 0 ,5,1 )的意思就是说允许存取端口 0x300 到 0x304 ( 一共五个端口地址) 。
而最后一个参数是一个布尔代数值,用来指定是否给予程序存取 I/O 端口的权限 (true (1))
或者除去存取的权限 (false (0)) 。 你可以多次调用函数 i o p e r m ( ) 以便使用多个不连续的端口地
址。
你的程序必须拥有 root 权限才能调用函数 ioperm() ; 所以你如果不是以 r o o t身份执行该程
序,就得将该程序设置成 r o o t 。 当你调用过函数 ioperm() 打开I/O 端口的存取权限后你便可以
拿掉 root 的权限。在你的程序结束之后并不特别要求你以 i o p e r m ( . . . ,0) 这个方式拿掉 I/O 端
口的存取权限; 因为当你的程序执行完毕之后,这个动作会自动完成。
调用函数 setuid() 将目前执行程序的有效用户识别码 (ID) 设定成非 r o o t 的用户,并不影响
其先前以 ioperm() 的方式所取得的 I/O 端口存取权限,但是调用函数fork() 的方式却会有所影
响 (虽然父进程保有存取权限,但是子进程却无法取得存取权限 ) 。
函数 ioperm() 只能让你取得端口地址 0x000 到 0 x 3 ff 的存取权限; 至于较高地址的端口,
你得使用函数 iopl() (该函数让你一次可以存取所有的端口地址) 。将权限等级参数值设为 3 (例
如,i o p l ( 3 ) ) ,以便你的程序能够存取所有的I/O 端口(因此要小心,如果存取到错误的端口地址
将对你的计算机造成各种不可预期的损害。同样地,调用函数 iopl() 你得拥有 root 的权限。
接着,我们来实际地存取 I/O 端口。要从某个端口地址输入一个字节 ( 8位) 的信息,你得调
用函数 inb(port) ,该函数会传回所取得的一个字节的信息。要输出一个字节的信息,你得调
第22章计Linux I/O 端口编程计计241
下载
用函数 o u t b ( v a l u e ,port) ( 请记住参数的次序) 。要从某
您可能关注的文档
- H.264变换编码与量化原理分析.pdf
- H.264标准二进制算术编码IP核设计.pdf
- H.264编解码器方案综述.pdf
- G臂使用注意事项.doc
- H264及相关视频编码标准论述.pdf
- H2在金属钾修饰碳纳米管上的吸附与储存.pdf
- H3CAC+FitAP本地MAC地址认证功能.pdf
- H9350 FreeWIFI多媒体终端技术规格书20140930.pdf
- Hacker常用WinAPI函数整理.pdf
- HACCP体系在餐饮业食品安全管理中的应用.pdf
- 安全生产考核奖惩制度3篇.doc
- 颅脑损伤病人的护理查房【优质公开课】精品PPT课件模板.pptx
- 二零二二年度德州继续教育公需科目《公共事务管理与服务能力》试题及答案.pdf
- 二零二二年度党风廉政建设知识竞赛题库(含答案).pdf
- 二零二二年度度枣庄市专业技术人员继续教育公需科目培训班互动题.pdf
- 二零二二年度儿童保健学试题库(含答案).pdf
- 二零二二年度第十九届中国东南地区数学奥林匹克竞赛高一试题(含答案).pdf
- 二零二二年度动物卫生监督题库(含答案).pdf
- 黑龙江省大庆市重点中学2023-2025学年高一下学期2月开学考试英语试题(含解析).docx
- 二零二二年度法检书记员招考《公基》测试题库(含答案).pdf
文档评论(0)