码迷,mamicode.com
首页 > 系统相关 > 详细

linux 操作 I/O 端口

时间:2019-07-06 13:39:41      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:其他   自动   开始   href   sys   转换   程序   str   支持   

 

在驱动硬件请求了在它的活动中需要使用的 I/O 端口范围之后, 它必须读且/或写到这些 端口. 为此, 大部分硬件区别 8-位, 16-位, 和 32-位端口. 常常你无法混合它们, 象你 正常使用系统内存存取一样.[33]33

 

一个 C 程序, 因此, 必须调用不同的函数来存取不同大小的端口. 如果在前一节中建议 的, 只支持唯一内存映射 I/O 寄存器的计算机体系伪装端口 I/O , 通过重新映射端口地 址到内存地址, 并且内核向驱动隐藏了细节以便易于移植. Linux 内核头文件(特别地, 体系依赖的头文件 <asm/io.h>) 定义了下列内联函数来存取 I/O 端口:

 

有时 I/O 端口象内存一样安排, 并且你可(例如)绑定 2 个 8-位 写为一个单个 16-位 操作. 例如, 这应用于

PC 视频板. 但是通常, 你不能指望这个特色.

 

 

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-位 端口( 一个字宽 ); 在为 S390 平台编译时它们不可用, 它 只支持字节 I/O.

 

unsigned inl(unsigned port);

void outl(unsigned longword, unsigned port);

 

这些函数存取 32-位 端口. longword 声明为或者 unsigned long 或者 unsigned int, 根据平台. 如同字 I/O, "Long" I/O 在 S390 上不可用.

 

从现在开始, 当我们使用 unsigned 没有进一步类型规定时, 我们指的是一个体系相关的 定义, 它的确切特性是不相关的. 函数几乎一直是可移植的, 因为编译器自动转换值在赋 值时 -- 它们是 unsigned 有助于阻止编译时的警告. 这样的转换不丢失信息, 只要程序 员安排明智的值来避免溢出. 我们坚持这个"未完成的类型"传统贯串本章.

 

注意, 没有定义 64-位 端口 I/O 操作. 甚至在 64-位 体系中, 端口地址空间使用一个 32-位(最大)的数据通路.

linux 操作 I/O 端口

标签:其他   自动   开始   href   sys   转换   程序   str   支持   

原文地址:https://www.cnblogs.com/fanweisheng/p/11142235.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!