访问物理地址的问题,请大家帮忙

sanfutan   2009-8-31 08:09 楼主
用户程序要通过访问物理地址来控制外围的fpga芯片。我对这个实在没什么经验,能想到就是写个dll,里面用MmMapIoSpace()做个映射,访问完了返回前再unmap. 用户程序需要一上来就用loadkernellibrary把这个dll加载到内核,否则MmMapIoSpace会fail。现有以下几个问题:

1)我随便写个应用程序来测试,发现loadkernellibrary编译失败,loaddriver也不行,但loadlibrary()可以。这什么原因?我只include ,是不是需要什么特殊的头文件?

2)我觉得我这个法子很笨,每次调用只访问一个字节(大多情况都是只需要一个字节)都要map然后unmap,有没有效率更高的办法。

3)这个dll加载前都和内核一点关系没有,能不能把它build在内核里面,这样用户就不需要去加载,可以直接调用。

我实在是生手,才开始搞,身边也没人问,希望加大家能帮帮忙,感谢不尽。

回复评论 (10)

我觉得只能这样了。
点赞  2009-8-31 08:34
现在着急的就是问题1和问题3,要么在用户程序加载,要么build到nk.exe,系统加载内核的时候一起加载。这两个理论上都说的通,我相信都能实现。可我都有问题搞不定,希望谁有类似经验能指点我怎么实现。谢谢
点赞  2009-8-31 08:46
忘记说了,系统是 wince 6.0
点赞  2009-8-31 09:03
6.0的没弄过,看来5.0的比较简单啊
点赞  2009-8-31 09:34
你的dll是做的驱动吧
放在HKEY_LOCAL_MACHINE\Drivers\BuiltIn这个下面就会自动加载吧。
点赞  2009-8-31 09:40
写一个简单的流式驱动,在驱动里面进行物理地址的操作
点赞  2009-8-31 09:43
我看了个gooogleman以前的帖子,讨论类似的问题。http://topic.eeworld.net/u/20090617/15/2BF5D4A4-35AA-4641-8089-B7869C827F98.html
所以又把这个老贴翻出来。因为我到现在也没想明白。

我要应用程序随时能读出任意地址的内容,可能是main memory,也可能是io memory的。也可能是外围控制芯片的地址。老实说我到现在也没搞明白。我觉得这个难点不在于怎么载入驱动,而是驱动怎么建立映射。驱动dll不管用注册表 /ActivateDeviecEx,还是LoadKernellibrary,目的都是载入到kernel space。因为arm下必须用虚拟地址,所以必须建立虚拟到物理的映射才能访问内存/硬件地址。这个映射可以用virtualalloc /virtualcopy或者MmMapIoSpace,两者没有本质区别。但msdn上说这种情况必须在用virtualcopy的时候加上PAGE_PHYSICAL flag,MmMapIoSpace就是这样调用virtualcopy的。但是一但这样做的话这个映射就是静态映射,以后就没法release。这样其实也合理,因为对于驱动来说静态映射更合适。但如果要访问任意物理地址的话,必须要动态映射,否则虚拟内存分配还是地址映射都是以4k为单位的,很快虚拟内存就用光了。我做过这个实验,用 virtualalloc/virtualcopy或者MmMapIoSpace建立映射,头一次运行没问题,第二次访问相同物理地址的时候,取消映射(FreePhysPage)时会出现DEBUGCHK的运行错误。具体来说就是,kernel在取消映射前检查这个物理页面的ref counter,保证它不为0,说明的确有人在映射这个物理页面。但是这时候出现了0,所以出现异常。

这算是个有代表性的问题,我找了个别人相同的描述,而且微软mobil kernel team给了个回答
http://groups.google.co.in/group/microsoft.public.windowsce.platbuilder/browse_thread/thread/89059a39d6d6e7f9/2c2990666db6fa01?lnk=st&q=&rnum=1

但是我对这个回答理解的不是很明白,什么叫做 You can use the VirtualAddress returned from VirtualAlloc and do VirtualCopy with virtual address instead of physical. 是不是第二次访问相同地址的时候,用头一次得到的虚拟地址来代替本该作为参数的物理地址?这样的话就要保存以前访问的历史记录,而且映射没有释放掉,同样对系统影响很大,不适合用来访问任意地址。也不知道上面给出的那个软件是怎么做的。

大家谁有想法,咱们讨论一下。
点赞  2009-10-7 07:42
问题1,看看返回的错误代码是什么,判断出错的原因

问题3,可以build在内核中
点赞  2009-10-7 08:20
抱歉没说明白,别看一楼的问题了,新的问题在7楼
-- 我是不是该新开个帖子?
点赞  2009-10-7 08:52
引用: 引用 9 楼 wangyan_ua 的回复:
抱歉没说明白,别看一楼的问题了,新的问题在7楼
-- 我是不是该新开个帖子?


是的
点赞  2009-10-7 09:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复