免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 20065 | 回复: 26
打印 上一主题 下一主题

I/O地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-06 16:17 |只看该作者 |倒序浏览
不知道在此问是不是合适,只是我到这个版快的次数多一点。请斑竹原谅。


小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0x2f8,0x30);        
        outportb(0x2fb,0x03);

串口地址为0X2F8 ,OUTPORTB 是将值写到一个地址中去,对2FB操作好象是设置它的比特率,可是
1。我不明白为什么是2FB设置他的比特率,
2。还有0X03代表的是9600,不知道这个是怎么算的。
3。这个是串口,对于其他的IO呢,如并口,GPIO,怎么进行设置?
4。对于计算机IO地址的分配,不知道是怎么样的一个原理,有哪方面的书可以介绍看一下。

各位大虾帮帮忙,先谢谢了

论坛徽章:
0
2 [报告]
发表于 2008-03-06 16:31 |只看该作者
原帖由 heefly 于 2008-3-6 16:17 发表
不知道在此问是不是合适,只是我到这个版快的次数多一点。请斑竹原谅。


小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0 ...


一切都在硬件手册里.

论坛徽章:
0
3 [报告]
发表于 2008-03-06 23:47 |只看该作者
原帖由 heefly 于 2008-3-6 16:17 发表
不知道在此问是不是合适,只是我到这个版快的次数多一点。请斑竹原谅。


小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0 ...

前三个问题请参阅串口的设备规范。对于第四个问题,抛砖引玉一下,正好总结一下自己对I/O的看法,有错的地方请大家指正。

I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O)。
前者就是我们常说的I/O端口,它实际上的应该被称为I/O地址空间。
对于x86架构来说,通过IN/OUT指令访问。PC架构一共有65536个8bit的I/O端口,组成64KI/O地址空间,编号从0~0xFFFF。连续两个8bit的端口可以组成一个16bit的端口,连续4个组成一个32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。

MMIO占用CPU的物理地址空间,对它的访问可以使用CPU访问内存的指令进行。一个形象的比喻是把文件用mmap()后,可以像访问内存一样访问文件、同样,MMIO是用访问内存一样的方式访问I/O资源,如设备上的内存。MMIO不能被cache,原因以前很多帖子论述过,就不多说了(有特殊情况,如VGA)。

Port I/O和MMIO的主要区别在于1)前者不占用CPU的物理地址空间,后者占有(这是对x86架构说的,一些架构,如IA64,port I/O占用物理地址空间)。2)前者是顺序访问。也就是说在一条I/O指令完成前,下一条指令不会执行。例如通过Port I/O对设备发起了操作,造成了设备寄存器状态变化,这个变化在下一条指令执行前生效。uncache的MMIO通过uncahce memory的特性保证顺序性。3)使用方式不同

由于port I/O有独立的64KI/O地址空间,但CPU的地址线只有一套,所以必须区分地址属于物理地址空间还是I/O地址空间。早期的CPU有一个M/I针脚来表示当前地址的类型,后来似乎改了。刚才查了一下,叫request command line,没搞懂,觉得还是一个针脚。

IBM PC架构规定了一些固定的I/O端口,ISA设备通常也有固定的I/O端口,这些可以通过ICH(南桥)的规范查到。PCI设备的I/O端口和MMIO基地址通过设备的PCI configure space报告给操作系统,这些内容以前的帖子都很多,可以查阅一下。

通常遇到写死在I/O指令中的I/O端口,如果不是ISA设备,一般都是架构规定死的端口号,可查阅规范。

[ 本帖最后由 zx_wing 于 2008-3-7 18:54 编辑 ]

评分

参与人数 1可用积分 +3 收起 理由
cugb_cat + 3 精品文章

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2008-03-07 11:15 |只看该作者
原帖由 heefly 于 2008-3-6 16:17 发表
不知道在此问是不是合适,只是我到这个版快的次数多一点。请斑竹原谅。


小第对计算机底层和硬件的东西不是很了解,在看到一段串口初始化的代码中,

        outportb(0x2fb,0x80);
        outportb(0 ...

PCI设备的PIO端口可以从配置空间获得。
其它很多设备的PIO端口是固定的,或者可以通过对桥芯片编程更改。

论坛徽章:
0
5 [报告]
发表于 2008-03-07 11:30 |只看该作者
原帖由 zx_wing 于 2008-3-6 23:47 发表

按理说MMIO是不被cache的


cache可以通过协处理器进行配置,从而使cache针对某一memory不进行缓存,也就是禁止cache生效.

论坛徽章:
0
6 [报告]
发表于 2008-03-07 11:31 |只看该作者

回复 #3 zx_wing 的帖子

还是赞一个,善于总结.向你学习

论坛徽章:
0
7 [报告]
发表于 2008-03-07 12:35 |只看该作者
原帖由 RobinsonNie 于 2008-3-7 11:30 发表


cache可以通过协处理器进行配置,从而使cache针对某一memory不进行缓存,也就是禁止cache生效.

cache不是通过协处理器配置的,x86架构通过MTTR寄存器配置禁止。
我是不清楚为什么MMIO不cache但没有order accessing的效果。

论坛徽章:
0
8 [报告]
发表于 2008-03-07 13:39 |只看该作者
#if __LINUX_ARM_ARCH__ >= 6
#define mb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
                                   : : "r" (0) : "memory")
#else
#define mb() __asm__ __volatile__ ("" : : : "memory")
#endif
#define rmb() mb()
#define wmb() mb()

占个卧,,切到win下查下文档.

论坛徽章:
0
9 [报告]
发表于 2008-03-07 13:50 |只看该作者
原帖由 RobinsonNie 于 2008-3-7 13:39 发表
#if __LINUX_ARM_ARCH__ >= 6
#define mb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
                                   : : "r" (0) : "memory")
#else
#define mb() __asm__ __volatile_ ...

哦,ARM不懂,我只对通用处理器架构知道一点。
但我的意思是为啥 un-cache的MMIO不能保证访问的顺序性,是什么东西阻碍了它。刚才请教了前辈,也没搞清楚。

论坛徽章:
0
10 [报告]
发表于 2008-03-07 13:55 |只看该作者

回复 #3 zx_wing 的帖子

每次看zx_wing大哥的回贴都是一种享受啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP