Chinaunix

标题: pci_resource_start和ioremap的问题 [打印本页]

作者: jronald    时间: 2010-03-14 21:09
标题: pci_resource_start和ioremap的问题
addr = pci_resource_start(...);
addr = ioremap(addr, size);

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

谢谢
作者: accessory    时间: 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
作者: jronald    时间: 2010-03-15 11:15
对X86 CPU来说,只有一个物理内存地址空间. 当然还有个IO端口空间,不过那个是分开的.
至于在CPU访问某个物理 ...
accessory 发表于 2010-03-14 22:27

还有点不明白,如果设备上的内存被映射到进程地址空间了,那么当访问进程空间中的这个地址时,这个地址将转换成物理地址,
但怎么知道这个物理地址是指向某个设备的内存,而不是主板上的内存呢?
作者: smalloc    时间: 2010-03-15 12:49
本帖最后由 smalloc 于 2010-03-15 16:22 编辑
还有点不明白,如果设备上的内存被映射到进程地址空间了,那么当访问进程空间中的这个地址时,这个地址将 ...
jronald 发表于 2010-03-15 11:15



    通常由北桥来执行区分.北桥知道该访问谁
作者: accessory    时间: 2010-03-16 00:07
我觉得可以这样理解。

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

也许有不对的地方,仅供参考。
作者: smalloc    时间: 2010-03-16 21:51
回复 5# accessory


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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2