免费注册 查看新帖 |

Chinaunix

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

pci_resource_start和ioremap的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-14 21:09 |只看该作者 |倒序浏览
addr = pci_resource_start(...);
addr = ioremap(addr, size);

pci_resource_start 取得的物理地址是PCI设备上内存的地址还是主板上内存的地址?
ioremap只能转换主板内存上的地址吧,那怎么访问PCI设备上的内存呢?

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-03-14 22:27 |只看该作者
对X86 CPU来说,只有一个物理内存地址空间. 当然还有个IO端口空间,不过那个是分开的.
至于在CPU访问某个物理地址时,访问到的是主存还是PCI设备,CPU是不知道的. 这个也就是PCI MEMORY MAP的意义所在.MAP了之后,可以和普通内存一样访问.

所以pci_resource_start 取得的物理地址是PCI设备上内存的地址.
IOREMAP可以转换这个地址.因为转换的过程就是给这个物理地址建立一个页表,分配一个相应的虚拟地址.

可以看看我之前转的那个:
http://linux.chinaunix.net/bbs/thread-1157508-1-1.html

论坛徽章:
0
3 [报告]
发表于 2010-03-15 11:15 |只看该作者
对X86 CPU来说,只有一个物理内存地址空间. 当然还有个IO端口空间,不过那个是分开的.
至于在CPU访问某个物理 ...
accessory 发表于 2010-03-14 22:27

还有点不明白,如果设备上的内存被映射到进程地址空间了,那么当访问进程空间中的这个地址时,这个地址将转换成物理地址,
但怎么知道这个物理地址是指向某个设备的内存,而不是主板上的内存呢?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
4 [报告]
发表于 2010-03-15 12:49 |只看该作者
本帖最后由 smalloc 于 2010-03-15 16:22 编辑
还有点不明白,如果设备上的内存被映射到进程地址空间了,那么当访问进程空间中的这个地址时,这个地址将 ...
jronald 发表于 2010-03-15 11:15



    通常由北桥来执行区分.北桥知道该访问谁

论坛徽章:
0
5 [报告]
发表于 2010-03-16 00:07 |只看该作者
我觉得可以这样理解。

在给PCI设备分配一段内存地址的时候,是要通过NB(NORTH BRIDGE)向设备写一个命令的。估计是NB在这个时候偷听了这个命令,然后记录下来。那么在以后写同一段地址的时候,NB就知道是写到PCI设备了。

也许有不对的地方,仅供参考。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
6 [报告]
发表于 2010-03-16 21:51 |只看该作者
回复 5# accessory


    不是这样的.
你说的这个太高级.通用性不太强哈.
其实很简单,如果是针对PCI来说,还是把配置空间的实现搞清楚,内核里有些帖子讲到了,前些天new_leaner那个帖子我也说了一大堆废话就是为了说明这个问题.
排开PCI这个特例不谈.
我觉得北桥本身能直接区分内存空间.通常体系结构物理地址空间有个约定,前面的部分地址肯定是内存,那么内存插上后肯定只属于某个固定空间,这个北桥是能够探测到的,或者它还可以自动根据插槽分派.总之它肯定是在逻辑上把内存分到前面,至于这个内存空间到底有多大有没有界限:可能有,比如逻辑上做的比较固定,或者没有,非常好自适应.那么通常总线上(不一定就是PCI总线)其他设备映射到内存空间的时候,程序会根据体系结构的不同也固定在某个空间做分配(老兄看过APCI或一些其他BIOS类的规范,不知道有没有看到相关的东西).这个体系结构的不同实际上就是北桥的实现的不同.当然这2个空间的界限能通过编程改变,或者不能改变.
如此一来不论怎样北桥在硬件上拿到一个地址肯定知道往哪里转.
至于如果是一个物理地址是否合法,就是说它即没落到内存又没落到总线上,北桥肯定要某种规范来处理.比如读出的数据返回全1.
其实在PCI总线上,如果北桥通过自己上面的PCI设备把地址投放到总线时,如果没有从设备响应,那么返回读到是全1.

论坛徽章:
0
7 [报告]
发表于 2010-03-16 23:44 |只看该作者
嗯,LS说的有道理。好像是事先分好2块空间的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP