免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] 请教x86 io地址空间和内存地址空间的关系 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-27 14:26 |只看该作者 |倒序浏览
最近在看pci设备驱动,书上写的意思似乎是x86的io地址空间可以通过ioremap映射到内存地址空间,我看了下的/proc/iomem文件,发现从0xcfee0000-0xffffffff这段空间都被APIC, PCI, HPET, PNP等设备占据,
印象中0xcfee0000-0xffffffff这段空间是应该由vmalloc, 固定内存映射,临时内存映射等占据,于是又看了下/proc/vmallocinfo,发现vmalloc的空间确实跟iomem有很大一段冲突,
那么我的疑问就是外设的io地址空间和内存地址空间究竟是不是一个空间?如果是,怎么解释这段冲突?如果不是,cpu访问的时候是如何区分这两个空间的?

谢谢各位!

论坛徽章:
0
2 [报告]
发表于 2012-05-27 14:53 |只看该作者
另外还有一些疑问,
x86上有64k字节的io端口, 这些io端口的空间跟io内存的空间有关系吗?它们是完全不同的两个空间还是说端口空间包含在io内存空间中?

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
3 [报告]
发表于 2012-05-27 14:56 |只看该作者
回复 1# skyrim

IO地址和IO端口主要应该是用来访问设备上的寄存器的。
IO端口需要通过in,out指令进行访问
IO内存映射之后可以像正常内存一样的寻址,不需要通过特殊的指令了

曾经的笔记

Linux内核访问外设I O资源的方式.pdf (175.71 KB, 下载次数: 346)

评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 赞一个!

查看全部评分

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
4 [报告]
发表于 2012-05-27 14:57 |只看该作者
回复 2# skyrim


这64KB应该是IO空间的,


   

论坛徽章:
0
5 [报告]
发表于 2012-05-27 15:42 |只看该作者
回复 3# embeddedlwp

    说起来我这个问题应该更多是关于x86体系结构而非Linux内核代码的。
    大概扫了一眼文档,写的是s3c2410的cpu,它的是统一编址,我倒是没什么问题。
   
    关于x86 io 端口,它的64k io端口是无法映射到内存空间的吧?只能通过in out指令访问,而且io内存地址的低64k也不是io端口的地址吧?就是说这两者没有任何包含关系

    刚才又查了些资料,感觉好像是这么个意思:
    /proc/iomem下面列出cfee0000-ffffffff的地址是总线地址,而非虚拟地址,占据了总线地址的高段,而低3.2G左右的总线地址被物理内存占用,这也是为什么在没有开启PAE的32位Linux下显示物理内存只有3.2G左右的原因。
    而/proc/vmalloc显示的是虚拟地址,所以两者有冲突不奇怪。不知道这个理解对否?

    如果这个理解没错,那么如果在一个没有开启PAE的32位系统上插了一块2G显存的显卡,岂不是总线地址有2G都要被占用?

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
6 [报告]
发表于 2012-05-27 18:36 |只看该作者
本帖最后由 firkraag 于 2012-05-27 18:39 编辑

http://blog.csdn.net/adaptiver/article/details/6891666

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2012-05-27 19:24 |只看该作者
回复 1# skyrim


        关于x86 io 端口,它的64k io端口是无法映射到内存空间的吧?只能通过in out指令访问,而且io内存地址的低64k也不是io端口的地址吧?就是说这两者没有任何包含关系?

yes. you are right


    /proc/iomem下面列出cfee0000-ffffffff的地址是总线地址,而非虚拟地址,占据了总线地址的高段,而低3.2G左右的总线地址被物理内存占用,这也是为什么在没有开启PAE的32位Linux下显示物理内存只有3.2G左右的原因。
    而/proc/vmalloc显示的是虚拟地址,所以两者有冲突不奇怪。不知道这个理解对否?

yes, application will use virtual addr to access memory, the applicaton's cfee0000-ffffffff is not the same as the kernel's cfee0000-ffffffff zone.

    如果这个理解没错,那么如果在一个没有开启PAE的32位系统上插了一块2G显存的显卡,岂不是总线地址有2G都要被占用?


yes, in this case, there are 2G memory be masked and become not accessable.
the same case occurred the the memory become not accessable that the ROM occuppied.(in some machine, you can mask rom out, so the ROM became not accessable.)

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
8 [报告]
发表于 2012-05-27 20:38 |只看该作者
回复 7# folklore

yes. you are right


你确定这64KB不是IO空间?


   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2012-05-27 20:41 |只看该作者
回复 8# embeddedlwp


    it is io space....

io port can access with the special cpu instrument (out/in),
and the memory area is access via mov.
so, they are difficulty things.

论坛徽章:
0
10 [报告]
发表于 2012-05-28 10:57 |只看该作者
回复 9# folklore


    多谢楼上各位回复。
    我还有两个问题
    1.io space到总线地址的映射是通过什么部件完成的?
       原以为是IOMMU,但是看了下面这个帖子zx_wing前辈在7楼说MMIO跟IOMMU没关系,就又有有些疑惑了。
       只感觉应该是北桥中的某个设备完成的映射。

    2.这个映射是在何时完成的?
       因为在系统启动的时候就已经完成pci设备的枚举,所有pci设备的总线地址都已经写入BAR寄存器,那么是否可以理解为这个映射是由硬件自动完成的?
       内核所做的只是从pci设备的中读取出它们的总线地址?
       如果是这样,还有问题,pci设备有bar寄存器可以读取分配的总线地址,那其他设备怎么知道cpu把它们的地址映射到什么总线地址上了?比如我机器上的System RAM, System ROM, Video ROM, ACPI Tables等等

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP