您的位置:首页 > 运维架构 > Linux

Linux 设备驱动--- 硬件访问

2013-03-09 19:59 197 查看

寄存器 与 内存:

寄存器与内存的区别在哪里?

寄存器 和 RAM 的主要区别在于 寄存器操作有副作用:读取某个地址时可能导致该地址内容发生变化,

比如 很多设备的中断状态寄存器只要一读取,便自动清零.

内存 与 IO空间:

在 X86 处理器中存在 I/O空间的概念,I/O空间 是相对内存空间 而言的,他们是彼此独立的地址空间,

在 32 位的 X86 系统中, I/O空间大小为
64K,内存空间大小为 4 G.

除了 X86 支持 内存、IO空间, ARM, MIPS , PowerPC 只支持 内存空间.

IO端口 与 IO内存:

IO 端口:

当一个寄存器或内存处于 IO空间 时,称其为 IO端口 .

IO内存:

当一个寄存器或内存位于 内存空间 时,称其为 IO 内存.

操作 I/O 端口:

对 I/O 端口 的操作需要按如下步骤完成:

1, 申请.

2, 访问.

3, 释放.

申请 I/O 内存:

内核提供了一套函数来允许驱动申请它需要的 I/O 内存.

其核心函数是:

struct resource * request_mem_region ( unsigned long start , unsigned long len , char * name )

这个函数申请一个从 start 开始,长度为
len 字节的内存区,如果成功,返回 非NULL;否则返回
NULL.

所有已经在使用的 I/O 内存在 / proc / iomem中列出.

映射 I/O 内存:

在访问 I/O 内存前,必须进行 物理地址到虚拟地址的映射.

函数: void * ioremap ( unsigned long phys_addr , unsigned long size )

访问 I/O 内存:





释放 I/O 内存:

I/O 内存不再需要使用时应当释放.

步骤如下:

1, void iounmap ( void *addr )

2, void release_mem_region ( unsigned long start , unsigned long len )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: