免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2067 | 回复: 3
打印 上一主题 下一主题

如何在不用IOMMU的情况下,限制XEN的DM? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-29 10:05 |只看该作者 |倒序浏览
10可用积分
一般来说, XEN里的DRIVER DOMAIN必须是被信任的,就好像HYPERVISOR一样. 因为一个恶意驱动可以利用硬件DMA来访问其他DOM U的物理内存.

为了防止恶意驱动(这里是指DOM 0 或者DRIVER DOMAIN里的真正驱动,不是DOM U 里的FRONT END DRIVER), 一般的做法是利用IOMMU. 这样可以允许一个外设只能访问指定的物理内存(而不是全部).

我现在在做一个研究课题, 想通过软件的方法来防止恶意驱动访问他不该访问的物理内存.我的想法是:假设设备厂商已经公开了哪个寄存器是关于DMA操作的. 然后在HYPERVISOR里面,想办法拦截WRITEB(ADDR, VAL)这样的操作.当发现驱动要向DMA里写物理地址时,检查下那个地址是否合法.

但是我发现有一些问题:
1) 如何拦截WRITEB 这样的操作? WRITEB是一个宏,而且最后基本上就是一个赋值,或者是MOV指令.这样的指令如何拦截?
2) 如何知道何时是在写DMA操作? 一个理想化的方法是能够提前知道DMA操作时的ADDR. 那么每次拦截了WRITEB之后,都检查下ADDR是不是我们关心的那个. 但是ADDR=BASEA+OFFSET. OFFSET很容易查出来,就是看硬件说明书.但是BASE一般是通过IOREMAP来获得的.而调用IOREMAP的情况可能很多,如何知道某一次调用是我们关心的驱动进行的?

请高手指点下. 多谢!

最佳答案

查看完整内容

请看去年USENIX 年会上面的一篇文章,里面有提到和你相似的东西,但是好像具体实现细节没有说http://www.usenix.org/events/usenix08/tech/full_papers/willmann/willmann_html/index.html

论坛徽章:
0
2 [报告]
发表于 2009-05-29 10:05 |只看该作者
请看去年USENIX 年会上面的一篇文章,里面有提到和你相似的东西,但是好像具体实现细节没有说
http://www.usenix.org/events/use ... ann_html/index.html

论坛徽章:
0
3 [报告]
发表于 2009-05-29 22:41 |只看该作者
原帖由 accessory 于 2009-5-29 10:05 发表
一般来说, XEN里的DRIVER DOMAIN必须是被信任的,就好像HYPERVISOR一样. 因为一个恶意驱动可以利用硬件DMA来访问其他DOM U的物理内存.

为了防止恶意驱动(这里是指DOM 0 或者DRIVER DOMAIN里的真正驱动,不是DO ...

说说我自己的理解:
你的方法理论上可行,但实际却相反:
1)hypervisor不能捕获DMA,只可能捕获可能引发DMA的MMIO或者PIO
2)这对某一种特定类型的设备也许也能捕获,但设备的种类太多,不太可能有高效并且通用的方式做这种类型的检查

论坛徽章:
0
4 [报告]
发表于 2009-05-30 22:09 |只看该作者
TO 2楼: 基本同意你的说法. 这个方法比IOMMU 是要差些,而且需要预先知道每个设备的DMA操作的地址. 实用起来不是很方便. 不过在没有IOMMU, 用户又想限制DOM 0 OR DRIVER DOMAIN的时候,只能用类似的软件方法.

TO 3楼: 谢谢提醒,那篇文章我以前看过,等我再复习复习.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP