+ -
当前位置:首页 → 问答吧 → 关于CPU对IO寻址的问题(I/O端口和I/O内存)

关于CPU对IO寻址的问题(I/O端口和I/O内存)

时间:2005-07-26

来源:互联网

几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。


下面都是cs8900驱动,但是,好像request_region的参数不一样,也不知道哪个是对的?
驱动1:
#define EPORT_ADDR 0x300
#define EIOADDR (EIO_BASE+EPORT_ADDR)
request_region(EPORT_ADDR, NETCARD_IO_EXTENT,"cs89x0");
上面这个好像就是偏移量做参数吧。

驱动2:
static int io = 0xd0000300;
request_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT, "cs8900a");
这个好像就是虚拟地址做参数。

疑问有二:
1、在使用I/O端口时,request_region的参数是实际的物理地址,还是物理地址的偏移量吧,抑或是虚拟地址呢?
2、对我们而言,编程的时候,I/O映射方式和内存映射方式有什么不同啊?对某种特定的外围芯片,我们应该采用哪种方式呢?还是两种方式都可以?

因为我需要写一个驱动,可是现在一些基础知识还有些模糊。

谢谢拉!      

作者: whepin   发布时间: 2005-07-26

虚拟地址应该是是为了人们的使用习惯,把内存直接映射的模仿成x86的独立的地址模式吧

有的机器硬件io和内存io是用统一地址的,x86是单独的,这只是使用方式上的

linux对有的提供2种写法      

作者: AIKO_sex   发布时间: 2005-07-26

IO端口和IO内存在不同的CPU体系,访问方式是不一样的,用的分别是 outX/inX 和wirteX/readX 。与体系相关。如果混用,可能导致无法发出正确的访问信号和时序,不能访问到有效的数据。您自己参考一下不同体系的 outX/inX和writeX/readX就能发现。
另外,request_region要求的是实际的物理地址。      

作者: 风雪狂客   发布时间: 2005-07-28