目录
1. 总线类型
类:BusClass
对象:BusState
类型:TYPE_BUS
TYPE_BUS
bus_info
TYPE_PCI_BUS
BUS 类初始化:bus_class_init
对象实例化函数:qbus_initfn
bus 具现化函数 bus_get_realized
2. 总线的创建
qbus_create_inplace
qbus_create
qbus_realize 只是创建对象,不是真正的具现化
控制器设备具现化的时候device_set_realized 中对总线对象进行真正的具现化
3. 设备数据类型
使用 DeviceClass 表示设备,表示设备具有的共性
DeviceState 具体设备实例,是 TYPE_DEVICE 的实例,表示所有设备都会有的特性
4. 设备的创建
两种创建方式:
- 跟随主板创建,qdev_create,调用 object_new创建对应设备的QOM对象,然后进行具现化
- 通过 -device 或 QMP 中 通过 device_add 添加,qdev_device_add,调用 object_new创建对应设备的QOM对象,然后进行具现化
qdev_create
qdev_try_create
具现化 qdev_init_nofail
qdev_device_add
5. 设备树形结构
树形结构包括设备和总线,起点是系统总线
sysbus_get_default 创建系统总线
main_system_bus_create,名字是"main-system-bus",类型是system_bus_info,挂载该宗县的设备类型都是 TYPE_SYS_BUS_DEVICE,系统根总线,不再任何设备上,该总线不能具现化
以系统总线为起点,根据 总线--> 设备 --> ......总线 --> 设备的关系,形成了一个设备树
i440fx_init 创建北桥,Host bridge以及PCI根总线
pci_root_bus_new,类型是TYPE_I440FX_PCI_HOST_BRIDGE, 是北桥
然后qbus_create 创建pci.0总线bus,父设备parent为北桥芯片i440fx_init 中的dev,返回bus,给i440fx_init中的b
pci_root_bus_init
i440fx_init 中将北桥设备对象dev 加入到machine下的i440fx对象上
i440fx_init 中,创建一个PCI设备,类型是TYPE_I440FX_PCI_DEVICE,在PCI总线b(pci.0)的0号槽位。表示北桥隶属于PCI总线的哪一部分(0号槽位)
i440fx_init 中创建PIIX3设备,挂在总线 b(pci.0)下面
piix3_realize,下面创建总线isa.0
创建各种设备
fw_cfg_init_io_dma
USB 控制器,Host Controller Device HCD
每个 device命令行,调用 device_init_func,里面调用 qdev_device_add 创建设备
qbus_find_recursive
qdev_device_add
qdev_set_parent_bus
bus_add_child
qdev_device_add 实例化设备
device_set_realized
usb_ohci_realize_pci
usb_ohci_init
TYPE_USB_BUS
usb_bus_new 完成USB总线添加