3697|10

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

访问物理地址的问题,请大家帮忙 [复制链接]

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

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

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

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

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

最新回复

是的  详情 回复 发表于 2009-10-7 09:21
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我觉得只能这样了。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
现在着急的就是问题1和问题3,要么在用户程序加载,要么build到nk.exe,系统加载内核的时候一起加载。这两个理论上都说的通,我相信都能实现。可我都有问题搞不定,希望谁有类似经验能指点我怎么实现。谢谢
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
忘记说了,系统是 wince 6.0
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

5
 
6.0的没弄过,看来5.0的比较简单啊
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
你的dll是做的驱动吧
放在HKEY_LOCAL_MACHINE\Drivers\BuiltIn这个下面就会自动加载吧。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
写一个简单的流式驱动,在驱动里面进行物理地址的操作
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

8
 
我看了个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. 是不是第二次访问相同地址的时候,用头一次得到的虚拟地址来代替本该作为参数的物理地址?这样的话就要保存以前访问的历史记录,而且映射没有释放掉,同样对系统影响很大,不适合用来访问任意地址。也不知道上面给出的那个软件是怎么做的。

大家谁有想法,咱们讨论一下。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题1,看看返回的错误代码是什么,判断出错的原因

问题3,可以build在内核中
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
抱歉没说明白,别看一楼的问题了,新的问题在7楼
-- 我是不是该新开个帖子?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 wangyan_ua 的回复:
抱歉没说明白,别看一楼的问题了,新的问题在7楼
-- 我是不是该新开个帖子?


是的
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表