寄存器统一编址?

[复制链接]
 楼主| longwuyi 发表于 2007-5-15 20:45 | 显示全部楼层 |阅读模式
各位老大,<br /><br />在WDM中对设备寄存器的访问,有些平台是同一编址的.通过直接访问内存的方式访问设备寄存器.<br />请老大们解释一下实现统一编址的详细原理(象独立编址分时输出地址和数据方式等).
high 发表于 2007-5-15 21:31 | 显示全部楼层

cpu架构决定了编址

一般一套总线的risc,把一段内部地址分配给内部寄存器。(一般是高端地址)。所以可以&nbsp;以看起来访问内存的方式来访问寄存器。而且,他所有地址不会重合,这么就叫统一编址。<br /><br />有2套总线结构的可以分开编址,操作同一地址借由不同指令,比如0地址可以是内存也可以是rom.由指令来分别。
平常人 发表于 2007-5-15 21:39 | 显示全部楼层

楼主说“有些平台是通一编址”,请教一下哪些不是通一编

你的WDM是指什么?&nbsp;Windows&nbsp;Driver&nbsp;Model?&nbsp;&nbsp;好像应该只有x86吧?
high 发表于 2007-5-15 21:43 | 显示全部楼层

还是平常人仔细

  
ahwei 发表于 2007-5-15 22:44 | 显示全部楼层

wdm中两种都支持

io地址空间的编址有两种方式,io独立编址和存储器映像编址,io独立编址中,io端口操作有独立的指令,如x86中的in,out,相应的io总线中有iord,&nbsp;iowr读写控制信号。存储器映像编址中用存储器地址对io端口寻址,直接用操作存储器的指令即可操作io,如mov,ld,st等等,51就是这种编址方式。<br />但是现在很多高级处理器对存储器访问作了优化,如缓存,预取等等,而io操作通常要求实时性,比如一个寄存器当前的某个bit是1,必须在1ms后把它置成0,存储器编址就得花另外的代价解决这个问题,这就是pci总线的内存空间分为prefecth和nonprefetch的原因。存储器编址用c语言比较容易编程,比如要给0x80地址写0x5a,只需*((char*)(0x80))&nbsp;=&nbsp;0x5a即可,而在io独立编址中,往往得写一个函数或者是宏。<br />x86中有64k的io地址空间,外设接口卡可以使用,在pci总线中这是动态分配的,同时还可以使用内存空间,这在pci总线中也得到了很好的支持,在设备枚举时bios或者windows会动态的分配这些io空间和内存空间,一个外设到底使用什么空间这是设计者考虑的事情。<br />但是对于wdm驱动程序来说,hal.dll导出了一系列的宏,只要用这些宏操作就可以了,不过一般来说,自己写驱动时,除了pci驱动,其他的很少使用到。&nbsp;
high 发表于 2007-5-16 09:18 | 显示全部楼层

顶楼上,相当有经验。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

61

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部