aetherstone
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2008-07-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1559回复:5

请问joyfly和其他大佬地址空间问题

楼主#
更多 发布于:2003-07-17 15:55
各位好,
我有一个疑问 BusAddress和系统地址  sytermaddress的含义?
即WINCE DDK 中HALTranslateBusAddress()和HALTranslateSytermAddress()中的相关概念

sytermaddress 是物理RAM,还是虚拟地址?或是其他?
busaddress似乎不是I/O端口的空间吧?

joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-17 20:32
SORRY,我没有接触过总线这类的问题,也不能正确理解。

但是从帮助上看,我大致的理解是这样的:
访问BUS上的MEMORY或IO的方式与访问系统上的MEMORY或IO在物理操作上是不一样的。在系统里先RESERVE一段空间,声明为BUS的空间。这样以后再访问这一段空间时,在物理实现上会自动访问到BUS上相应的空间。

SystemAddress和BusAddress都是物理地址。
BusAddress是I/O或MEMORY,可以由HALTranslateBusAddress()的第4个参数AddressSpace的返回值决定的,0为MEMORY,1为I/O。

因为SystemAddress是物理地址,驱动程序是运行在USER MODE,所以如果要在驱动程序里访问它,得先经过一个物理地址到虚拟地址的映射,可以用MmMapIoSpace来做这个映射。

以上只是我的理解,不能确定其正确性。写出来也希望有人来指正。
www.cnemb.com
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-17 21:56
bus address 是总线相关地址,对于pc系统来说,可以由多个总线(一般只有一个pci总线,但,可以由多个,同时,还有其他类型的总线),对于每个总线来说,有各自的地址空间,假设你访问某个地址,系统又怎么分辨你是访问的那个总线呢。这时,需要将总线相关地址转化为总线无关地质,即系统地址,这在整个系统中是唯一的。系统地质部是虚拟地址,虚拟地址是由操作系统应设的
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
aetherstone
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2008-07-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-18 10:57
1。不好意思,但是我还是有一点不明白!
比如对于ISA/EISA总线,我占用的地址空间无论是I/O还是MEMORY空间我占用的空间就是系统空间呀?
硬件设计工程师给我的使用说明中说的很清楚,I/O 261H,260H
DMA使用 0xD0000--0XDFFFF,这不是系统空间吗?
也就是在硬件设计时就能确定系统空间?
那驱动就应操作这个给定的系统空间?
那DDK的HALTranslateBusAddress()和HALTranslateSytermAddress()是做什么的呢?
大佬们别嫌我烦啊!

2。WINCE下如何启动DMA操作?
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-18 13:35
是的,硬件系统设计时就应该规定好硬件寄存器在系统空间里的相应地址。在WINCE的KERNEL里,有个OEMAddressTable就是来做这样的分配和映射工作的。比如:
OEMAddressTable
    ;;;-------------------------------------------------------------
    ;;; Virt Addr   Phys Addr   MB
    ;;;-------------------------------------------------------------
    DCD 0x8C000000, 0xC0000000, 64  ; 64 MB SDRAM
    DCD 0x8B000000, 0x80000000, 1   ; 1  MB peripheral controll registers
    DCD 0x8A000000, 0x90000000, 1   ; 1  MB system control registers
    DCD 0x89000000, 0xa0000000, 1   ; 1  MB memory control registers

Phys Addr就是硬件设计时规定好的硬件寄存器的起始地址。
Virt Addr是映射到操作系统里的地址,这个地址对硬件来说是虚拟地址,但操作系统里,却看作时是物理地址,DRIVERS里所说的访问物理地址,其实就是访问这一部分地址。

然后,1MB的peripheral controll registers地址里,你可以再分配,比如第一个64KB给SERIAL,第2个64K给USB,等等,这也是硬件手册上规定的。

所以我觉得这个I/O地址和DMA地址都是相对于BUS在系统空间中的起始地址的一个偏移量。

驱动只能操作这个给定的系统空间经过映射后的地址。

HALTranslateBusAddress()就是把BUS上的地址映射到系统空间地址上的。

WINCE下启动DMA的方式,无非就是通过设置DMA寄存器,先启动DMA Interface,再设置好DMA LENGTH,传输模式,最后启动DMA。具体的要看硬件手册。如果在WINCE的USER MODE下做,这些寄存器都是映射成WINCE的虚拟地址的。

www.cnemb.com
aetherstone
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2008-07-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-21 09:54
多谢二位大虾,joyfly和lifeship
游客

返回顶部