阅读:2807回复:14
小弟关于PCI配置空间基址寄存器的几个问题
请仙人指路:
(1)PCI配置空间中有6个BAR,但它们在物理上是完全相同的吗? 我选用的PCI接口芯片为9056,既然9056从物理上将MEM BAR 和I/O BAR 的地址分开,那判断BAR的最低位为‘0’还是为‘1’,还有什么意义? (2)BAR中的内容理当由OS分配,但机器刚上电时,BIOS检测到PCI设备时,一定读取了BAR中的信息吧,但BAR中原本存地是什么内容? 有本书上讲:通过向BAR中写全‘1’:“FFFFFFFFH”,来获悉该PCI设备所申请空间的大小(MEM 或 I/O),然后根据这个值,将BA,写入BAR吗? 有本书举例说明: 如果BAR中返回的值是“1M”,则OS给该PCI设备分配的BAR必须 为“1M”的整数倍。为什么?BAR只是一个基地址,在哪里有什么关系呢? (3)PCI设备的驱动程序在PCI设备与CPU通信的过程中是在时时刻刻起作用的吗?每次数据发送和接受都必须通过驱动程序吗?(这个问题比较菜,但我确实不懂) (4)OS对PCI设备所分配的内存区域就是所谓的PCI配置空间的内存映射区域吗?如果是,为什么不正好分配256B?PCI配置空间的大小不正好是256B吗?(设备有关区的很多空间甚至都用不到)。OS为什么的同时对PCI设备和用户区域分配内存?是不是PCI设备每次和CPU通信时,数据都暂存在所谓的“用户区”,那么对用户区内存和PCI设备空间映射区域所分配的内存,二者是什么关系?是完全独立的吗? 不吝赐教,小弟在线等 :( |
|
沙发#
发布于:2004-06-15 14:20
那位高手可以指教一下吗?
这个问题也许真的很弱,没有人回答;但高手也毕竟是从菜鸟成长起来的吧,就可怜一下菜鸟求教五门的苦楚吧。谢谢 :( |
|
板凳#
发布于:2004-06-15 15:39
俺不是高手,
但觉得你还没有很好地了解基础的PCI总线原理、没详细地看PCI文档、也没有花很多的时间去阅读相关源代码, 在这种情况下就立即开始钻入到技术细节当中去, 肯定会遇到大量的细节问题尤其是一些基本的原理性问题无法解决。 所以, 你现在应该把基本原理弄清楚。 好好地阅读PCI总线规范文件吧, 然后再找PCI总线枚举、X86体系下PCI总线资源的资料来好好看看, 也许会有用处。 Best regards & Good luck! [编辑 - 6/15/04 by hzhq1] |
|
|
地板#
发布于:2004-06-15 15:48
PCI总线无论是硬件还是软件,
都是相当复杂的, 不要指望自己在短短的时间比如十天八天内, 立即能把专家们花很长时间才做好的工作全部理解。 单是理解PCI协议、X86体系下的系统配置、阅读相关的原代码, 肯定要花一段不算太短的时间的, 这时, 还没开始动手写程序呢。 希望我说话太过直率的口气没有吓着你而影响你的学习热情。 Best regards & Good luck! [编辑 - 6/15/04 by hzhq1] |
|
|
地下室#
发布于:2004-06-15 15:52
不知道浙大的〈LINUX原代码情景分析〉这本书能不能给你一些帮助?
这本书的下册有详细的PCI枚举过程原代码及介绍。 [编辑 - 6/15/04 by hzhq1] |
|
|
5楼#
发布于:2004-06-17 08:51
首先十分感谢论坛大佬的建议和意见,字字珠玑,小弟十分首肯。
但小弟的确是下了一定功夫去钻研了,我提出的几个问题,确实是想了很久也想不明白的问题,所以很仔细的罗列了出来。 这里是ABC初学者论坛,所以我来到这里,因为很多初学者的确面临很多求教无门,自己又想不通的问题,所以来到这块宝地,希望可以有前辈或者有经验的同仁给予点拨和帮助,其实,我们的问题看似简单,但很有可能是困惑很多初学者的比较普遍的问题。圣人云,拯救一人即是拯救世界,望诸位大侠查纳雅言。 |
|
6楼#
发布于:2004-06-17 11:57
“
我提出的几个问题,确实是想了很久也想不明白的问题,所以很仔细的罗列了出来。 ” 不懂就问,人人都是这样过来的了。 〈LINUX原代码情景分析〉里面, 确实有你的问题的答案, 翻翻就找到了。 另: 这里没有谁拯救谁的说法, 大家都是平和地交流探讨。 |
|
|
7楼#
发布于:2004-06-17 20:47
我发现时间总是让你还没怎么看明白那些东西就要你下手做了
|
|
|
8楼#
发布于:2004-06-18 11:18
基础是要慢慢打好的,但是老板让你没有时间打基础,有了基本的概念就上手吧!
首先声明我也是才开始做驱动,希望多交流。 我得做法是: 1。在机子上装windriver 6 和driver studio 2.7 2。使用windriver 6查出你要开发的Pci控制芯片的一系列信息,比如:VID、DID、SVID、SDID、BAR0、内存映射范围等等。 3。再用driverstudio按照需要生成驱动程序的框架,这就用到上面的信息。 4。再根据要求添加控制代码。 5。最后生成驱动。 其中第4步中我是做好一个功能就试一试,不要求全。 |
|
|
9楼#
发布于:2004-06-21 15:45
多看看9056的datasheet
你会明白很多的 |
|
10楼#
发布于:2004-06-23 03:02
1. PCI配置空间中有6个BAR
they are used to store System Mapped Base Address when access the pci card from host; (you may mixed up beteen two addresses: host pc address and pci card loca address) 2. BAR中的内容理当由OS分配,机器刚上电时,BIOS检测到PCI设备时,不读BAR中的信息; 3. PCI设备的驱动程序在PCI设备与CPU通信的过程中是在时时刻刻起作用的吗? Mapped registers/port read/write are go through driver; DMA operation are controled by DMA engine. (driver just setup the DMA environment parameters) (4)OS对PCI设备所分配的内存区域就是所谓的PCI配置空间的内存映射区域吗?如果是,为什么不正好分配256B?PCI配置空间的大小不正好是256B吗? why do u think this way? some pci card need more and some need less mapped space. |
|
11楼#
发布于:2004-06-23 16:26
请仙人指路: 0 和 1 是判断你取得的这个地址是 mem 还是io的。 因为虽然他们操作的结果一样,但是操作方法不一样。所以要区分。 |
|
12楼#
发布于:2004-06-24 15:32
小弟这几日出差,好久没有来论坛了,想不到各位给了这么多有价值的信息,实在是感激不尽,我一定会努力的,再次谢谢各位。
|
|
13楼#
发布于:2004-06-30 09:53
PCI 的LOCAL ADDRESS 和BASE ADDRESS 到底有什么区别?
BASE ADDRESS就是配置寄存器映射到内存中的地址,那么LOCAL ADDRESS究竟是什么呢?看书看了很久,怎么也弄不明白。只好求救了。 |
|
14楼#
发布于:2004-07-01 09:05
我用的是PLX9056芯片,有几个概念总也弄不清楚:
(1)Local PLX基地址 (2)Local User基地址 (3)Local Bus地址 希望哪位可以给我讲讲,谢谢了。 |
|