(4)virtio-net-pci设备realize流程 qdev_device_add接口中,还会调用realize接口,前面的instance_init只是实例的简单初始化,真实的设备相关的具体初始化动作都是从设备realize之后进行的。也就是相应class的realize接口。 首先在qdev_device_add()接口中,置位设备的realized属性,进而调用每一层class的realize函数。大家想...
device_class_set_parent_realize(dc, virtio_pci_dc_realize, &vpciklass->parent_dc_realize); // dc->reset = virtio_pci_reset; } device_class_set_parent_realize的核心逻辑是将dc 的realize赋值为virtio_pci_dc_realize,然后将vpciklass->parent_dc_realize设置为dc的初始值即pci_qdev_realize。 stati...
TYPE_VIRTIO_NET层的class_init函数是virtio_net_class_init,它定义了DeviceClass的realize函数为virtio_net_device_realize,这一点和存储块设备是一样的,如下所示: staticvoidvirtio_net_device_realize(DeviceState *dev, Error **errp) {VirtIODevice*vdev = VIRTIO_DEVICE(dev); VirtIONet *n =VIRTIO_NET(d...
根据queue个数生成2个NetClientState,现在有2个NetClientState,成对peer互相指向对方 代码语言:javascript 复制 virtio_net_device_realize └─qemu_new_nic └─qemu_net_client_setup//和tap init相比,peer不为NULL,是tap的NetClientState qemu对virtio-net-pci的初始化 代码语言:javascript 复制 virtio_device_re...
VirtIONet vdev; //virtio-net<---继承virtio-device<---继承device }; (4)virtio-net-pci设备realize流程 qdev_device_add接口中,还会调用realize接口,前面的instance_init只是实例的简单初始化,真实的设备相关的具体初始化动作都是从设备realize之后进行的。也就是相应class的realize接口。 首先...
通过上述流程,vdev已经得到了正确的realize函数,通过object_property_set_bool()流程就可以realize,调用的realize函数正是virtio_device_realize。 而virtio_device_realize就可以继续调用到vdc->realize,vdc就是该设备对象对应的类:TYPE_VIRTIO_BLK,其realize函数就是:virtio_blk_device_realize。
virtio_net_device_realize就到了我们的主角了,它进行了virtio通用的设置(后续在数据通信中再分析),还创建了一个NetClientState端点,与Tap设备对应,分别指向了对方,惺惺相惜,各自安好; virtio_bus_device_plugged表示设备插入总线时的处理,完成的工作就是按照PCI总线规划,配置各类信息,以便与Guest OS中的virtio驱动交互...
virtio_net_device_realize n-vqs0.tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, virtio_net_tx_timer, &n-vqs0); /创建发包定时器 static void virtio_net_tx_timer(void *opaque) . virtio_queue_set_notification(q-tx_vq, 1); /将avail_idx的值写入avail_event_idx中 virtio_net_flush_tx(q)...
当Qemu命令通过-device传入参数时,device_init_func会根据参数去查找设备,并最终调用到该设备对应的类初始化函数、对象初始化函数、以及realize函数; 所以,我们的分析就是这三个入口; 4.2.1 class_init 在网卡虚拟化过程中,参数只需要指定PCI代理设备即可,也就是-device virtio-net-pci, netdev=tap0,从而会调用到...
static void virtio_net_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtIONet *n = VIRTIO_NET(dev); NetClientState *nc; int i; virtio_init(vdev, "virtio-net", VIRTIO_ID_NET, n->config_size); n->max_queues = MAX(n->nic_conf.peer...