阅读:1644回复:5
请问joyfly和其他大佬地址空间问题
各位好,
我有一个疑问 BusAddress和系统地址 sytermaddress的含义? 即WINCE DDK 中HALTranslateBusAddress()和HALTranslateSytermAddress()中的相关概念 sytermaddress 是物理RAM,还是虚拟地址?或是其他? busaddress似乎不是I/O端口的空间吧? |
|
沙发#
发布于: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来做这个映射。 以上只是我的理解,不能确定其正确性。写出来也希望有人来指正。 |
|
|
板凳#
发布于:2003-07-17 21:56
bus address 是总线相关地址,对于pc系统来说,可以由多个总线(一般只有一个pci总线,但,可以由多个,同时,还有其他类型的总线),对于每个总线来说,有各自的地址空间,假设你访问某个地址,系统又怎么分辨你是访问的那个总线呢。这时,需要将总线相关地址转化为总线无关地质,即系统地址,这在整个系统中是唯一的。系统地质部是虚拟地址,虚拟地址是由操作系统应设的
|
|
|
地板#
发布于:2003-07-18 10:57
1。不好意思,但是我还是有一点不明白!
比如对于ISA/EISA总线,我占用的地址空间无论是I/O还是MEMORY空间我占用的空间就是系统空间呀? 硬件设计工程师给我的使用说明中说的很清楚,I/O 261H,260H DMA使用 0xD0000--0XDFFFF,这不是系统空间吗? 也就是在硬件设计时就能确定系统空间? 那驱动就应操作这个给定的系统空间? 那DDK的HALTranslateBusAddress()和HALTranslateSytermAddress()是做什么的呢? 大佬们别嫌我烦啊! 2。WINCE下如何启动DMA操作? |
|
地下室#
发布于: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的虚拟地址的。 |
|
|
5楼#
发布于:2003-07-21 09:54
多谢二位大虾,joyfly和lifeship
|
|