免费注册 查看新帖 |

Chinaunix

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

建立虚拟PCI设备时碰到的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-29 16:28 |只看该作者 |倒序浏览
10可用积分
其实我原来发过这个帖子,http://linux.chinaunix.net/bbs/thread-1064935-1-6.html

现在碰到的问题还是无法触发PCI驱动框架中的probe函数,

确切的说不知道怎么来虚构一个pci设备,并且顺利的让它和其驱动绑定起来,

希望大家帮我一起想想办法!

论坛徽章:
0
2 [报告]
发表于 2009-03-29 20:47 |只看该作者
原帖由 almeydifer 于 2009-3-29 16:28 发表
其实我原来发过这个帖子,http://linux.chinaunix.net/bbs/thread-1064935-1-6.html

现在碰到的问题还是无法触发PCI驱动框架中的probe函数,

确切的说不知道怎么来虚构一个pci设备,并且顺利的让它和其驱 ...



虚拟设备可以看qemu的实现。

论坛徽章:
0
3 [报告]
发表于 2009-03-29 23:03 |只看该作者

回复 #1 almeydifer 的帖子

我觉得挺简单的东西,不就虚拟一个pci设备么。

1.修改PCI Configration RD/WR,为你的虚拟设备选择一个没有被占用的BDF地址,构建一个256字节的数组,写好数组的内容,例如VendorID, Device ID。。。。当读写函数的BDF地址是你的虚拟设备的地址时,返回数组相应偏移的值和修改相应偏移的值。

2.编译内核, 启动,这时候lspci应该就可以发现你这个虚拟的pci设备了(前提是你上面数组的内容是合法的),设备的信息取决于你数组的内容。

3. 写驱动,分配一段内存。如果你还想体验一把内存映射,就先得到物理地址,并把起始物理地址写入任意一个BAR中,然后remap。

论坛徽章:
0
4 [报告]
发表于 2009-03-30 08:44 |只看该作者

回复 #3 bluesky_jxc 的帖子

修改PCI Configration RD/WR,为你的虚拟设备选择一个没有被占用的BDF地址,构建一个256字节的数组,写好数组的内容,例如VendorID, Device ID。。。。当读写函数的BDF地址是你的虚拟设备的地址时,返回数组相应偏移的值和修改相应偏移的值。
-------------------------------------------------------------------------------
虚拟PCI的配置文件应该是怎么样驻留在内存中
不解~  望解答~

论坛徽章:
0
5 [报告]
发表于 2009-03-30 11:02 |只看该作者
原帖由 bluesky_jxc 于 2009-3-29 23:03 发表
我觉得挺简单的东西,不就虚拟一个pci设备么。

1.修改PCI Configration RD/WR,为你的虚拟设备选择一个没有被占用的BDF地址,构建一个256字节的数组,写好数组的内容,例如VendorID, Device ID。。。。当读写 ...



你说的方法是直接在device tree上搞一个假设备出来吧,跳过了枚举阶段。但楼主在另一个帖子里却要求Guest domain也能访问这个设备,那就需要把枚举也得模拟出来了。

论坛徽章:
0
6 [报告]
发表于 2009-03-30 11:20 |只看该作者
原帖由 Solaris12 于 2009-3-30 11:02 发表



你说的方法是直接在device tree上搞一个假设备出来吧,跳过了枚举阶段。但楼主在另一个帖子里却要求Guest domain也能访问这个设备,那就需要把枚举也得模拟出来了。


其实现在只要bluesky的步骤的第一步。
我想问如果按照bluesky的方法,是不是要自己自定义一个虚拟总线,虚拟PCI设备。
我现在正在仿照qemu源码里的pci.c,pci.h里的一些函数调试,不知道能否成功。

其他的以后再说。

论坛徽章:
0
7 [报告]
发表于 2009-03-30 11:33 |只看该作者
原帖由 almeydifer 于 2009-3-30 11:20 发表


其实现在只要bluesky的步骤的第一步。
我想问如果按照bluesky的方法,是不是要自己自定义一个虚拟总线,虚拟PCI设备。
我现在正在仿照qemu源码里的pci.c,pci.h里的一些函数调试,不知道能否成功。

其他 ...


不知道你的目的是什么,如果是虚拟机的内存共享,那虚拟机本身已经提供了接口,根本不需要你通过模拟设备来做。

如果只是在非虚拟机环境使用,那么bluesky的建议很简单了,根本不需要看QEMU的代码。

直接看一下Device tree的实现,把配置空间的读写ioremap的实现都看明白就能写了。

因为你的设备是假的,所以你在代码里把对你这个设备的配置空间读写都截获然后模拟返回正确结果就可以了。

论坛徽章:
0
8 [报告]
发表于 2009-03-30 14:38 |只看该作者
原帖由 Solaris12 于 2009-3-30 11:33 发表


不知道你的目的是什么,如果是虚拟机的内存共享,那虚拟机本身已经提供了接口,根本不需要你通过模拟设备来做。

如果只是在非虚拟机环境使用,那么bluesky的建议很简单了,根本不需要看QEMU的代码。

...


谢谢Solaris 12的耐心的解答,其实在半虚拟化的guestOS之间,可以用Xen的接口,叫做Grant Table。
但是在全虚拟化guestOS之中,是没有Grant Table机制的,也就是说,虚拟机并没有提供这方面的接口为我们使用,
所谓的Event Channel 只是一个异步的消息传递机制,并不能用来传递数据。

我天生愚笨,摸了半天还是没有摸清,如何“修改PCI Configration RD/WR”。
指的是要修改内核当中的config_read,和config_write函数吗?

[ 本帖最后由 almeydifer 于 2009-3-30 15:02 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-03-30 15:42 |只看该作者

回复 #8 almeydifer 的帖子

对的

论坛徽章:
0
10 [报告]
发表于 2009-03-30 16:15 |只看该作者
原帖由 almeydifer 于 2009-3-30 14:38 发表


谢谢Solaris 12的耐心的解答,其实在半虚拟化的guestOS之间,可以用Xen的接口,叫做Grant Table。
但是在全虚拟化guestOS之中,是没有Grant Table机制的,也就是说,虚拟机并没有提供这方面的接口为我们使 ...


最近一直在Para virtulaization的环境做开发,所以对全虚拟化的了解不多。

但是xen全虚拟化也支持pv driver啊,所以你只要看看全虚拟化的pv驱动怎么写的就可以了。

我猜有pv driver的话肯定要用event channel 和grant table.

貌似xen在qemu里实现了个虚拟设备,有自己的device id,hvm虚拟机可以驱动这个设备,hvm里也可以加载前端driver,我怀疑就是你要的东西。

[ 本帖最后由 Solaris12 于 2009-3-30 16:17 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP