在vl.c中的main函数:
if (display_type == DT_NOGRAPHIC) {
if (default_parallel)
add_device_config(DEV_PARALLEL, "null");
if (default_serial && default_monitor) {
add_device_config(DEV_SERIAL, "mon:stdio");//没有
} else if (default_virtcon && default_monitor) {
add_device_config(DEV_VIRTCON, "mon:stdio");
} else {
if (default_serial)
add_device_config(DEV_SERIAL, "stdio");
if (default_virtcon)
add_device_config(DEV_VIRTCON, "stdio");
if (default_monitor)
monitor_parse("stdio", "readline");
}
} else {
if (default_serial)//default serial
add_device_config(DEV_SERIAL, "vc:80Cx24C");
if (default_parallel)//default parallel
add_device_config(DEV_PARALLEL, "vc:80Cx24C");
if (default_monitor)
monitor_parse("vc:80Cx24C", "readline");
if (default_virtcon)
add_device_config(DEV_VIRTCON, "vc:80Cx24C");
}
if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
exit(1);
if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
exit(1);
函数原型:static int foreach_device_config(int type, int (*func)(const char *cmdline))
struct device_config {
enum {
DEV_USB, /* -usbdevice */
DEV_BT, /* -bt */
DEV_SERIAL, /* -serial */
DEV_PARALLEL, /* -parallel */
DEV_VIRTCON, /* -virtioconsole */
DEV_DEBUGCON, /* -debugcon */
DEV_GDB, /* -gdb, -s */
} type;
const char *cmdline;
Location loc;
QTAILQ_ENTRY(device_config) next;
};
QTAILQ_HEAD(, device_config) device_configs = QTAILQ_HEAD_INITIALIZER(device_configs);
相关定义:
static int default_serial = 1;
static int default_parallel = 1;
默认设备列表:
static struct {
const char *driver;
int *flag;
} default_list[] = {
{ .driver = "isa-serial", .flag = &default_serial },
{ .driver = "isa-parallel", .flag = &default_parallel },
{ .driver = "isa-fdc", .flag = &default_floppy },
{ .driver = "ide-cd", .flag = &default_cdrom },
{ .driver = "ide-hd", .flag = &default_cdrom },
{ .driver = "ide-drive", .flag = &default_cdrom },
{ .driver = "scsi-cd", .flag = &default_cdrom },
{ .driver = "virtio-serial-pci", .flag = &default_virtcon },
{ .driver = "virtio-serial-s390", .flag = &default_virtcon },
{ .driver = "virtio-serial", .flag = &default_virtcon },
{ .driver = "VGA", .flag = &default_vga },
{ .driver = "isa-vga", .flag = &default_vga },
{ .driver = "cirrus-vga", .flag = &default_vga },
{ .driver = "isa-cirrus-vga", .flag = &default_vga },
{ .driver = "vmware-svga", .flag = &default_vga },
{ .driver = "qxl-vga", .flag = &default_vga },
};
/*串口数最大限制*/
#define MAX_SERIAL_PORTS 4
CharDriverState *serial_hds[MAX_SERIAL_PORTS];
/*并口数最大限制*/
#define MAX_PARALLEL_PORTS 3
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
将串口重定向到TCP端口:
vl.c中的main函数
->foreach_device_config(DEV_SERIAL,serial_parse)->serial_parse()->qemu_chr_new()->qemu_chr_parse_compat->qemu_chr_parse_compat->opts_do_parse
serial_parse()->qemu_chr_new_from_opts()->chr =
backend_table[i].open(opts);初始化socket->qemu_chr_open_socket()对socket进
行处理。
P.S:打印信息
serial---/root/work/qemu/qemu-1.2.0/vl.c:main:2957---command-parameters="tcp::3333,server,nowait"-----commond parameters parse and add to device list
serial------/root/work/qemu/qemu-1.2.0/vl.c:main:3592----start to call" foreach_device_config(DEV_SERIAL, serial_parse) "
serial------/root/work/qemu/qemu-1.2.0/vl.c:foreach_device_config:2048---conf-cmdline="tcp::3333,server,nowait" call the callback-fun:serial_parse
serial-----/root/work/qemu/qemu-1.2.0/vl.c:serial_parse:2069----label = serial0, devname = tcp::3333,server,nowait
serial-----qemu-char.c:qemu_chr_new:2821----
serial-----qemu-char.c:qemu_chr_parse_compat:2601----to create device
serial------qemu-char.c:qemu_chr_new_from_opts:2766---to init serial & socket
serial-----qemu-char.c:qemu_chr_open_socket:2439---set socket
评论