网站大量收购独家精品文档,联系QQ:2885784924

I-O端口编程.pdfVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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) ( 请记住参数的次序) 。要从某

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档