shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
阅读:1579回复:12

ZYDCAT请进

楼主#
更多 发布于:2002-06-06 16:05
我现在开发一个PCI的驱动程序,出现以下问题,还请哥哥帮忙看一下,小弟不胜感激!
我的驱动程序的资源为:
内存范围E0000000-E03FFFFF
输入输出范围E800-E8FF
中断请求09
开发环境2kddk,vc6

问:
1、MmMapIoSpace这个函数是不是将端口(或内存)的物理地址转换成线性地址?

2、我将从资源列表中取得的内存物理地址用MmMapIoSpace函数转换保存到dx->PortBase变量中,
再用WRITE_PORT_UCHAR(dx->PortBase, bvalue)函数将bvalue字节读到端口,然后再用
READ_PORT_BUFFER_UCHAR(dx->PortBase+reg,(PUCHAR)WW,4)函数将刚读入的数据取出来,
取4个字节,结果全是FFFFFFFF,原因?

3、我用WRITE_REGIST_UCHAR(dx->PortBase, bvalue)函数代替WRITE_PORT_UCHAR,
机器屏幕变黑便重新启动了,这两个函数有什么区别?

4、我跟踪我所取到的线性地址,其低半部分是相同的,高半部分每次取到的都不同,请问这些线性地址是不是都对应的是同一个物理地址?

5、我不知道用以上的函数是否可以对系统分配的内存(不是端口)进行读写?

6、我如何才能正确对系统分配给我的物理地址进行正确读写?

7、物理地址、虚地址、线性地址有什么区别?

[编辑 -  6/7/02 by  shengws]

[编辑 -  6/7/02 by  shengws]
喂,小孩,你的小JJ露出来了!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-07 09:30
1、MmMapIoSpace这个函数是不是将端口(或内存)的物理地址转换成线性地址?
++++++++++++++++++++++
好像不是吧,看看ddk的解释:
PVOID
  MmMapIoSpace(
  IN PHYSICAL_ADDRESS PhysicalAddress,
  IN ULONG NumberOfBytes,
  IN MEMORY_CACHING_TYPE CacheEnable
  );
MmMapIoSpace maps the given physical address range to nonpaged system space


2、我将从资源列表中取得的内存物理地址用MmMapIoSpace函数转换保存到dx->PortBase变量中,
再用WRITE_PORT_UCHAR(dx->PortBase, bvalue)函数将bvalue字节读到端口,然后再用
READ_PORT_BUFFER_UCHAR(dx->PortBase+reg,(PUCHAR)WW,4)函数将刚读入的数据取出来,
取4个字节,结果全是FFFFFFFF,原因?

+++++++++++++++++++++
faint,内存物理地址怎么能用来对端口读写,不错才怪呢。你的端口基址不是E800吗,这也是可以从资源中得到的,用他来读写端口。

3、我用WRITE_REGIST_UCHAR(dx->PortBase, bvalue)函数代替WRITE_PORT_UCHAR,
机器屏幕变黑便重新启动了,这两个函数有什么区别?
+++++++++++++++++++++
区别大了,
WRITE_REGIST_UCHAR是向一个内存地址写值
WRITE_PORT_UCHAR是向i/o端口写值

4、我跟踪我所取到的线性地址,其低半部分是相同的,高半部分每次取到的都不同,请问这些线性地址是不是都对应的是同一个物理地址?
+++++++++++++++++++++
应该是同一个物理地址,地址映射机制可以让不同的线性地址指向同样的物理地址

5、我不知道用以上的函数是否可以对系统分配的内存(不是端口)进行读写?
+++++++++++++++++
WRITE_REGIST_UCHAR可以

6、我如何才能正确对系统分配给我的物理地址进行正确读写?
++++++++++++++++++++
确定地址正确,读写函数正确

7、物理地址、虚地址、线性地址有什么区别?
++++++++++++++
看书吧,这些内容写出来也没有书上讲的清楚
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-07 10:04
我想知道我现在的内存物理地址,通过怎样转换才能对它进行读写操作?
喂,小孩,你的小JJ露出来了!
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-07 10:12
求救zydcat
上面的第三个问题,我的机器重新启动证明我用WRITE_REGIST_UCHAR(dx->PortBase, bvalue)不起,怎样来解决这个问题?我现在不对端口进行任何操作,我现在对内存操作!

[编辑 -  6/7/02 by  shengws]
喂,小孩,你的小JJ露出来了!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-07 10:22
arthurt会告诉你的,我有点事。不好意思
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-06-07 10:22
MmMapLockedPages
PVOID
  MmMapLockedPages(
  IN PMDL MemoryDescriptorList,
  IN KPROCESSOR_MODE AccessMode
  );
MmMapLockedPages maps physical pages described by a given MDL.

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-06-07 10:24
内存范围,用
MmMapIoSpace
PVOID
  MmMapIoSpace(
  IN PHYSICAL_ADDRESS PhysicalAddress,
  IN ULONG NumberOfBytes,
  IN MEMORY_CACHING_TYPE CacheEnable
  );
MmMapIoSpace maps the given physical address range to nonpaged system space.

A driver must call this routine during device start-up if it receives translated resources of type CmResourceTypeMemory. MmMapIoResource maps the physical address returned in the resource list to a logical address through which the driver can access device registers.

For example, drivers of PIO devices that allocate long-term I/O buffers can call this routine to make such a buffer accessible or to make device memory accessible.

Callers of MmMapIoSpace must be running at IRQL = PASSIVE_LEVEL
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-07 10:27
不好意思,没仔细看ddk文档
就是用MmMapIoSpace将物理地址转换为可用的虚拟线性地址
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-07 10:38
>>MmMapIoSpace这个函数是不是将端口(或内存)的物理地址转换成线性地址?
------------------------------------------------------------------------
说“转换”并不好,系统会将你所需的物理地址映射到系统非分页地址区,关键在于修改PTE以“映射”这点上。之所以命名“IoSpace”,因为对于大多非x86的RISC机器(比如Alpha61x64)而言,外设端口被映射在物理地址上,没有x86IO空间的概念。事实上WRITE_REGIST_UCHAR就主要为它们所用,当然在x86上它仍有别的意义,下面可以见到。
>>WRITE_REGIST_UCHAR与WRITE_PORT_UCHAR两个函数的区别:
与机器体系相关,对于x86处理器,参见2000代码:
WRITE_PORT_UCHAR:由Hal.dll导出
mov edx,[esp+04]
mov al,[esp+08]
out dx,al;access io port
ret 0008

WRITE_REGISTER_UCHAR:由ntoskrnl.exe导出
mov edx,[esp+04]
mov al,[esp+08]
mov [edx],al ;access memory
lock or [esp+04],edx ;对x86而言,它与你直接读写内存的区别就在于此:为弱排序乱序执行的x86处理器而设
ret 0008
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-07 10:39
 
求救zydcat
上面的第三个问题,我的机器重新启动证明我用WRITE_REGIST_UCHAR(dx->PortBase, bvalue)不起,怎样来解决这个问题?我现在不对端口进行任何操作,我现在对内存操作!


我没有做过内存映射的卡,不过我觉得应该是先使用MmMapIoSpace将你资源中的内存地址转换为可访问的地址
然后使用WRITE_REGISTER_UCHAR和READ_REGISTER_UCHAR来读写内存,详细的用法看看ddk文档
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-06-07 14:01
朋友们:
你们好!很感谢你们能在百忙之中给我解答问题,再次表示我的感谢!现在我的积分不多了,我暂时给你们每人10分。
我用mmmapiospace函数映射得到内存地址,然后对其进行读写
用WRITE_REGIST_UCHAR写一个字节我的机器就黑屏重起了,而用WRITE_PORT_UCHAR写机器最起码还能够工作。(当然应该用寄存器方式)这样我就搞不懂了,因为我们的板卡也是第一次做出来的,会不会是板卡的问题?我们的硬件工程师在我用端口方式写的时候用示波器来测pci芯片的写引脚,根本没有任何电平转换出现,我现在是想弄清楚究竟是硬件的问题还是软件驱动出现的毛病,还请你点播一二。
喂,小孩,你的小JJ露出来了!
shengws
驱动大牛
驱动大牛
  • 注册日期2002-03-08
  • 最后登录2010-06-21
  • 粉丝0
  • 关注0
  • 积分384分
  • 威望102点
  • 贡献值0点
  • 好评度37点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-07 14:13
我现在又给不了分了,给分的地方我找不到了,怎么回事?
喂,小孩,你的小JJ露出来了!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-06-07 14:18
只能给一次分的。
游客

返回顶部