阅读:4092回复:8
还是有关内存映射的问题
小弟这些天正研究MMU。有几个问题,请大哥们解释。
我在写一个PCI卡的驱动程序。在初始化PCI阶段,需要把从BAR0中得到的基地址做映射(sysMmuMapAdd)。这些我做好了。我想问的是: 1,在没有映射之前,我访问某个地址,就一定会出错,一般是Page Fault;当完成了映射之后,我随便的任意的访问一个地址,都可以得到内容而不出错,这是为什么? 2,我下一步想为DMA分配一片地址,我看到在Linux中是用pci_alloc_consistent,作用是分配一块空间,使得从CPU和总线上看这块空间内容是一致的同步的,无论是谁修改了,另一方都知道。我不知道在VxWorks下用什么函数完成相同的功能。 3,为什么要映射呢?不映射就不能访问设备上的内存?还有PCI上的I/O空间和内存空间到底在哪?是不是就是I/O断口和自带的内存,必须映射到系统的I/O空间和主内存才能访问? 谢谢!!! 向大哥们学习! |
|
最新喜欢:algum |
沙发#
发布于:2002-11-12 08:53
PCI有三个地址空间,分别是Memory,I/O,Configuration。其中,对于Memory和I/O空间的
访问CPU有相应的指令来实现。Configuration空间中保存有该设备的许多重要信息,如 Device ID,Vendor ID,Base Address0-Base Address5,Interrupt Line Register等等。 CPU无法直接访问PCI的配置空间,对配置空间的访问是通过对Host Bridge上的端口用I/O指 令来访问的。对PCI卡进行编程,一般是用卡的I/O端口基地址加上一个寄存器的偏移,用这 个得到的端口地址和I/O指令来访问卡上的指定寄存器。这个I/O端口基地址就保存在PCI配 置空间的Base Address0-5中的一个。现在的PCI卡对于卡上的寄存器经常是提供了两种访问 方式,即既可以在I/O空间访问又可以在Memory空间访问。用Memory空间访问寄存器即 Memory-Mapped I/O。如果卡中带有内存,则卡中内存地址的配置信息也保存在Base Address0-5中的一个。Memory-Mapped I/O的地址和PCI卡中的内存的地址都需要进行地址映 射后,才能在驱动程序中进行访问。这是因为驱动程序使用的是虚拟地址,地址映射建立了 虚拟地址到物理地址的映射。 以上是以x86为目标机的。 PCI相关可参考\"PCI System Architecture\"。 |
|
板凳#
发布于:2002-11-12 09:04
motif说得我有一定了解,不过还是谢谢你,我从中是有收获的。
能不能具体解释一下我提的问题?谢谢 |
|
地板#
发布于:2002-11-13 14:28
没人知道吗?高手呢?
|
|
地下室#
发布于:2005-01-17 16:02
我不懂,刚接触,支持一下
|
|
5楼#
发布于:2005-01-25 16:48
2: 可用 cacheDmaMalloc()进行DMA内存的分配
|
|
6楼#
发布于:2005-01-25 19:48
1.者是内存管理单元在工作的表现,访问了非法(为管理的内存导致这个问题),映射之后就不会了
3。内存空间I/O空间都在你的板子上,是在4G的空间中挖出的洞 |
|
|
7楼#
发布于:2005-07-02 15:04
我也用sysMMUMapAdd()函数加载,加载时候没问题,一读就出现下面的错误
Exception number 14: Task: 0x1fdf4a90 (tDbgTask) Page Fault Program Counter: 0x023afd20 Status Register: 0x00010116 Error Code : 0xdb020000 |
|
8楼#
发布于:2007-01-08 11:08
必须在初始化的时候加载,过时不候
|
|