Samuel Thibault, le Mon 19 Nov 2007 15:20:16 +0000, a écrit : > Qemu currently uses 6 65k tables of pointers for handling ioports, which > makes 3MB on 64bit machines. There's a comment that says "XXX: use a two > level table to limit memory usage". But wouldn't it be more simple and > effective to just allocate them through mmap() and when a NULL pointer > is read, call the default handlers?
For the ioport_opaque array (500KB on 64bit), it's much simpler, as the attached patch suggests. Samuel
diff -r 6a6eace79e93 tools/ioemu/vl.c --- qemu/vl.c Mon Nov 19 15:04:05 2007 +0000 +++ qemu/vl.c Mon Nov 19 15:31:35 2007 +0000 @@ -139,7 +139,7 @@ const char *bios_dir = CONFIG_QEMU_SHAREDIR; char phys_ram_file[1024]; -void *ioport_opaque[MAX_IOPORTS]; +void **ioport_opaque; IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS]; IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS]; /* Note: bs_table[MAX_DISKS] is a dummy block driver if none available @@ -265,6 +265,7 @@ void init_ioports(void) { int i; + ioport_opaque = malloc(MAX_IOPORTS * sizeof(*ioport_opaque)); for(i = 0; i < MAX_IOPORTS; i++) { ioport_read_table[0][i] = default_ioport_readb; ioport_write_table[0][i] = default_ioport_writeb;