前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[qemu][acpi]acpi overflow的分析

[qemu][acpi]acpi overflow的分析

作者头像
皮振伟
发布2018-04-09 11:11:44
3.1K0
发布2018-04-09 11:11:44
举报
文章被收录于专栏:皮振伟的专栏

前言: qemu启动之后,打出了log: qemu-system-x86_64: Warning: ACPI tables are larger than 64k. qemu-system-x86_64: Warning: migration may not work. qemu-system-x86_64: Warning: please remove CPUs, NUMA nodes, memory slots or PCI bridges. 分析: 1,acpi build 源代码qemu-2.8/hw/i386/acpi-build.c 在acpi_build函数中,

可见,是在acpi的各个table都添加完成后,最后检查的时候,报出来的error。 2,build_dsdt 既然tables_blob->len超过了ACPI_BUILD_TABLE_SIZE (0x20000),那么要么减少tables_blob->len,要么增大ACPI_BUILD_TABLE_SIZE 。考虑到系统的稳定性,acpi table的大小最好不要动,就想办法改小tables_blob->len。 于是,在每次操作tables_blob的地方,加上debug log。

例如在acpi_add_table(table_offsets, tables_blob); 函数后面加上ACPI_BUILD_DPRINTF("%s,%d,%d\n", __FILE__, __LINE__, tables_blob->len); 编译运行后,发现build_dsdt()函数使用了很多内存。 3,build_memory_devices 同理,在build_dsdt()函数中,找到了build_memory_devices使用了大量内存。

分析build_memory_devices函数,可见,对于每一个memory slot都要使用一定的内存,其中每个dev使用了184bytes,每个ifctx使用了10bytes。 那么,(184 + 10) × 256 = 49664。 “ACPI tables are larger than 64k.”这个问题就是这里引起的。 4,memory slot 再来说memory slot。qemu实现了内存热添加能力,其原理就是dimm技术。qemu先alloc一块内存,作为memory device的内存,添加到memory slot上,guest里面通过acpi的事件,得知memory device热添加。 如果guest是linux的话,在/sys/devices/system/memory目录下会增加新的memory目录,选择online为0的,修改为1就能让memory上线。例如,执行echo 1 > /sys/devices/system/memory/memory/memory64/online 执行完命令后,通过free -h或者cat /proc/meminfo就可以看到内存增加了。 那么,减少memory slot会带来什么问题?memory slot代表虚拟机在每次启动之后,可以执行内存热添加的次数。如果每次添加128M,那么256次可以添加32G。如果每次添加512M,添加64次也可以达到32G。少了一些内存热添加的次数,看起来也不是特别大的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档