加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Linux下的硬件访问技巧

发布时间:2021-11-23 16:06:28 所属栏目:教程 来源:互联网
导读:1、 寄存器与内存 寄存器与内存的区别在哪里呢? 寄存器和RAM 的主要不同在于寄存器操作有副作用(side effect或边际效果):读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。 2、 内存与I/O 在X86处理器中存

1、 寄存器与内存
 
       寄存器与内存的区别在哪里呢?
 
       寄存器和RAM 的主要不同在于寄存器操作有副作用(side effect或边际效果):读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。
 
2、 内存与I/O
 
       在X86处理器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的x86系统中,I/O空间大小为64K,内存空间大小为4G。
 
3、 IO/内存空间
 
       X86:支持内存空间、IO空间
 
       ARM:只支持内存空间
 
       MIPS:只支持内存空间
 
       PowerPC:只支持内存空间
 
4、 IO端口与IO内存
 
       IO端口:当一个寄存器或内存位于IO空间时,称其为IO端口。
 
       IO内存:当一个寄存器或内存位于内存空间时,称其为IO内存。
 
5、 操作I/O端口
 
       对I/O端口的操作需按如下步骤完成:
 
       1)申请
 
       2)访问
 
       3)释放
 
       1)申请I/O端口
 
       内核提供了一套函数来允许驱动申请它需要的I/O端口,其中核心的函数是:
 
       struct resource *request_region(unsigned long first,unsigned long n, const char *name)
 
       这个函数告诉内核,你要使用从first 开始的n个端口,name参数是设备的名字。如果申请成功,返回非NULL,申请失败,返回NULL。
 
       系统中端口的分配情况记录在/proc/ioports中(展示)。如果不能分配需要的端口,可以来这里查看谁在使用。
 
       2)访问I/O端口
 
       I/O端口可分为8-位, 16-位, 和32-位端口。Linux内核头文件(体系依赖的头文件<asm/io.h>) 定义了下列内联函数来访问I/O 端口:
 
unsigned inb(unsigned port) 读字节端口( 8 位宽)
 
void outb(unsigned char byte, unsigned port) 写字节端口( 8 位宽)。
 
unsigned inw(unsigned port)
 
void outw(unsigned short word, unsigned port)存取16-位端口。
 
unsigned inl(unsigned port)
 
void outl(unsigned longword, unsigned port)存取32-位端口。
 
       3)释放I/O端口
 
       当用完一组I/O 端口(通常在驱动卸载时),应使用如下函数把它们返还给系统:
 
       void release_region(unsigned long start, unsigned long n)

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读