evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3986回复:8

还是有关内存映射的问题

楼主#
更多 发布于:2002-11-11 19:03
小弟这些天正研究MMU。有几个问题,请大哥们解释。
我在写一个PCI卡的驱动程序。在初始化PCI阶段,需要把从BAR0中得到的基地址做映射(sysMmuMapAdd)。这些我做好了。我想问的是:

1,在没有映射之前,我访问某个地址,就一定会出错,一般是Page Fault;当完成了映射之后,我随便的任意的访问一个地址,都可以得到内容而不出错,这是为什么?

2,我下一步想为DMA分配一片地址,我看到在Linux中是用pci_alloc_consistent,作用是分配一块空间,使得从CPU和总线上看这块空间内容是一致的同步的,无论是谁修改了,另一方都知道。我不知道在VxWorks下用什么函数完成相同的功能。

3,为什么要映射呢?不映射就不能访问设备上的内存?还有PCI上的I/O空间和内存空间到底在哪?是不是就是I/O断口和自带的内存,必须映射到系统的I/O空间和主内存才能访问?

谢谢!!!
向大哥们学习!

最新喜欢:

algumalgum
motif
驱动牛犊
驱动牛犊
  • 注册日期2001-10-03
  • 最后登录2009-01-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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\"。
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-12 09:04
motif说得我有一定了解,不过还是谢谢你,我从中是有收获的。
能不能具体解释一下我提的问题?谢谢
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-13 14:28
没人知道吗?高手呢?
tongyong
驱动牛犊
驱动牛犊
  • 注册日期2003-12-23
  • 最后登录2006-12-18
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-17 16:02
我不懂,刚接触,支持一下
maple_wasp
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-03-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望22点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-25 16:48
2: 可用 cacheDmaMalloc()进行DMA内存的分配
aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-25 19:48
1.者是内存管理单元在工作的表现,访问了非法(为管理的内存导致这个问题),映射之后就不会了
3。内存空间I/O空间都在你的板子上,是在4G的空间中挖出的洞
我的邮件地址:hwybird@sohu。com,两三天看一次
helenhll
驱动牛犊
驱动牛犊
  • 注册日期2005-03-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望55点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-02 15:04
我也用sysMMUMapAdd()函数加载,加载时候没问题,一读就出现下面的错误
Exception number 14: Task: 0x1fdf4a90 (tDbgTask)
Page Fault
Program Counter: 0x023afd20
Status Register: 0x00010116
Error Code     : 0xdb020000
hwybird
论坛版主
论坛版主
  • 注册日期2006-11-11
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分988分
  • 威望359点
  • 贡献值0点
  • 好评度96点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-01-08 11:08
必须在初始化的时候加载,过时不候
游客

返回顶部