关于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映射方式和内存映射方式有什么不同啊?对某种特定的外围芯片,我们应该采用哪种方式呢?还是两种方式都可以?
因为我需要写一个驱动,可是现在一些基础知识还有些模糊。
谢谢拉!
下面都是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种写法
有的机器硬件io和内存io是用统一地址的,x86是单独的,这只是使用方式上的
linux对有的提供2种写法
作者: AIKO_sex 发布时间: 2005-07-26
IO端口和IO内存在不同的CPU体系,访问方式是不一样的,用的分别是 outX/inX 和wirteX/readX 。与体系相关。如果混用,可能导致无法发出正确的访问信号和时序,不能访问到有效的数据。您自己参考一下不同体系的 outX/inX和writeX/readX就能发现。
另外,request_region要求的是实际的物理地址。
另外,request_region要求的是实际的物理地址。
作者: 风雪狂客 发布时间: 2005-07-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28