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

前言: 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做怎么样了。

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2017-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏格子的个人博客

JMeter安装配置和分布式

前段时间公司的新项目上线了一段时间之后,随着运营规模的变大,老大要求对系统进行一个摸底,那么肯定有人要为这个伟大的工作献身了,是的,那个人就是我。谁让我是就是打...

11520
来自专栏极客猴

Django 学习笔记之环境搭建

古人云:功遇善其事,必先利其器。在正式学习 Django Web 框架之前,我们要把准备工作做好。准备工作主要是搭建开发环境,具体工作是安装 Python、创建...

8620
来自专栏Java3y

外行人都能看懂的SpringCloud,错过了血亏!

认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)…

16510
来自专栏Rainbond开源「容器云平台」

使用Java构建微服务

11820
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API

写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已...

31350
来自专栏芋道源码1024

IntelliJ IDEA 内存优化最佳实践

【编者按】本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。

48770
来自专栏CSDN技术头条

外行人都能看懂的 Spring Cloud,错过了血亏!

这篇主要来讲讲 Spring Cloud 的一些基础知识。以下是 SpringCloud GitHub Demo ,看完文章的同学可以自己练手玩玩:

16830
来自专栏Java职业技术分享

阿里P8架构师谈:什么是缓存雪崩?服务器雪崩的场景与解决方案

分布式系统都存在这样一个问题,由于网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的。当网络不稳定的时候,作为服务的提供者,自身可能会被拖死,导致服...

41600
来自专栏散尽浮华

Centos7下部署分布式跟踪工具Pinpoint的操作记录

一、Pinpoint简单介绍 Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统、分布式跟踪系统。一般来说...

16420
来自专栏恰童鞋骚年

.NET Core微服务之基于Jenkins+Docker实现持续部署(Part 1)

  互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI) => 持续集成指的...

10040

扫码关注云+社区

领取腾讯云代金券