操作系统是如何能够知道电池电量的呢?

即使我们移除默认操作系统并安装一个新的操作系统,它仍然可以与电池进行交互。这个操作系统有对应的驱动程序吗?它是如何工作的?
3个回答

作为对其他答案的补充,运行在计算机上的软件如何知道电池的电量?它向电池询问。

大多数笔记本电脑电池是智能电池,具有自己的微控制器或“燃料计” ASIC,主机可以通过 SMBus 与其通信。人们已经对一些示例进行了逆向工程。

SMBus 可能直接暴露给操作系统,以便管理员可以直接查询它。有各种程序,如 OpenHardwareMonitor、Speccy 或 lm-sensors,可以通过询问总线来了解硬件情况。


非常好的解释,可以帮助我们对基本概念有一个整体的理解!虽然我会在单词“asks”周围加上引号。 - Albin
我的回答没有冲突:SMBus是由ACPI管理的组件,适用于存在该组件的移动计算机。 - harrymc
1这个智能电池接口也可以通过更标准的方式暴露出来,比如USB。例如,许多UPS设备上都有一个USB端口,当插入计算机时,它会告诉计算机还剩下多少电量,并像笔记本电脑一样显示出来。 - TheHans255
2@TheHansinator 我认为SMBus是与智能电池通信的标准方式。几乎所有手机和笔记本电脑都使用它,这比使用外部UPS设备的系统要多得多。 - Austin Hemmelgarn
@AustinHemmelgarn 是的。也许更合适的词是“传统”,因为这个系统基本上是一个除了嵌入式电池之外的设备都可以使用的操作系统抽象层。 - TheHans255

操作系统与嵌入式控制器的固件进行接口交互,该控制器是高级配置与电源接口(ACPI)的一部分。维基百科将其定义为: 在计算机中,高级配置与电源接口(Advanced Configuration and Power Interface, ACPI)提供了一种开放标准,以便操作系统可以用来发现并配置计算机硬件组件、通过将未使用的组件置于睡眠状态等来执行电源管理,并进行状态监测。ACPI首次发布于1996年12月,旨在替代Advanced Power Management (APM)、多处理器规范和即插即用BIOS (PnP) 规范。ACPI将电源管理置于操作系统的控制之下,而不是依赖于平台特定的固件来确定电源管理和配置策略。 在内部,ACPI使用通过系统固件(统一可扩展固件接口(UEFI)或BIOS)提供的指令列表(“方法”)向操作系统内核广告其可用组件及其功能,内核解析这些指令列表。然后,ACPI使用嵌入式最小虚拟机执行所需的操作(例如硬件组件的初始化)。 答案是,主板上嵌入了电路或微芯片, 它本身包含一个微操作系统,通过计算机固件-UEFI或BIOS提供一些服务。 它控制许多方面的电源和设备管理。 计算机操作系统有一个系统驱动程序,专门用于与ACPI接口。 一旦激活ACPI,它就会独占所有方面的电源管理和设备配置。 在许多方面,ACPI是您操作系统后面的操作系统, 除了它随主板而来并不在您的控制之下。 有人将其比作特洛伊木马,并称其为安全风险。 它可以被禁用,但某些计算机可能无法启动, 而高级电源管理也将被禁用。 有关其在Windows中使用的更多信息,请参见文章 Battery and power subsystem hardware design

1我可能错了,但听起来最后一段的描述完全混淆了ACPI和SMM,以及Intel的ME/AMT。ACPI主要是一个静态数据结构,只有少量字节码需要操作系统自己解释,而ME才是实际的系统。 - user1686
1@grawity:我不这么认为。你可以在维基百科的ACPI文章中找到类似的讨论。 - harrymc
1我在那里看不到太多的讨论,除了一篇Shuttleworth的博客文章中的几句引用之外。在阅读了这两页内容后,我完全不被说服——在我看来,他只是把系统中的_所有东西_都归为"ACPI"的范畴,无论是BIOS还是Intel ME或其他什么。据我所知,在现代系统中,除了ACPI之外,所有垃圾都可能独立运行,当然也不会在操作系统下运行。 - user1686
2ACPI还包括一个固件级别的代码执行接口,这就是许多涉及其交互的固件操作的实际发生方式。在某些系统上,甚至使用SMM来进行实际的代码执行,不过这种情况越来越少见,令人庆幸。 - Austin Hemmelgarn
@grawity:是的,ACPI只是一个控制器,从这个意义上说它什么都不做。UEFI/BIOS同样管理设备,并且在硬件层次结构中处于较高位置,其中之一就是ACPI。每个层次都将功能外部化,同时随着层次的增加,功能也变得越来越通用化。操作系统等软件的设计也采用了类似的层次通用化方法,这是人类解决复杂问题的方式。 - harrymc
这里的答案是最正确的。ACPI主要由查找表组成。重力是关于Linux创始人对UEFI的厌恶而不是ACPI的混乱讨论。ACPI是一个逻辑解决方案,而UEFI是一个非常臃肿的BIOS。此外,UEFI基本上使Linux变得有些无用,这激发了Linus的反对之情。ACPI和UEFI与Intel ME没有直接关联。Intel ME是一个安全执行引擎,与构成BIOS、UEFI或操作系统的所有方面进行交互。 - marshal craft
简而言之(这远不止于此),Intel ME验证了由处理器运行的所有内容。此外,它还包括由Intel远程更新的微码。微码首先运行。处理器在运行微码的同时,从SPI闪存中加载非Intel代码。闪存有一个类似目录的闪存描述符部分。在这里,固件开发人员可以控制闪存的结构。它必须包含一个安全执行部分,通常需要验证固件确实是由可信任方签名的。 - marshal craft
签名等签署机制存储在安全的内存寄存器中,拥有保险丝以使其成为只读状态。值得注意的是,苹果并未正确配置这些功能,允许远程用户恶意更改和使用,尽管据报道这是英特尔的错,但实际上只是苹果没有费心去配置。总之,大部分信息在公共领域都没有记录。英特尔选择原始设备制造商,并提供给他们文档。此外,安全执行引擎可以运行类似Java脚本,访问无线网络,甚至在计算机关闭时运行。 - marshal craft
Acpi和uefi是定义启动Windows设备所需固件的两个主要文档。这两个文档都有非常详细的说明,并且在公共领域中可获得。Intel是uefi文档和uefi固件的主要开发者。Microsoft主要负责开发Acpi。因此,这些描述了它们的一些内容。一旦执行了Windows或Linux的引导加载程序(作为uefi脚本),操作系统就接管了控制权,处理器切换执行状态,uefi的任务也就完成了。这就是为什么uefi有点愚蠢的原因。 - marshal craft
我们正在谈论非常先进的 BIOS,它基本上是一个独立的操作系统/BIOS,能够运行便携式可执行文件。Chromebook 基本上是在运行 chrome.exe 的 UEFI。所有这些复杂性只是为了检查硬件、加载操作系统,然后在下次重启之前不做任何事情。 - marshal craft
另一方面,Acpi由UEFI强制使用和操作系统驱动程序使用。UEFI现在具备并要求驱动程序,但在Windows中使用UEFI驱动程序将降低性能。Windows确实需要专门的驱动程序,但也可以凑合使用。Acpi主要由表格和AML组成,基本上是针对硬件的特定汇编语言。 - marshal craft
更重要的是,Windows中的根驱动程序是ACPI.SYS,所有其他驱动程序都是该驱动程序的子级。这个驱动程序是Windows内核驱动程序框架的基本组成部分。例如,PCI总线将是一个总线驱动程序,并由acpi.sys加载。 - marshal craft
@marshalcraft:在我的帖子中,我从未提到过Linus Torvalds(Linux的创造者)。Mark Shuttleworth是Ubuntu Linux发行版的创始人,但他并没有创建Linux本身。 - user1686
更好的问题是,在这次讨论中,在哪个地方谁开发了Linux有关系吗?那不是重点。这是关于ACPI的。Linus主要公开表达了对UEFI的担忧。我提出这一点的原因是因为有足够的理由反对使用UEFI。另一方面,ACPI具有更明显的作用。但这两者是相关的,UEFI需要ACPI。 - marshal craft
我并不是想贬低任何人,而是提供一个更准确的描述。我相信这是一个影响人类的核心问题。没有人可以质疑英特尔在人类社会中所扮演的角色。目前,英特尔对其可信执行引擎(以前称为ME)的处理是一个关键问题。UEFI和ACPI在根本上是相关的,然而核心问题在于可信执行引擎。 - marshal craft
Txe存在几个问题,其中之一是未经客户同意甚至知情就使用客户财产的欲望引入。但更紧迫的问题是对原始设备制造商开发者设置的人为准入壁垒。这导致了一种技术独裁。虚假的自由市场、虚假的创新,只是一个巨大的好莱坞舞台。只有百万分之一的人口拥有真正的创新能力,并在社会中扮演角色。 - marshal craft
毫无疑问,这只是一个假的好莱坞布景,一个精心设计的大富翁游戏,其结果事先被精确计算过。然而,唯一真正的解决方案是降低半导体开发成本,而这只能通过公众对化学/物理世界的深入了解以及对自己思维能力的更高意识的大幅提升来实现。 - marshal craft

更一般地说,所有的计算机芯片都有文档,告诉设计师和程序员它们的功能以及如何配置它们进行操作。通过直接读写芯片的寄存器可以进行对这些芯片的低级访问。 更复杂的芯片可能会附带一个名为“驱动程序”的软件程序,该程序允许对操作系统甚至其他应用程序进行高级访问。例如,您的智能手机具有应用程序编程接口(API),允许访问手机的硬件,如GPS、加速度计、电池、相机等。当您编写一个“应用程序”时,可以使用API访问这些硬件设备,就像操作系统一样(尽管操作系统通常比在“用户空间”运行的程序具有更广泛的访问权限)。 这些接口被定义得非常明确,因此当您调用硬件芯片的函数时,它将返回所请求的信息。电池控制芯片只是这种通用基础架构的一个例子。 编写操作系统代码的人会获取芯片的文档,并编写与芯片通信和检索所需信息的软件。 因此,下次加载外部硬盘驱动程序、USB闪存驱动器或其他设备时,您将更加了解事情在“引擎盖下”是如何发生的。