这里讨论的是在linux的kernel中ACPI的实现机制(来源于微软的ACPICA项目),可以很明显的观察到ACPI的driver中函数实现主要依赖acpica的文件功能。而acpica的文件中,又旗帜鲜明的分为10个不同的系列。
系列名 | 文件名 | 功能 |
|---|---|---|
db系列 共同构成AML调试器 | dbcmds.c | AML调试器的核心部分,负责实现调试器可识别的各种命令 |
dbconvert.c | ACPI调试器中的数据转换于格式化输出,负责将ACPI内部的对象类型转换为人类可读的字符串形式,以便在调试时显示 | |
dbdisplay.c | 负责格式化并输出ACPI命名空间对象详细内容的模块 | |
dbexec.c | AML调试器的执行控制核心,负责将dbcmd.c接收到的执行类命令真正落实为对AML控制方法的调用和调试 | |
dbfileio.c | 负责文件输入、输出操作的模块,让调试器可以读取一个AML字节码的文件,如.aml或.dat文件 | |
dbhistry.c | 负责命令历史记录管理的模块,它维护了一个环形缓冲区,用于保存用户在调试器交互界面中输入过的命令字符串 | |
dbinput.c | 用于调试器的用户输入处理核心 | |
dbmethod.c | 调试器用于显示ACPI控制方法详细信息的模块 | |
dbnames.c | 转储命名空间对象名称和路径的模块 | |
dbobject.c | 调试器中负责显示ACPI内部对象详细内容的模块 | |
dbstats.c | 统计于显示ACPI子系统内部状态信息的模块 | |
dbtest.c | 执行预定义测试命令的模块 | |
dbutils.c | 一些调试器工具的模块,比如字符串处理、数据格式化等 | |
dbxface.c | 调试器的外部接口层,封装了调试器的核心功能,内核的其他模块可以在ACPI发生错误时,通过这个文件中的函数来触发调试器,从而绕开dbcmd.c或dbinput.c文件的功能 | |
ds系列 AML解析器与执行器 | dsargs.c | ACPI加载命名空间时,用于解析并执行静态参数初始化的文件,在ACPI表被加载到内存后,负责执行其中定义的控制方法的静态参数默认值。 |
dscontrol.c | AML控制流解析与执行模块,用于处理AML代码中的流程控制语句 | |
dsdebug.c | AML代码执行中添加断点调试的功能文件,支持单步执行、断点与异常调试 | |
dsfield.c | 在加载ACPI表时,处理操作区域中定义的各类字段,并将它们创建为命名空间中的节点 | |
dsinit.c | ACPI中负责命名空间初始化过程的整体调度与协调的文件,在ACPI表加载完成后,遍历整个命名空间树,并对每个节点执行必要的初始化操作。 | |
dsmethod.c | ACPI中专门负责准备和执行单个AML控制方法的文件 | |
dsmthdat.c | 管理控制方法内部数据对象的文件,在AML方法执行期间,维护该方法私有的局部变量和参数 | |
dsobject.c | ACPI子系统中创建并初始化命名空间对象的文件,根据AML字节码中的对象定义,创建对应的ACPI_OPERAND_OBJECT结构体并关联到namespace_node中去的模块 | |
dsopcode.c | 解析并执行AML操作码,作为操作码分派其,将dsmethod.c启动的执行流程中的每一条AML命令,路由对应的处理函数 | |
dspkginit.c | 解析并初始化package对象的文件,针对AML解释器中的package操作码,提取包中元素的数量以及每个元素的初始值定义,最终将所有解析出来的元素组装成一个完整的operand object并关联到namespace node上去 | |
dsutils.c | AML解析与执行通用工具函数的文件,提供获取、验证和转换 | |
dswexec.c | 负责执行AML操作码的辅助处理函数集文件,是dsopcode.c的一种补充,处理那些需要与命名空间、操作区域、字段单元等实体进行交互的复杂操作码 | |
dswload.c | 将AML字节码加载到命名空间的第一遍加载,在命名空间中创建所有具名对象的节点,此时只建立层次结构,不解析细节 | |
dswlaod2.c | AML的第二遍加载,解析并填充每一个对象的完整内容 | |
ev系列 事件管理、操作区域与硬件访问 | evevent.c | ACPI中负责事件检测与分发的文件,处理ACPI规范中定义的固定事件 |
evglock.c | ACPI事件全局锁文件,提供一套互斥机制,确保在访问共享硬件资源时,操作系统和固件之间不会发生冲突 | |
evgpe.c | 处理通用事件(GPE)的核心文件,包括检测GPE事件(操作GPE状态寄存器和使能寄存器)、分发GPE事件、处理GPE唤醒 | |
evgpeblk.c | 管理GPE块数据结构的文件,可以创建或销毁GPE块、管理GPE寄存器、初始化GPE列表等 | |
evgpeutil.c | 为GPE处理提供底层工具的文件,比如可以为evgpe.c、evgpeblk.c提供一组可复用的辅助功能,如GPE状态操作、GPR使能操作、GPE信息查询等 | |
evhandler.c | 管理事件处理程序、管理事件处理程序注册表,允许内核其他部分注册回调函数,以便在特定ACPI事件发生时被通知 | |
evmisc.c | misc本身就是kernel中的一种轻量级字符设备,这里具体来说就是管理一些杂项,来源自miscellaneous的缩写 | |
evregion.c | 管理操作区域(Operation Region)的文件,作为操作区域的运行时管理器,处理操作区域的初始化、访问和地址空间切换 | |
evrgnini.c | 初始化操作区域的文件,具体来说就是,该文件负责遍历命名空间中所有ACPI_TYPE_REGION节点,并为每个节点执行初始化,绑定地址空间处理程序如一个SystemMemory类型的区域会绑定到系统内存访问处理程序,而一个SystemIO类型的绑定到IO端口访问处理程序 | |
evsci.c | 处理系统控制中断(SCI)的文件,在系统启动时,向内核中断子系统注册SCI的中断处理程序,并在系统关闭时注销,处理SCI中断,当硬件产生一个SCI中断时,evsci.c文件中的处理函数将会被调用,最后这个文件还会管理SCI的状态相关的寄存器 | |
evxface.c | 为内核其他部分提供一组标准化的接口,用于注册或注销与ACPI事件相关的回调函数,提供事件注册接口、提供操作区域注册接口、隔离内部实现等方法 | |
evxfevnt.c | 提供固定事件的外部接口,是evevent文件的向外可暴露的接口,会暴露一些启用、禁用、清除固定事件的接口 | |
ex系列 AML解释器执行引擎 | exconcat.c | 负责执行字符串连接操作的文件,用于处理Concatenate操作码,当遇到dsopcode.c时会调用此函数 |
exconfig.c | 执行与配置相关的AML操作码,比如_PRS命令可以获取设备可能的资源设置、_CRS可以获取设备当前的资源设置,此外,这一exconfig文件还是dsopcode中调用即插即用功能的核心执行者,当操作系统需要配置一个设备时,会调用这里的方法,由exconfig去解析对应的AML代码 | |
exconvrt.c | 数据类型转换的文件,根据ACPI规则定义的隐式转换规则,将acpi_operand_object从一种类型转换为另外一种类型 | |
excreate.c | 创建AML解释器内部的一个对象,包括创建一个具体的缓冲区对象、一个包对象、一个操作域对象,或者是一个Mutex、Event、Semaphore相关的一种同步对象 | |
exdebug.c | 提供AML解释器的调试支持,在AML方法执行期间,将指定的对象存储到一个内部的调试缓冲区中,供调试器读取 | |
exdump.c | 格式化输出ACPI对象内容的文件,可以将debug中捕捉到的有关acpi_operand_object或者acpi_namespace_node的数据结构打印为可读文本的形式进行输出 | |
exfield.c | 执行字段对象访问操作的文件,处理针对ACPI_TYPE_FIELD_UNIT的读写操作,是dswexec.c文件的实际执行层 | |
exfldio.c | 执行字段对象的底层IO操作的文件,处理字段读写时的具体数据传输逻辑,比如最复杂的位操作和数据对齐逻辑,为exfield.c提供底层支持,确保AML代码能正确访问硬件寄存器中的任意位字段 | |
exmisc.c | 处理具体杂项事务的文件 | |
exmutex.c | 负责执行互斥锁相关操作的文件,在AML方法执行期间,管理互斥锁的获取与释放,确保对共享资源的互斥访问,mutex本身就是一种互斥锁的设备描述 | |
exnames.c | AML的文件名称路径解析的文件 | |
exoparg1.c | 处理单操作数AML操作码的文件,执行ACPI规定中定义的所有单操作数指令,比如store--将数据存储到目录对象、notify--向设备发送通知事件、sizeof--获取对象的大小 | |
exoparg2.c | 双操作数指令,比如算术运算、逻辑运算、位运算、字符串操作等 | |
exoparg3.c | 三操作数指令,如CondRefOf条件引用,检查对象是否存在,Mid,从字符串或缓冲区中提取指定位置和长度的子串 | |
exoparg6.c | 六操作数指令,比如搜索包指令、匹配操作码指令、起始索引指令 | |
exprep.c | 执行字段准备操作的文件,AML代码中的Field指令,比如计算字段偏移、锁定操作区域 | |
exregion.c | 执行操作区域访问的文件 | |
exresnte.c | 解析命名空间节点引用的文件,将指向命名空间节点的引用,比如RefOf操作码的结果,解析为实际的数据对象 | |
exresolv.c | 将resolve operands的东西解析为最终可用的数据值 | |
exresop.c | 专门解析操作码对应操作数的文件 | |
exserial.c | 执行串行化操作的文件,一些AML代码中的串行化指令,比如Acquire获取互斥锁、Release释放已获取的同步对象等,需要对operand对象进行同步,管理其状态和等待队列的操作 | |
exstore.c | 执行store操作的文件,处理AML中的store命令,将数据存储到目标对象中,是一个store命令的总接口 | |
exstoren.c | 命名空间存储执行器,专门处理将数据存储到命名空间的逻辑,与exstore不同的是,这个东东专门处理namespace_node相关的数据保存 | |
exstorob.c | 将数据存储到对象内部,处理operand_object对象的存储 | |
exsystem.c | 系统级接口文件,是访问操作系统内核服务的桥梁 | |
extrace.c | 执行trace操作码,在debug中对调试程序进行跟踪执行 | |
exutils.c | AML解释器的工具函数,包括对象引用技术、操作数栈操作、返回值处理等内容 | |
hw系列 AML解释器在硬件寄存器层级的具体操作 | hwacpi.c | ACPI硬件寄存器直接访问的文件,提供对ACPI标准硬件寄存器的底层读写操作 |
hwesleep.c | 执行系统休眠流程的文件 | |
hwgpe.c | 对于通用事件的硬件寄存器操作 | |
hwpci.c | 负责PCI配置空间访问的文件 | |
hwregs.c | 最底层的硬件寄存器物理访问层、提供了一些诸如IO空间读写、内存映射IO读写的功能 | |
hwsleep.c | 系统休眠状态切换的底层硬件操作文件 | |
hwtimer.c | 电源管理定时器操作的文件 | |
hwvalid.c | 负责IO端口访问验证的文件,包括端口范围检查、访问宽度检查等 | |
hwxface.c | 用于将这一部分hw代码封装后给外部访问的接口形式的文件 | |
hwxfsleep.c | 提供休眠功能的外部接口文件 | |
ns系列 命名空间相关的文件 | nsaccess.c | 命名空间节点访问和权限控制的文件 |
nsalloc.c | 命名空间节点内存管理的文件 | |
nsarguments.c | 处理控制方法参数的文件,比如将传入的参数包拆解为独立的参数对象 | |
nsconvert.c | 命名空间对象类型转换文件 | |
nsdump.c | 命名空间调试输出与转储的文件 | |
nsdumpdv.c | 一个已经废弃的调试模块,用于设备节点的转储 | |
nseval.c | 对象评估与控制方法执行,比如输入控制方法时,转向AML解释器执行其代码,输入对象时,返回其当前值,输入路径时,进行路径解析 | |
nsinit.c | 命名空间初始化,遍历命名空间树、初始化设备节点、初始化热插拔对象,服务于kernel启动流程 | |
nsload.c | 命名空间加载、卸载和扩展 | |
nsnames.c | 命名空间节点名称和路径操作的核心文件 | |
nsobject.c | 命名空间对象基本操作的核心文件 | |
nsparse.c | 命名空间表解析,可以处理传入的PassNumber参数,实现从AML字节码到命名空间节点的完整解析逻辑 | |
nspredef.c | 预定义ACPI方法和对象的核心文件,负责验证BIOS暴露的预定义ACPI对象和方法 | |
nsprepkg.c | 预定义包验证器,专门校验BIOS暴露的预定义方法返回的包对象是否符合规范 | |
nsrepair.c | ACPI中对象修复模块,专门负责处理BIOS返回的预定义方法对象类型不匹配的问题,会尝试将不符合规范的对象修复或转换为预期类型,而不是直接报错,从而提高系统的兼容性 | |
nsrepair2.c | 专门负责处理更复杂、需要返回特定数据包的修复场景 | |
nssearch.c | 在命名空间中定位特定名称和类型的对象 | |
nsutils.c | 提供了一系列通用的命名空间操作工具函数,是命名空间的基础工具模块 | |
nswalk.c | 遍历引擎,负责按指定规则遍历整个ACPI命名空间树 | |
nsxfeval.c | 外部评估接口模块,为内核其他部分调用ACPI对象和方法的高级入口,封装了命名空间查找、方法执行、结果校验和修复的完整流程 | |
nsxfname.c | 外部名称转换与路径解析接口模块,在内核其他部分访问ACPI命名空间时,进行名称字符串到内部对象转换的统一入口,处于nsxfeval.c评估接口的前置环节 | |
nsxfobj.c | 外部对象操作接口模块,作为内核其他部分操作ACPI的统一入口 | |
ps系列 AML命令参数解析器 | psargs.c | AML解析参数模块 |
psloop.c | 负责驱动AML解释器的主循环 | |
psobject.c | 创建、初始化和维护解析器内部使用的中间对象 | |
psopcode.c | AML 操作码信息表模块 | |
psopinfo.c | 操作码信息查询模块 | |
psparse.c | 解析器状态管理模块,是 AML 解析执行流程的总控中心。 | |
psscope.c | 解析作用域管理模块,负责维护 AML 解析过程中的作用域栈。 | |
pstree.c | 解析树构建模块,负责将解析过程中创建的对象组装成完整的解析树。 | |
psutils.c | 解析器基础工具模块,为其他解析模块提供通用辅助功能。 | |
pswalk.c | 解析树遍历模块,提供对解析树的遍历和访问能力。 | |
psxface.c | 解析器外部接口模块,是解析器与 ACPI 核心其他部分的交互入口。 | |
rs系列 Resource相关的文件 | rsaddr.c | 地址资源处理模块,专门处理ACPI地址类资源描述符 |
rscalc.c | 资源计算模块,负责计算 ACPI 资源描述符的长度和大小 | |
rscreate.c | 资源创建模块,负责创建 ACPI 资源描述符。 | |
rsdump.c | 资源调试输出模块,负责将资源描述符格式化为可读字符串。 | |
rsdumpinfo.c | 资源调试信息表模块,提供资源类型的元数据信息。 | |
rsinfo.c | 资源信息查询模块,提供资源描述符的元数据查询接口。 | |
rsio.c | IO 资源处理模块,专门处理 IO 端口资源描述符。 | |
rsirq.c | 中断资源处理模块,专门处理中断资源描述符。 | |
rslist.c | 资源列表管理模块,负责资源描述符列表的遍历和操作。 | |
rsmemory.c | 内存资源处理模块,专门处理内存资源描述符。 | |
rsmisc.c | 杂项资源处理模块,处理非标准或辅助类型的资源描述符。 | |
rsserial.c | 串行总线资源处理模块,处理 I2C、SPI、UART 等串行总线资源描述符 | |
rsutils.c | 资源工具模块,为其他资源模块提供通用辅助功能。 | |
rsxface.c | 资源外部接口模块,是资源管理模块与 ACPI 核心其他部分的交互入口。 | |
tb系列 专门处理表的文件 | tbdata.c | 表数据管理模块,负责 ACPI 表的全局数据结构和状态管理 |
tbfadt.c | FADT 表解析模块,专门处理固定 ACPI 描述表(FADT) | |
tbfind.c | 表查找模块,负责在已加载的表中按签名查找特定表 | |
tbinstal.c | 表安装模块,负责将新表加载到 ACPI 子系统中 | |
tbprint.c | 表调试输出模块,负责将 ACPI 表内容格式化为可读字符串 | |
tbxface.c | 表管理外部接口模块,是表管理模块与 ACPI 核心其他部分的交互入口 | |
tbxfload.c | 表加载外部接口模块,负责从固件或内存中加载 ACPI 表 | |
tbutils.c | 表管理工具模块,为其他表管理模块提供通用辅助功能 | |
tbxfroot.c | 根表查找模块,负责定位 RSDP 并初始化根表指针。 | |
ut系列 实用工具Utilities模块文件 | utaddress.c | 地址验证工具模块,负责验证物理地址的有效性和可访问性。 |
utalloc.c | 内存分配工具模块,提供 ACPI 子系统专用的内存管理功能。 | |
utascii.c | ASCII 转换工具模块,负责 ASCII 字符的转换和判断。 | |
utbuffer.c | 缓冲区操作工具模块,提供通用的缓冲区处理功能。 | |
utcopy.c | 数据复制工具模块,负责内部对象与外部缓冲区之间的数据转换。 | |
utdebug.c | 调试输出工具模块,提供 ACPI 子系统的调试日志功能。 | |
utcache.c | 缓存管理工具模块,负责 ACPI 内部对象的内存缓存管理。 | |
utdecode.c | 解码工具模块,负责将 ACPI 内部编码值转换为可读字符串。 | |
utdelete.c | 对象删除工具模块,负责安全地删除和释放 ACPI 内部对象。 | |
uterror.c | 错误处理工具模块,提供统一的错误信息输出和异常处理。 | |
uteval.c | 评估工具模块,提供对象评估的辅助功能。 | |
utexcep.c | 异常处理工具模块,负责 ACPI 异常码的转换和处理。 | |
utglobal.c | 全局变量管理模块,定义和管理 ACPI 子系统的全局变量。 | |
uthex.c | 十六进制转换模块,负责十六进制字符串与数值之间的转换。 | |
utids.c | 硬件 ID 处理模块,负责解析和匹配硬件 ID(_HID、_CID)。 | |
utinit.c | 初始化工具模块,负责 ACPI 子系统的初始化流程。 | |
utlock.c | 自旋锁工具模块,提供 ACPI 专用的自旋锁实现。 | |
utmath.c | 数学运算模块,提供 ACPI 所需的数学运算功能。 | |
utmisc.c | 杂项工具模块,提供各种通用辅助功能。 | |
utmutex.c | 互斥锁工具模块,提供 ACPI 专用的互斥锁实现。 | |
utnonansi.c | 非 ANSI 函数模块,提供非标准 C 库函数的实现。 | |
utobject.c | 对象操作工具模块,提供内部对象的创建和操作功能。 | |
utosi.c | OSI 接口模块,处理操作系统接口(_OSI)的评估。 | |
utownerid.c | 所有者 ID 管理模块,负责分配和管理所有者 ID。 | |
utpredef.c | 预定义对象验证工具模块,负责校验预定义对象的返回值类型。 | |
utprint.c | 格式化输出模块,提供 ACPI 专用的字符串格式化功能。 | |
utresdecode.c | 资源解码模块,负责将 ACPI 资源描述符解码为可读字符串。 | |
utstate.c | 状态管理模块,负责管理 ACPI 子系统的全局状态。 | |
utstring.c | 字符串操作模块,提供 ACPI 专用的字符串处理功能。 | |
utstrsuppt.c | 字符串支持模块,提供字符串操作的辅助功能。 | |
utstrtoul64.c | 字符串转整数模块,负责将字符串转换为 64 位整数。 | |
uttrack.c | 内存跟踪模块,提供内存分配的调试和跟踪功能。 | |
utuuid.c | UUID 处理模块,负责 UUID 的解析和比较。 | |
utxface.c | 外部接口模块,是 Utilities 模块与 ACPI 核心其他部分的交互入口。 | |
utxferror.c | 错误处理外部接口模块,提供错误处理的统一入口。 | |
utxfinit.c | 初始化外部接口模块,负责 ACPI 子系统的全局初始化。 | |
utxfmutex.c | 互斥锁外部接口模块,提供互斥锁的外部调用接口。 |
到这里可以说ACPICA项目的文件过完了一遍含义