阅读:1579回复:12
ZYDCAT请进
我现在开发一个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] |
|
|
沙发#
发布于: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、物理地址、虚地址、线性地址有什么区别? ++++++++++++++ 看书吧,这些内容写出来也没有书上讲的清楚 |
|
|
板凳#
发布于:2002-06-07 10:04
我想知道我现在的内存物理地址,通过怎样转换才能对它进行读写操作?
|
|
|
地板#
发布于:2002-06-07 10:12
求救zydcat
上面的第三个问题,我的机器重新启动证明我用WRITE_REGIST_UCHAR(dx->PortBase, bvalue)不起,怎样来解决这个问题?我现在不对端口进行任何操作,我现在对内存操作! [编辑 - 6/7/02 by shengws] |
|
|
地下室#
发布于:2002-06-07 10:22
arthurt会告诉你的,我有点事。不好意思
|
|
|
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. |
|
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 |
|
7楼#
发布于:2002-06-07 10:27
不好意思,没仔细看ddk文档
就是用MmMapIoSpace将物理地址转换为可用的虚拟线性地址 |
|
|
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 |
|
9楼#
发布于:2002-06-07 10:39
求救zydcat 我没有做过内存映射的卡,不过我觉得应该是先使用MmMapIoSpace将你资源中的内存地址转换为可访问的地址 然后使用WRITE_REGISTER_UCHAR和READ_REGISTER_UCHAR来读写内存,详细的用法看看ddk文档 |
|
|
10楼#
发布于:2002-06-07 14:01
朋友们:
你们好!很感谢你们能在百忙之中给我解答问题,再次表示我的感谢!现在我的积分不多了,我暂时给你们每人10分。 我用mmmapiospace函数映射得到内存地址,然后对其进行读写 用WRITE_REGIST_UCHAR写一个字节我的机器就黑屏重起了,而用WRITE_PORT_UCHAR写机器最起码还能够工作。(当然应该用寄存器方式)这样我就搞不懂了,因为我们的板卡也是第一次做出来的,会不会是板卡的问题?我们的硬件工程师在我用端口方式写的时候用示波器来测pci芯片的写引脚,根本没有任何电平转换出现,我现在是想弄清楚究竟是硬件的问题还是软件驱动出现的毛病,还请你点播一二。 |
|
|
11楼#
发布于:2002-06-07 14:13
我现在又给不了分了,给分的地方我找不到了,怎么回事?
|
|
|
12楼#
发布于:2002-06-07 14:18
只能给一次分的。
|
|