- 论坛徽章:
- 0
|
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
|