前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[qemu][acpi]从虚拟化看ACPI

[qemu][acpi]从虚拟化看ACPI

作者头像
皮振伟
发布2018-04-09 11:26:17
4.7K0
发布2018-04-09 11:26:17
举报

前言: windows7中电源操作的“睡眠”和“休眠”的差别是什么? virsh命令查看到的虚拟机的pmsuspend状态是什么状态? ACPI又是什么鬼? 百度百度的ACPI词条:高级配置与电源接口(Advanced Configuration and Power Interface),简称ACPI,1997年由Intel、Microsoft、Toshiba 所共同制定提供操作系统应用程序管理所有电源管理接口。 对于软件工程师,很容易知道ACPI能做什么,但是很难想象ACPI到底什么。 正常的思路上,应该先了解具体的设备,硬件的构成,再看对应的软件如何使用,能完成什么功能。 然而,以作者自己为例,看到硬件的电路图,简直头晕。那么,换个思路,本文从ACPI设备的虚拟化出发,看软件如何虚拟化出来的ACPI设备,从代码上分析ACPI。 分析: 1,PCI device 在kvm虚拟机中执行lspci, 可见,ACPI本质来说,是一个pci设备,在i440fx上,接在了PCI 00:01.3上(即bus0,device1,function3).

在虚拟机中继续执行cat /proc/ioports,

那么,CPU可以使用io指令访问对应的地址,就可以控制ACPI设备了。 2,piix4 acpi 在qemu2.8/hw/acpi/piix4.c中,实现了acpi设备的虚拟化:

代码的上半段,是acpi的pci配置空间的设置。看白色背景的代码,可见,acpi主要实现了: a,acpi的timer。 b,acpi的event通知。 c,acpi的控制。 d,acpi的gpe。 3,acpi timer 在qemu2.8/hw/acpi/core.c中,实现了acpi timer的主要逻辑:

从上面的逻辑中来看,acpi timer是一个可以被guest控制开关的的timer(判断条件中的regs->pm1.evt.en & ACPI_BITMASK_TIMER_ENABLE),它的主要工作就是qemu中启动一个timer,周期性的注入中断(qemu_set_irq),这里再一次说明了timer就是一个周期性产生irq的设备。 4,acpi cnt 在qemu2.8/hw/acpi/core.c中,实现了acpi pm1 cnt的主要逻辑:

写pm1 cnt设备的时候,设备检查写下来的寄存器,对应上文的switch case语句,会根据不同的值来决定具体的行为: a,关机。如果guest触发了qemu_system_shutdown_request,那么qemu会先给qemu monitor发送SHUTDOWN消息,然后停掉虚拟机,qemu进程关闭。qemu进程的关闭,意味着虚拟机关机。 b,如果guest触发了qemu_system_suspend_request,那么qemu先向qemu monitor发出SUSPEND消息,再暂停虚拟机的所有vCPU。对于虚拟机来说,所有的cpu都不工作了。但是内存数据还是在的。那么恢复的时候,只需要重新启动cpu就行,在不重新初始化内存的情况下,就可以恢复到之前的状态。

c,如果guest选择了s4 request,那么qemu先向qemu monitor发出SUSPEND_DISK消息,然后停掉虚拟机。 5,acpi sleep 再回头来看,ACPI 睡眠状态的业界规范: 睡眠状态一共有5个不同的状态,分别为S1-S5,其中S1-S4对应的是G1状态,S5对应的为G2状态。 S1状态 ·唤醒时间短,所有的内容都会被保存。 ·CPU的输入时钟关闭。 ·系统内存进入自我更新的状态。 ·关闭所有的系统时钟,只有RTC继续保持工作。 S2状态 ·与S1状态相似——但系统内存会丢失。 ·在S2中,CPU和缓存被关闭。 ·S2状态中的唤醒延迟比S1长,但更省电。 S3状态(这就是我们熟悉的STR:Suspend to RAM) ·除了RAM,CPU、缓存、芯片组、外设均被关闭。 ·需要调用内存的设备仍然运行。 ·RAM转入低功耗、自我更新模式。 S4状态(STD:Suspend to Disk) ·包括RAM在内的所有部件均被关闭。 ·只保留平台设置,其他部分设置被保存在硬盘的特殊位置中。 ·成功切换至S4平台后,系统会关闭。 ·因为几乎所有的程序和配置都已经停止运行,因此功耗<3W。 ·唤醒计算机时需要再次进入“BIOS Boot Sequence”。 ·不需重启系统,计算机会继续执行。 S5状态(soft off) ·操作系统不去保留任何内容。 结合上文qemu对于acpi的实现,qemu通过qemu_system_suspend_request实现了S3状态。其中s4状态,需要操作系统把内存等信息保存在磁盘中,然后请求qemu关闭虚拟机。 回到前文中的问题,windows7的睡眠,对应的是S3状态,virsh命令看到的pmsuspend也是这种状态;休眠则是s4状态,如果是笔记本,下一次开机的时候,会发现直接启动windows的logo后直接打开了上次打开的程序。 题外话,大约三四年前,作者在半导体公司工作,那时候,智能电视普遍使用Android4以上了,一般启动都要半分钟以上,为了提升体验,就做了STR(S3),在RAM不断电,其他IP断电的情况下,功耗可以控制的比较低,TV从待机到启动,只用不到5s。不过因为TV芯片的内置IP很多,从断电到上电的状态恢复上,总是有很多细节需要控制不足,导致bug一直都没完没了,也不知道现在的TV的STR做怎么样了。

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

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

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

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

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