- 论坛徽章:
- 0
|
原帖由 coco520 于 2006-9-8 15:05 发表
可以直接使用显卡的,3D功能也没有问题,所有的i/o,mmio操作穿透虚拟机就行了。
呵呵,恕我孤陋寡闻了.
据我所知道, xen 的机制中,如果物理内存有512MB,dom0用了 256 MB内存, addressing就是0-256, domU的OS的内存如果分配了虚拟的256MB,呢么它的addressing是" 0-256",但是这个addressing是 一个相对的地址,不是物理机器的地址. Xen 用了一种叫做shadow-paging的技术,domU看不到真正的物理内存的起点,他会以为domU的可用内存空间是从"真正的"0开始,其实是dom0分配给domU的绝对起点地址(256-512). 所以当domU的OS对视频进行操作的时候,寻址依据是相对于物理的,所以当操作通过dom0然后直接映射到物理机器上的时候,最终得到的结果并不是domU想要得那个位置的位置.只有当你的机器里面有IOMMU单元的时候,才可能穿透domU去操作物理的显示卡.
以前写过和显示卡打交道的程序的朋友知道,显示卡的驱动实际上将会在用户态的内存空间建立一个位图,位图信息映射到显示卡的现存, 假设显示卡以DMA方式工作.当domU里面虚拟的guest OS 发出指令说: 在内存那张位图的 100-120位置,有一段20MB大小的数据,要DMA出来然后放到显示卡内存的某个地址进行显示. 但是 100-120 是domU里面guest OS的自己认为的"物理地址",但是在真正的物理位置,那应该是到了256-276这个位置,但是现在的问题是无论是里面虚拟的guest OS还是外面那块物理的显示卡,都不知道发送过来的DMA指令到底是相对地址还是绝对的,所以显示卡会很忠实地去真正的物理位置的100-120 把20MB的数据取出来,然后DMA给显示卡,显示卡就依照取得的数据画在你的屏幕上了.
我不知道现在计算机专业的学生是否还要做类似操作显示卡的小程序功课,以前我们都会有兴趣去写一个,刚开始的时候经常遇到写的不好,地址操作错误,结果屏幕上就都是垃圾信息,乱七八糟的.
上面是对问题的解释,问题不是Xen造成的,是 现在普遍采用的计算机设备系统中缺少一个将物理地址统一成虚拟设备地址的硬件部件或者机制.
目前对xen这样问题的解决有2个,一个是购买装备有IOMMU硬件部件的计算机设备(服务器/工作站)。另一种方案是让硬件开发商,比如显示卡开发商,提供具备xen-aware (xen 感知)的显示卡驱动. 也就是当你准备在 普通PC上安装Xen的时候,你需要在dom0上面用 Xen-aware的显示卡驱动替换掉目前用的,因此当domU的guest OS对 显示卡操作的时候,dom0的 Xen-aware驱动可以把操作位图的地址转换成真正的物理地址来操作。 可以看出这2个方法实际上是从问题的2头分别来解决.
现在市面上装备有IOMMU设备的普通计算机设备不多,IBM在他们的一些系统上有IOMMU设备.
另外上面提到的所有讨论,并不仅限于显示卡,实际上,只要是类似的操作,比如guest OS需要通过南桥对IO外设进行操作,都会有这样的问题,所以IBM, Intel, AMD三家公司在这方面比较积极地投入解决方案。有兴趣的朋友可以 搜索google, 有一个文档,叫做"Utilizing IOMMUs for Virtualization in Linux and Xen" ,分别有IBM的三位开发人员, Intel, AMD的技术人员共同撰写,专门讨论我上面解释的问题. (IOMMU=I/O Memory Management Unit)
我还找到了IBM技术人员写的"Xen/IOMMU Breaking IO in New and Interesting Ways"的文档.有兴趣的朋友可以从 (http://www.xensource.com/company/xensummit.html)下载.
从技术角度来看,目前通过IOMMU来解决Xen para-虚拟中IO memory mapping到phy mem.addr的问题是最可行的,从intel, amd两家都参与进来得情况来看,新一代的系统主板上带有IOMMU也变的可能起来. 付出的硬件代价也会很低. 实际上Xen 06年的技术峰会上已经提到了目前Xen 在development 版本加入了独立的代码,用来支持IOMMU设备.
Good Luck,
[ 本帖最后由 nntp 于 2006-9-8 20:56 编辑 ] |
|