蜗牛哒哒

LINUX教程-LINUX编程-硬件访问

作者: 蜗牛哒哒 发布时间: 2020-12-21 146 人阅读

寄存器与内存
Q:寄存器与内存的区别在哪里呢?
A:寄存器和 RAM 的主要不同在于寄存器操作有副作用(side effect 或 边际效果):读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。
内存与I/O
在X86处理器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的x86系统中,I/O空间大小为64K,内存空间大小为4G。
IO/内存空间
X86
支持内存空间、IO空间
ARM
只支持内存空间
MIPS
只支持内存空间
PowerPC
只支持内存空间
IO端口与IO内存
IO端口:
当一个寄存器或内存位于IO空间时,称其为IO端口.

IO内存:
当一个寄存器或内存位于内存空间时,称其为IO内存.
Q:一个设备有可能处于IO空间,也有可能是内存空间,谁决定到底是在哪个空间呢?

*ISA 外设多使用 I/O 空间, 但PCI 设备多映射到内存空间。
操作I/O端口
对I/O端口的操作需按如下步骤完成:
申请
访问
释放
申请I/O端口
内核提供了一套函数来允许驱动申请它需要的I/O端口,其中核心的函数是:
struct resource *request_region(unsigned long first, unsigned long n, const char *name)

这个函数告诉内核,你要使用从 first 开始的n个端口,name参数是设备的名字.如果申请成功,返回非 NULL,申请失败,返回 NULL。
系统中端口的分配情况记录在 /proc/ioports 中(展示)。如果不能分配一个需要的端口组,可以来这里查看谁在使用。

访问I/O端口
unsigned inw(unsigned port)
void outw(unsigned short word, unsigned port)
存取 16-位 端口。

unsigned inl(unsigned port)
void outl(unsigned longword, unsigned port)
存取 32-位 端口。

释放I/O端口
当用完一组 I/O 端口(通常在驱动卸载时), 应当把它们返还给系统, 使用:
void release_region(unsigned long start, unsigned long n)

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.本站所有资源不保证完整性,仅供参考学习!
3. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
4. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
5. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
6. 如有链接无法下载、失效或广告,请联系管理员处理!
7. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
8. 如遇到加密压缩包,默认解压密码为"woniudada",如遇到无法解压的请联系管理员处理!
蜗牛哒哒 » LINUX教程-LINUX编程-硬件访问