2025年2月更新,Step to UEFI 文章索引:
ACPI:Object is created temporarily in another method and cannot be accessed
天杀最近在玩一台X86主机,他发现Dump出来的 DSDT Table 重新编译的时候会碰到标题的错误,更详细的错误信息如下:
SDT.dsl 2644: PARM |= (DerefOf (CDCT [^^MCHK.DCFE]) << 0x15) /* _SB_.PCI0.GFX0.PARM */
Error 6163 - ^ Object is created temporarily in another method and cannot be accessed (^^MCHK.DCFE)
分析代码可以看到
- 出现问题的代码是尝试访问MCHK.DCFE
If ((GESF == 0x07))
{
PARM = GIVD /* \_SB_.PCI0.GFX0.GIVD */
PARM ^= One
PARM |= (GMFN << One)
PARM |= 0x1800
PARM |= (IDMS << 0x11)
PARM |= (DerefOf (CDCT [^^MCHK.DCFE]) << 0x15) /* \_SB_.PCI0.GFX0.PARM */
GESF = One
Return (SUCC) /* \_SB_.PCI0.GFX0.SUCC */
}
2.DCFE定义在MCHK 中
Method (MCHK, 0, Serialized)
{
If ((MADR != 0xFFFFFFFF))
{
OperationRegion (IGMM, SystemMemory, MADR, 0x3000)
Field (IGMM, AnyAcc, NoLock, Preserve)
{
Offset (0x20C8),
, 4,
DCFE, 4
}
}
}
看起来错误的原因是:如果MADR为0xFFFFFFFF,那么DCFE 就不存在,访问不到。
解决方法,修改代码如下:
PARM |= 0x1800
PARM |= (IDMS << 0x11)
//LABZDebug_Start
If ((MADR != 0xFFFFFFFF))
{
OperationRegion (IGMM, SystemMemory, MADR, 0x3000)
Field (IGMM, AnyAcc, NoLock, Preserve)
{
Offset (0x20C8),
, 4,
DCFE, 4
}
PARM |= (DerefOf (CDCT [DCFE]) << 0x15) /* \_SB_.PCI0.GFX0.PARM */
}
//LABZDebug_End
GESF = One
Return (SUCC) /* \_SB_.PCI0.GFX0.SUCC */
再次编译就通过了。
此外,还有一种更简单的方法:使用编译 AML 相同的版本重新编译,这个很容易理解:能够编译生成 AML 就说明至少有一个版本的编译器认可这种编译方法,找到这个版本即可重新编译。
具体的信息可以在 dsdt 的头部看到,比如,另外一个项目上如下位置可以看到编译器版本:

找到这个版本重新编译一个Error甚至Warning 都没有。
当然,这个问题还是给了我们一个提醒:ASL 编译器不同版本之间存在差异。
Step to memory 009 异步时钟和同步时钟的革命性变化
PC 内存的秘密:第 3 部分
https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_3/1/
早期的内存技术基于异步时钟架构。异步内存包括快速页面模式 (Fast Page Mode ,FPM)内存、扩展数据输出 (Extended-Data-Out ,EDO) RAM 以及其他变体。顾名思义,这种内存不与系统总线时钟绑定或同步,因此这种设计存在根本性的局限性,导致总线运行速度无法超过 66MHz。美光科技计算部门高级市场经理 Brett Williams 表示,从异步时钟依赖内存到同步时钟依赖内存的转变是“一场革命性的变革,信号传输方式彻底改变…… ”。

LAB-Z注释:这里多提一下
内存同步
所谓内存同步,就是内存频率与CPU外频运行在同一频率。也就是说,在内存同步的情况下,内存频率=CPU外频。比如当200MHz外频的 P4 520与内存同步时,内存也运行在200MHz外频上。由于使用的是DDR内存,所以内存的频率=200MHz×2=400MHz(DDR400)。
内存异步
内存异步技术则是让内存频率与CPU外频不同,内存频率=CPU外频×N/M(特定的一个比值)。200MHz外频的P4 520在内存异步时,内存可以运行在166MHz,使用DDR333内存就可以了。当然,内存也可以运行在266MHz,此时系统只需要使用DDR533 内存即可。也就是说,N/M的比值可以大于1也可以小于1,即内存异步时,内存的频率可以高于或低于CPU外频。
存在原因
在早先的计算机系统中,内存和CPU之间的搭配,CPU处于主导的地位,也就是说当CPU的主频为100MHz,那么内存的频率就只能是 100MHz,内存的使用完全依赖于CPU。随着CPU技术的迅速发展,CPU的频率不断提高,这样就造成了用户升级CPU时就必须也对内存进行升级,无疑增加了升级的成本,这种情况直到VIA的694X芯片组发布之后才有所改变,内存与CPU外频终于可以实现异步运行了。
当然这样的异步运行技术并没有完全脱离CPU外频的束缚,而是采用了“±33MHz”的解决方案。也就是说,当P3处理器运行在100MHz 外频下,内存可以异步运行在133MHz或66MHz两种频率下。内存运行在133MHz频率的时候,系统就可以获得更大的性能提升,在当时绝对算得上领先的内存技术。至于现今的内存异步技术,已经发展到了更为先进的阶段。内存与CPU外频的异步运行甚至可以设定在4:3或5:4的比例状态下。
理论上来讲,搭配更高频率的内存就可以获得更大的数据带宽,对于系统性能的提升也会有很大帮助。并且内存异步技术还可以更为灵活的搭配内存,在CPU外频不断提高的现今,内存异步技术更可以帮助升级用户节省下更换内存的资金。
理论上来讲,内存异步技术提升内存的频率后,相应的数据带宽也会明显提高,性能应该有所增强。但就异步技术开始出现时的测试成绩来看,内存异步技术的性能提升并不是特别明显,这是为什么呢?其实这是由于采用了异步运行方式后,虽然增加了内存的带宽,但同时也增加了内存的延迟。
比如,某处理器运行在100MHz外频下,其时钟周期为10ns。运用内存异步技术之后,内存可以运行在133MHz频率下,时钟周期为 7.5ns。当周期为7.5 ns的时钟周期结束时,周期为10ns的时钟周期还没有结束,那么前者就需要等待后者完成一个周期后才能开始下一个周期,这样就造成了内存的延迟,而延迟所带来的性能损失也直接导致了测试成绩的下降。这种情况发展到NF2芯片组尤为严重,NF2主板甚至只有内存同步时才能获得最优性能,内存异步技术在当时的AMD平台甚至成为了“鸡肋”。
不过事情总是有转机的,处理器的外频不断提高时,内存技术也跟着飞速发展。高频内存与CPU外频之间,使用异步后的延时越来越小,系统性能的提升也就越来越明显,这样使得内存在一定程度上摆脱了CPU外频对其频率的束缚。内存和CPU之间可以更加灵活自由地进行搭配,这样给用户留下很大可控制的空间,在很大程度上促进了超频技术的发展。当然了,对于那些升级CPU的用户而言,也可以留下以前的内存,只要开启主板的内存异步功能就可以实现平稳的过渡升级。
现代计算机内存仍然依赖于同步时钟设计,这种设计在同步动态随机存取存储器 (SD-RAM) 大规模市场采用后变得尤为突出。SD-RAM 起始频率为 66MHz,每个时钟周期限制为一个信号。后来,这种设计演变成了 DDR 内存,即双倍数据速率同步动态随机存取存储器 (DDR)。DDR 内存是一种 SD-RAM,能够在一个时钟周期搬运两次数据。

此时,重要的是要认识到,我们所说的“计算机内存”实际上是一组不可分割的子系统,包括 RAM 模块、主板、MCH(内存控制器中枢)以及 CPU。我们知道,有时 CPU 会将 MCH 集成到其设计中,例如 AMD 的 Athlon 64 和 Phenom 处理器。
第一代:DDR1
第一代台式机双倍数据速率内存模块 (DDR1)采用 184 针接口设计,高于 SD-RAM 使用的 164 针接口。DDR1 通常基于薄小外形封装 (TSOP) 芯片,虽然也使用过一些基于球栅阵列 (BGA) 的 DRAM,但非常罕见。本系列第二部分中介绍过关于内存的封装。

TSOP 芯片的缺点是,由于两侧引脚向外延伸的特性,芯片会占用更大的 PCB 空间——这意味着密度较低。并且和 BGA封装相比,TSOP 在高速传输时也存在一些信号质量的问题。

图片的意思是 SDR 会在时钟上升沿传输一次数据,总线频率 100Mhz, 数据频率也是100Mhz;在 DDR 上,会在时钟的上升沿和下降沿分别传输一次数据,因此总线频率是100Mhz时,数据频率是200Mhz.
DDR1 DRAM 的最高工作温度通常在 85˚C/185˚F 左右,但有时也可能更低,具体取决于具体部件和制造商。理论上,与 DDR2 和 DDR3 中基于 BGA 的 DRAM 相比,采用 TSOP 芯片的 DDR1 模块可以承受更大程度的焊接温度而不会损坏连接引脚,因为焊点更大且更易于焊接。
一个内存模块的最高工作温度始终远低于 DRAM规格中所描述的数值,但这个因素会因内存芯片和印刷电路板 (PCB) 制造商以及所采用的热管理解决方案而异。
官方 DDR1 总线频率通常为 100MHz、133MHz、166MHz 和 200MHz,但偶尔也会有 150MHz、183MHz 甚至超过 200MHz 的频率出售给最终用户。由于DDR每个时钟周期可以附加两个信号,因此标准理论数据频率分别为200MHz,266MHz,333MHz和400MHz。

JEDEC 定义的 DDR1 电源为 2.5V,但一些制造商已认证其模块可在高达 2.8V 以上的电压下运行,且仍在保修范围内。这种额外的成本和购买保障对于系统超频爱好者来说非常实用。
源同步架构
DDR1 中最重要的变化之一是不再依赖 SDR 中使用的中央时钟方案,而是引入了源同步或选通设计。
这样做的好处是可以提高性能。single-ended Data Strobe(DQS) 架构的引入在数据和中央系统时钟 (CLK) 之间创建了一个额外的跟踪层。
DDR1的“单端”(Single-ended)数据选通是指只有一个上升和下降信号波的特性(DDR2开始改成了差分信号)。该单端数据选通由数据 (DQ) 跟踪,以实现更有效的信号传输——它在容忍工艺-电压-温度 (PVT) 变化以及串扰、回声和信号反射引起的问题方面具有更大的基本强度,这些问题往往会扭曲波形或导致时序不准确。

DDR2及之后的版本中,为了增强信号的抗干扰能力,尤其是对抗时钟信号的干扰,时钟信号如DQS和CLK等都被改为了差分信号。
引入一个称为数据选通的附加定时层的目的是帮助数据在更高速度等级下更有效地跟踪时钟;然而,这也带来了额外的复杂性。
前面提到的时钟信号改为差分信号,即出现了 CK和CK# 。引入的而原因是为了起到触发时钟校准的作用
由于数据是在CK的上下沿触发,造成传输周期缩短了一半,因此必须要保证传输周期的稳定以确保数据的正确传输,这就要求CK的上下沿间距要有精确的控制。但因为温度、电阻性能的改变等原因,CK上下沿间距可能发生变化,此时与其反相的CK#就起到纠正的作用(CK上升快下降慢,CK#则是上升慢下降快)。

而由于上下沿触发的原因,也使CL=1.5和2.5成为可能,并容易实现。【参考1】https://www.cnblogs.com/leaven/archive/2010/07/21/1782341.html
尽管数据选通可以缓解更高频率下数据与系统时钟之间的定时误差,但数据选通本身可能会与系统时钟不对齐或出现偏差。因此,必须在两者之间构建额外的“去偏差”或同步逻辑,以确保正常运行。
这个叫做数据选通或 DQS 的东西是什么?
数据选通信号 (SD RAM) 是数据相对于系统时钟的跟踪信号。它是一种振荡电信号,用于定义数据必须位于何处以及数据应在何处停留多长时间。
正如“同步”动态 (SD) RAM 的名称所暗示的那样,现代计算机内存依赖于所有部件按照集中时钟进行排列,以实现可靠的信号传输。它最初在 DDR1 中采用单端设计。在更高的 DDR2 速度下,需要采用差分选通设计。

美光科技应用工程师 Aaron Boehm 解释说,问题在于“时钟可能会有很大差异,因此 DQS 用于将所有数据与时钟对齐。在 DRAM 内部,选通脉冲跟踪时钟。因此,当 DRAM 输出数据时,数据会与选通脉冲对齐,而选通脉冲又跟踪时钟。当内存控制器写入 DRAM 时,数据集中到选通脉冲。数据选通脉冲 (DQS) 允许控制器和 DRAM 查看并锁定数据。 ”
关于为什么需要多增加一个 DQS 信号,有如下解释【参考2】
a、进行DDR拓扑,多个DDR芯片共同使用一个CK时钟,DDR控制器的数据总线可以以最短距离连接到DDR上去,但CK时钟需要进行分叉连接到DDR上去,导致CK走线比数据总线要长,若要想走线等长,那么需要数据总线做等长走线,数据总线的数量远比CK多,不利于PCB等长走线,所以不使用CK为基准。
b、当DDR向DDR控制器发送数据时,由于PCB走线和DDR发送电路的延迟对于DDR芯片而言不知道有多长,所以DDR控制器无法准确的通过CK对数据总线上的数据进行采样。所以不使用CK为基准

针对于以上两个问题,数据总线中引入了DQS这一信号,使用DQS做数据总线采样的参考时钟,因此DQS必须与DQ等长,DQS频率与CK一致,允许相位差,这个相位差(可提前可滞后)可以通过DLL调节,写数据时二者上升沿对齐误差允许0.75~1.25个时钟周期,读数据时的对齐误差以芯片的规格书为准。
【参考】
2.https://zhuanlan.zhihu.com/p/1896493235079193557
回忆:成人礼
大约是97年,“成人礼”这种仪式忽然流行起来。印象中那一段时间在电视和报纸上看到过很多次相关报道,几乎所有的学校都会把学生拉出去搞这个仪式。我所在的大庆中学同样追随潮流,将实际上尚未成年的我们拉出去走参加一圈仪式,仿佛尚未成年的猪仔盖上“检疫合格”章一般。
时隔快30年,我依然记忆深刻原因是偶然学到的一个歇后语:马槽改棺材—-成(盛)人了,以至于现在我听到“成人礼”三个字还会想起来这个歇后语。
成人礼那天,大巴车把我们拉到广场上列队。还特地让每个人穿上校服,这样看起来更加整齐划一。当年的校服是类似化肥袋子一样的材质,具有颜色鲜艳耐磨方便洗涤等优点,唯一的缺点是不透气。

许多学校的学生列队站在一起,之后是冗长的各路领导下凡讲话。具体的内容早已忘记,印象最深刻的倒是领导讲话过程中不断有学生倒下。原因很多,比如,早晨没吃饭的低血糖,校服太闷散热不良,或者是鞋子不适合长期站立影响头部供血等等。几年前《中国青年报》上的曾经有一篇《夏令营中的较量》,让全国上下都在焦虑未来的青少年如何超越那些负重20公斤步行50公里的“平成小超人”。当然,亲眼见到身边人倒下,我也认真思考“这 TMD 体质,要是真的遇到外敌入侵怎么办”。
这个成人礼只有半天,中午没管饭,大巴车直接把我们拉回去了。当然,只要不上课,我们的心情都是无比舒畅的。
仪式结束之后,我们都收到了“成人卡”,上面有着时任市长钱棣华的签名(印刷的)。这个名字印象深刻的原因有两个:一个是这个名称让人产生和某个男性器官产生联想;另外一个原因是这个大爷后来进去了。
这张签名卡一直在我家的立柜中间矗立了很久。若干年后,大学寒假回家时还看到过。记得我父亲对于这个老头落马颇感惋惜,每每提及都是感叹“这么多年的老会战怎么就出这个事儿”,“他女儿找人办事还被直接卷了面子”等等言语。
好奇心驱使下,搜索了一下,在【参考1】有了一些收获(这个大爷的事情被写入论文了,收录到“知网”中了,文章题目还颇有自媒体风范《”糖弹”轰倒”红旗手”——大庆市原人大主任钱棣华受贿案实录》。相当于写入史书了,未来会被人无数次提起)。除了普通的受贿,这个大爷还在审查起诉阶段试图翻供,更是为了坊间传闻提供了无数的素材。当然,翻供未遂,经过黑龙江省检察院的调查,发现是他女儿和亲属贿赂办案人员和看守所管教编造伪证,试图翻案。最终认定“受贿22.5万,有期徒刑10年”。相关人员也都跟着判刑开除公职。
参考:
1. https://www.chinanews.com/2000-07-31/26/39783.html
UEFITIPS:BASE_LIST 用法
最近又在开关于Debug Message的内容,因此研究了一下BASE_LIST。简单的说,有时候你要传递一些长度不定的数据就可以使用这个定义。比如,一个数据块,有时候其中有10个UINTN,有时候其中有2个UINTN (特别注意的是每个单元的大小必须相同)。
具体结构体定义在 Edk2\MdePkg\Include\Base.h,可以看到BASE_LIST 实际上是一个指向 UINTN 的指针。
///
/// Pointer to the start of a variable argument list stored in a memory buffer. Same as UINT8 *.
///
typedef UINTN *BASE_LIST;
此外,经常和 BASE_ARG 结合起来使用,这个宏会返回指针指向的下一个值:
/**
Returns an argument of a specified type from a variable argument list and updates
the pointer to the variable argument list to point to the next argument.
This function returns an argument of the type specified by TYPE from the beginning
of the variable argument list specified by Marker. Marker is then updated to point
to the next argument in the variable argument list. The method for computing the
pointer to the next argument in the argument list is CPU specific following the EFIAPI ABI.
@param Marker The pointer to the beginning of a variable argument list.
@param TYPE The type of argument to retrieve from the beginning
of the variable argument list.
@return An argument of the type specified by TYPE.
**/
#define BASE_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _BASE_INT_SIZE_OF (TYPE)) - _BASE_INT_SIZE_OF (TYPE)))
编写代码验证:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
INTN
EFIAPI
ShellAppMain (
IN UINTN Argc,
IN CHAR16 **Argv
)
{
UINTN A[4]={1,2,3,4};
BASE_LIST TestList;
TestList=(BASE_LIST) &A;
for (int i=0;i<4;i++) {
Print(L"%d ",BASE_ARG(TestList,UINTN));
}
Print(L"\n");
return(0);
}
运行结果:

开源硬盘SMART检测工具
在 https://github.com/smartmontools/smartmontools 可以看到一个硬盘检测工具。
项目的介绍是:
About Smartmontools
The smartmontools package contains two utility programs (smartctl and smartd) to control and monitor storage systems using the Self-Monitoring, Analysis and Reporting Technology System (SMART) built into most modern ATA/SATA, SCSI/SAS and NVMe disks. In many cases, these utilities will provide advanced warning of disk degradation and failure.
Smartmontools was originally derived from the Linux smartsuite package and supports ATA/SATA, SCSI/SAS, and NVMe disks and also SCSI/SAS tape devices. It should run on any modern Linux, FreeBSD, NetBSD, OpenBSD, Darwin (macOS), Solaris, Windows, Cygwin, OS/2, eComStation, or QNX system. Smartmontools can also be run from one of many different Live CDs/DVDs.
有支持 Windows 的版本,安装后进入安装的目录,使用如下命令即可检测输出当前硬盘的信息:
smartctl,exe -x /dev/sda
例如,在一台测试机上结果如下:
smartctl 7.5 2025-04-30 r5714 [x86_64-w64-mingw32-w11-24H2] (AppVeyor)
Copyright (C) 2002-25, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: SKHynix_HFS256GEJ4X112N
Serial Number: 4DBCQ48581010CG2R
Firmware Version: 51030C31
PCI Vendor/Subsystem ID: 0x1c5c
IEEE OUI Identifier: 0xace42e
Controller ID: 1
NVMe Version: 1.4
Number of Namespaces: 1
Namespace 1 Size/Capacity: 256,060,514,304 [256 GB]
Namespace 1 Formatted LBA Size: 512
Namespace 1 IEEE EUI-64: ace42e 0026df381b
Local Time is: Sun Jul 20 22:46:46 2025 PDT
Firmware Updates (0x16): 3 Slots, no Reset required
Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test
Optional NVM Commands (0x005f): Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat Timestmp
Log Page Attributes (0x1e): Cmd_Eff_Lg Ext_Get_Lg Telmtry_Lg Pers_Ev_Lg
Maximum Data Transfer Size: 64 Pages
Warning Comp. Temp. Threshold: 86 Celsius
Critical Comp. Temp. Threshold: 87 Celsius
Supported Power States
St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat
0 + 4.5000W - - 0 0 0 0 100 100
1 + 3.0000W - - 1 1 1 1 200 200
2 + 0.6000W - - 2 2 2 2 400 400
3 - 0.0150W - - 3 3 3 3 2000 2000
4 - 0.0030W - - 4 4 4 4 5000 10000
Supported LBA Sizes (NSID 0x1)
Id Fmt Data Metadt Rel_Perf
0 + 512 0 0
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02, NSID 0xffffffff)
Critical Warning: 0x00
Temperature: 30 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 15%
Data Units Read: 117,427,832 [60.1 TB]
Data Units Written: 118,434,215 [60.6 TB]
Host Read Commands: 565,071,947
Host Write Commands: 434,694,135
Controller Busy Time: 8,007
Power Cycles: 5,554
Power On Hours: 1,648
Unsafe Shutdowns: 1,034
Media and Data Integrity Errors: 0
Error Information Log Entries: 21
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Temperature Sensor 1: 35 Celsius
Temperature Sensor 2: 30 Celsius
Thermal Temp. 1 Transition Count: 249
Error Information (NVMe Log 0x01, 16 of 256 entries)
No Errors Logged
Self-test Log (NVMe Log 0x06, NSID 0xffffffff)
Self-test status: No self-test in progress
No Self-tests Logged
ACPI 官方工具
ACPICA 官方提供了一些工具可供直接使用,具体列表如下:
acpibin.exe | A binary AML file tool 提供了 AML 文件比较功能,AML文件转 TEXT, TEXT转 AML ,显示AML文件头,重新计算填充 AML Checksum的功能,删除注释提供简洁代码(Terse mode),显示编译时间日期 |
Usage: acpibin [options] Options: -a <File1> <File2> Compare two binary AML files, dump all mismatches -c <File1> <File2> Compare two binary AML files, dump first 100 mismatches -d <In> <Out> Dump AML binary to text file -o <Value> Start comparison at this offset into second file -h <File> Display table header for binary AML file -s <File> Update checksum for binary AML file -t Terse mode -v Display version information -vd Display build date and time | |
acpidump.exe | Dump System ACPI Tables 读取当前系统中 ACPI Table 的工具。以文本方式输出。配合AcpiXtract 可以实现DSDR和SSDT的合并。 |
Usage: acpidump [options] Options: -b Dump tables to binary files -h -? This help message -o <File> Redirect output to file -r <Address> Dump tables from specified RSDP -s Print table summaries only -v Display version information -vd Display build date and time -z Verbose mode Table Options: -a <Address> Get table via a physical address -c <on|off> Turning on/off customized table dumping -f <BinaryFile> Get table via a binary file -n <Signature> Get table via a name/signature -x Use RSDT instead of XSDT | |
acpiexec.exe | User Mode ACPI Execution/Simulation 在用户模式下运行一些 ACPI 命令/模拟,需要注意的是这些操作都是和硬件无关的。 |
Usage: acpiexec [options] AMLfile1 AMLfile2 … Options: -b “CommandLine” Batch mode command line execution (cmd1;cmd2;…) -h -? Display this help message -m [Method] Batch mode method execution. Default=MAIN -da Disable method abort on error -df Disable Local fault handler -di Disable execution of STA/INI methods during init -do Disable Operation Region address simulation -dr Disable repair of method return values -ds Disable method auto-serialization -dt Disable allocation tracking (performance) -ed Enable timer output for Debug Object -ef Enable display of final memory statistics -ei Enable additional tests for ACPICA interfaces -el Enable loading of additional test tables -eo Enable object evaluation log -es Enable Interpreter Slack Mode -et Enable debug semaphore timeout -fi <File> Specify namespace initialization file -fv <Value> Operation Region initialization fill value -l Load tables and namespace only -r Use hardware-reduced FADT V5 -te Exit loop on timeout instead of aborting method -to <Seconds> Set timeout period for AML while loops -v Display version information -va Display verbose dump of any memory leaks -vd Display build date and time -vh Verbose exception handler output -vi Verbose initialization output -vr Verbose region handler output -x <DebugLevel> Debug output level | |
acpihelp.exe | Display ACPI Help Information |
显示当前工具支持的 ASL 操作和关键字,预定义信息等等。我个人的理解是:这一套工具可以自行扩展,或者说新版本可能会增加新定义的操作等等,这个工具能够输出当前支持的操作和关键字这种信息。 | |
Usage: acpihelp <options> [Name/Prefix | HexValue] Options: -h Display help -v Display version information -vd Display build date and time AML Names and Encodings (ACPI Machine Language): -a [Name/Prefix | *] Display both ASL operator and AML opcode name(s) -g [Name/Prefix | *] Display AML grammar elements(s) -m [Name/Prefix | *] Display AML opcode name(s) ACPI Values: -e [HexValue] Decode ACPICA exception code -o [HexValue] Decode hex AML opcode -x [HexValue] Decode iASL exception code ASL Names and Symbols (ACPI Source Language): -k [Name/Prefix | *] Display ASL non-operator keyword(s) -p [Name/Prefix | *] Display ASL predefined method name(s) -s [Name/Prefix | *] Display ASL operator name(s) Other miscellaneous ACPI Names: -i [Name/Prefix | *] Display ACPI/PNP Hardware ID(s) -d Display iASL Preprocessor directives -t Display supported ACPI tables -u Display ACPI-related UUIDs Name/Prefix or HexValue not specified means “Display All” Default search with valid Name/Prefix and no options: Find ASL/AML operator names – if NamePrefix does not start with underscore Find ASL predefined method names – if NamePrefix starts with underscore | |
acpisrc.exe | Convert ACPICA Source Code 将 ASL code 转为为 Linux 代码格式 |
Usage: acpisrc [-c|l|u] [-dsvy] <SourceDir> <DestinationDir> Options: -a <file> Check entire file for non-printable characters -c Generate cleaned version of the source -h Insert dual-license header into all modules -i Cleanup macro indentation -l Generate Linux version of the source -u Generate Custom source translation -d Leave debug statements in code -s Generate source statistics only -v Display version information -vb Verbose mode -vd Display build date and time -y Suppress file overwrite prompts | |
acpixtract.exe | Extract ACPI Tables 分析前面AcpiDump输出的结果,可以实现 DSDT和SSDT 的合并 |
Usage: acpixtract [option] <InputFile> Options: -a Extract all tables, not just DSDT/SSDT -f Force extraction, even if there are errors -l List table summaries, do not extract -m Extract multiple DSDT/SSDTs to a single file -s <signature> Extract all tables with <signature> -v Display version information -vd Display build date and time Extract binary ACPI tables from text acpidump output Default invocation extracts the DSDT and all SSDTs | |
iasl | Compiler 完整的 ASL/AML 编译/反编译工具 |
Usage: iasl [Options] [Files] General: -@ <file> Specify command file -I <dir> Specify additional include directory -p <prefix> Specify path/filename prefix for all output files -v Display compiler version -vd Display compiler build date and time -vo Enable optimization comments -vs Disable signon -ld Disable deterministic output Help: -h This message -hc Display operators allowed in constant expressions -hd Info for obtaining and disassembling binary ACPI tables -hf Display help for output filename generation -hr Display ACPI reserved method names -ht Display currently supported ACPI table names Preprocessor: -D <symbol> Define symbol for preprocessor use -li Create preprocessed output file (*.i) -P Preprocess only and create preprocessor output file (*.i) -Pn Disable preprocessor Errors, Warnings, and Remarks: -va Disable all errors/warnings/remarks -ve Report only errors (ignore warnings and remarks) -vi Less verbose errors and warnings for use with IDEs -vr Disable remarks -vw <messageid> Ignore specific error, warning or remark -vx <messageid> Expect a specific warning, remark, or error -w <1|2|3> Set warning reporting level -we Report warnings as errors -ww <messageid> Report specific warning or remark as error AML Bytecode Generation (*.aml): -oa Disable all optimizations (compatibility mode) -of Disable constant folding -oi Disable integer optimization to Zero/One/Ones -on Disable named reference string optimization -ot Disable typechecking -cr Disable Resource Descriptor error checking -in Ignore NoOp operators -r <revision> Override table header Revision (1-255) Listings: -l Create mixed listing file (ASL source and AML) (*.lst) -lm Create hardware summary map file (*.map) -ln Create namespace file (*.nsp) -ls Create combined source file (expanded includes) (*.src) -lx Create cross-reference file (*.xrf) Firmware Support – C Text Output: -tc Create hex AML table in C (*.hex) -sc Create named hex AML arrays in C (*.c) -ic Create include file in C for -sc symbols (*.h) -so Create namespace AML offset table in C (*.offset.h) Firmware Support – Assembler Text Output: -ta Create hex AML table in assembler (*.hex) -sa Create named hex AML arrays in assembler (*.asm) -ia Create include file in assembler for -sa symbols (*.inc) Firmware Support – ASL Text Output: -ts Create hex AML table in ASL (Buffer object) (*.hex) Legacy-ASL to ASL+ Converter: -ca <file> Convert legacy-ASL source file to new ASL+ file (Original comments are passed through to ASL+ file) Data Table Compiler: -tp Compile tables with flex/bison prototype -G Compile custom table that contains generic operators -T <sig list>|ALL Create ACPI table template/example files -T <count> Emit DSDT and <count> SSDTs to same file -vt Create verbose template files (full disassembly) AML Disassembler: -d <f1 f2 …> Disassemble or decode binary ACPI tables to file (*.dsl) (Optional, file type is automatically detected) -da <f1 f2 …> Disassemble multiple tables from single namespace -db Do not translate Buffers to Resource Templates -dc <f1 f2 …> Disassemble AML and immediately compile it (Obtain DSDT from current system if no input file) -df Force disassembler to assume table contains valid AML -dl Emit legacy ASL code only (no C-style operators) -ds <signature(4)> Specify a table signature(4) (CDAT table only) -e <f1 f2 …> Include ACPI table(s) for external symbol resolution -fe <file> Specify external symbol declaration file -in Ignore NoOp opcodes -l Disassemble to mixed ASL and AML code -vt Dump binary table data in hex format within output file Debug Options: -bc Create converter debug file (*.cdb) -bf Create debug file (full output) (*.txt) -bs Create debug file (parse tree only) (*.txt) -bp <depth> Prune ASL parse tree -bt <type> Object type to be pruned from the parse tree -f Ignore errors, force creation of AML output file(s) -m <size> Set internal line buffer size (in Kbytes) -n Parse only, no output generation -oc Display compile times and statistics -x <level> Set debug level for trace output -z Do not insert new compiler ID for DataTables |
以文件名创建目录然后移动的批处理
枚举当前目录下的所有mp4,然后创建同名的目录并将对应文件移动进去。
@echo off
for %%i in (*.mp4) do (
mkdir "%%~ni" 2>nul
move /y "%%i" "%%~ni\"
)
RDA5807FP收音机
要点:
1.淘宝购买的RDA5807FP芯片有可能是假的/有问题的。具体现象是:只能听到沙沙声,无法收到电台。搜索到有人遇到同样的问题,请教B站大佬“我是电视电视迷”,他推荐淘宝“深圳市义胜电子网店”,我重新购买的芯片,换上去就OK了;
2.这个芯片有两种模式:全自动和单片机模式,上电之前要跳线选择一下:

3.使用一个引线作为天线,理论上这个电线越长效果越好,我用了20cm就可以收到台了;他人的设计有直接使用耳机的地,就是耳机左声道右声道,然后再用地做天线;
4.打板2次,第一次设计用了 0603 电容电阻,后来发现这个封装 22pf以上比较少见,就修改为 1206电容电阻了,这样也方便焊接。
工作的视频在
项目主页在:
https://oshwhub.com/zoologist/rda5807fp-shou-yin-ji
电路图和PCB 还可以在这里直接下载:
Step to memory 008 堆叠技术与容量提升
堆叠方法通常用于经济地增加 PC 内存的密度,即通过添加额外的层(例如芯片、IC 和/或 PCB)来实现。堆叠通常分为两种布置方式:卡叠卡和封装叠封装。
为了提高单芯片密度,BGA 芯片采用了多芯片封装 (MCP) 堆叠技术。与沿 DIMM 侧面排列多个芯片不同,每个芯片在单个芯片封装内彼此堆叠。DRAM 制造商可能拥有自己专有的晶圆减薄和微型化技术,以实现更小的封装和更高的芯片数量。

从 2007 年起,三星半导体预计将使用其专有的“硅通孔”(TSV)和全 DRAM 堆叠配置——这种设计更简洁、更小、更快、功耗更低。然而,三星并不是唯一使用这项技术的公司,英特尔在去年春季的 IDF 上也曾演示过Terascale 技术,将内存堆叠在 80 核处理器上。
当今 MCP 技术的问题在于,不同层的 DRAM 通过脆弱的引线键合连接。这种配置要求层与层之间有几十微米深的垂直间隙,而且这种连接还需要封装板上几百微米宽的水平间距来连接芯片之间的引线。这种技术精度成本高且很难控制质量,因为数百条引线中一条短路都很难找到,更难纠正。

三星晶圆级堆叠封装 资料
来源:Samsung Electronics
据三星称,其晶圆级工艺堆叠封装 (WSP) 技术“通过激光切割形成微米级孔洞,这些孔洞垂直穿透硅片,并将内存电路与铜 (Cu) 填充物直接连接,无需额外的间隙和超出芯片边缘的导线。这些优势使三星的 WSP 能够显著缩小尺寸并实现更薄的封装。”
最新成果是三星改进的 4GB DDR2 内存模块,其性能更加出色。每个芯片将包含四层 512 兆位 DRAM,使每个芯片的密度达到 2 千兆位。升级后的 TSV 技术预计将用于 DDR3。

全球最薄的 1.4 毫米 MCP,配备 20 个堆叠芯片
来源: Elpida Memory
秋田尔必达存储器公司(Akita Elpida Memory)于2007年上半年成功开发出一款厚度仅为1.4毫米的MCP,其内部堆叠了多达20个芯片。该芯片采用独特的研磨技术,厚度仅为30微米,并在处理这些微型芯片、引线键合以及将树脂注入狭窄间隙以实现各层之间电气绝缘等方面也做出了创新。最重要的是,该芯片预计产量高且成本低——坦白说,这确实是一项了不起的成就。
以下是一些用于增加每个模块密度的堆叠方法:

TSOP DRAM 堆叠
来源: STEC

模块堆叠
来源:Kingston Memory

专有 BGA 堆叠
来源: Tessera

TSOP载带封装堆叠技术:芯片放置在载带上,背面暴露。
来源:Elpida Memory
SMART Modular Technologies 在其 CoolFlex DDR2 2GB 薄型模块中采用了一种名为“折叠印刷电路板”的有趣技术。该技术利用折叠 PCB 技术将内存容量翻倍,这样避免了DRAM本身的队列。与更复杂的多芯片堆叠技术相比,这是一种相对经济有效的方法。

超薄型 2GB DDR2 带折叠印刷电路板
资料来源: SMART Modular Technologies
DRAM制造
每个内存芯片封装都包含一个或多个晶圆,每个晶圆都是从一块更大的圆形硅片上切割下来的。制造过程中会进行严格的检查,以确保晶圆完美无瑕。晶圆切割完成后,会被放入封装中,并进行连接——这构成了DRAM芯片的基础。

DRAM 制造的一个重要方面是晶圆制造分辨率,以纳米为单位。与 CPU 的演进一样,DRAM 技术也遵循着稳步的微型化路径,以实现更高的密度和更强大的性能。DRAM的性能与光刻制造工艺中的关键技术进步息息相关,这些进步就像 DRAM 演进时间线上的感叹号。下表列出了国际半导体技术路线图 (ITRS) 设定的 DRAM 制造工艺目标。

ITRS 的 DRAM 目标
来源:半导体行业协会
ITRS 解释说:“DRAM 半节距与连接 DRAM 位单元的金属线之间的宽度和间距相关——半节距越小,在给定面积内可容纳的 DRAM 位单元就越多……栅极长度越短,切换时间越短。”
更小的电路可以使信号传输速度更快,同时功耗更低。技术发展的每个阶段都会带来效率的提升、容量的增大以及性能特征的全面提升:这与 CPU 技术的演进非常相似。
随着行业向 45 纳米制造工艺、450 毫米晶圆、45 微米晶圆厚度和 3D 芯片封装技术迈进,预计 2010 年和 2011 年将发生重大变革。当技术经历范式转变时,企业会提出许多担忧,主要涉及设备更换或改造的成本,以及某些材料在 45 纳米或更小节点的电气性能下降。
随着行业向 45 纳米及以下节点迈进,电阻和电子散射效应将会增加。随着电路尺寸的减小,电流会因为较小铜线中的较大电阻而变得更加困难,从而增加了缺陷的风险或损害了信号完整性。

ITRS 的 DRAM 目标
来源: ITPC 小组成员 Tsujimura 博士的讲座
除了提高“互连”线路的导电性外,另一种提高电流的有趣方法是降低晶体管的电阻特性。制造商利用先进的材料科学来改进基本的芯片电路。2007年,东芝通过使用不同的材料配置并在晶体管电极和硅基板之间的边界表面分散掺杂剂,使晶体管的电流提高了35%。
目前也有一些关于使用碳纳米管 (CNT) 作为基本电路和互连线的基础研究。它被认为是在2020年之前维持摩尔定律的有希望的元素之一。据Philip G. Collins和Phaedon Avouris在《科学美国人》(2000年12月刊)上报道,金属纳米管的电流密度可以比银和铜等金属高1000多倍。
首先,使用碳纳米管在一些方面具有挑战性,其制造和电路布局工艺极其复杂。人们考虑过各种制造技术,包括印刷法和生长法,但这两种技术都还非常年轻,尚未直接应用于半导体的大规模生产。2007年 5 月,镁光科技宣布推出采用 78 纳米工艺的 DDR2 和 DDR3 DRAM 芯片。凭借这种新的制造工艺,镁光公司能够将数据频率提高到 1,066MHz,同时将工作电压保持在常见的 1.8V。这是一项重大成就,因为它使 DDR2 1,066MHz 内存能够在 JEDEC 认可的 DDR2 电压标准下工作,与所有主板高度兼容,这意味着它也完全符合 AMD 新款 AM2+ CPU 的要求,这些 CPU 以 1,066MHz DDR2 内存速度运行。
使用这些 IC 构建的模块也将具有更大的超频余地,正如镁光目前的“6F2” DDR3 芯片产品所见; “镁光公司采用 78 纳米工艺和 6F2 技术,实现了迄今为止分析过的所有 DRAM 器件中最小的单元尺寸,仅为 0.0365 微米……金属-绝缘体-金属 (MIM) 电容单元设计和凹槽通道存取晶体管,使字线和位线间距均减小至 156 纳米。” 目前,所有低延迟 1,333MHz 和 1,600MHz 及以上频率的高性能 DDR3 均采用基于镁光D9 的内存芯片。
这正是核心爱好者和超频玩家寻找特定 DRAM 芯片并追踪特定内存品牌和型号的关键原因——此前,一些 DDR1 模块上使用的华邦 BH-5 和三星 TCCD 芯片也曾出现过这种情况。值得注意的是,一些制造商(例如 Corsair 和 OCZ Technology)倾向于对这些额定频率较低的高质量 DRAM 进行预超频,以便通过提高工作电压来获得更快的时钟速度。
Step to memory 007 DRAM的封装
原文在 https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_2/4/
这篇介绍了 DRAM 的封装,对于BIOS工程师来说,稍微了解一下即可
当行业从 SDR 转向 DDR 后,内存芯片的封装设计发生了显著变化。一些常见的 DRAM 封装包括薄型小外形封装 (TSOP)、芯片级封装 (CSP)、薄型四方扁平封装 (LQFP) 和球栅阵列 (BGA)。DDR中最常用的封装包括 BGA 或 TSOP 的变体,其中 TSOP 在 DDR1 中更常用,而当前的 DDR2 和 DDR3 标准则采用 FBGA,不同 DRAM 制造商之间的封装差异很小。


不同尺寸的 FBGA 样品
来源: Spansion Memory
FBGA 的主要优势包括高密度、更好的散热性能以及更短的连接器,从而减少信号失真。需要注意,这里提到的 FBGA 与Fortified BGA (强化BGA)不是同一种东西,后者是一种加强 BGA强度的技术。
LAB-Z 注释:先说一下FBGA。来自【参考1】

BGA(球栅阵列)是一种将球形焊料(焊球)以网格图案排列在封装底面上的封装。
间距有1.27mm、1.0mm、0.8mm、0.75mm、0.65mm、0.5mm、0.4mm等。
BGA前添加英文字母,会改变“封装安装高度”和“引脚间距”等。例如“ L ”表示封装安装高度L为“ 1.20 mm < 高度L ≦ 1.70 mm ”。因此,BGA前面带“L”的“LBGA”是封装安装高度为“1.20mm<高度L≦1.70mm”的SOP。
与QFP(四方扁平封装)相比,BGA具有以下优点和缺点。
优点
- 由于不存在引线变形的风险,印刷电路板上不易发生安装缺陷,从而可以更高效地进行安装工作。
- 由于封装周围没有引线,因此可以做得更小。也就是说,可以提高封装密度。
- 可高密度排列端子。
- 由于引线电感较小,适合于高速LSI封装。
缺点
- 一旦焊接,由于无法看到内部状况,因此很难修复。
- 无法从外部检查焊接状况。
- 由于无法进行手工焊接,因此必须在回流炉中完成焊接。
- 拆卸元件时需要重新加热电路板,并且根据BGA封装后处理中安装的元件的耐热性,可能无法修复。
- 由于封装和电路板的热膨胀系数不同,对于在通电时会产生热量的BGA封装来说,反复的热膨胀和收缩会导致封装或电路板变形,从而导致焊点破裂并造成断线。
FBGA
BGA前面的“ F ”代表“细间距”。
通过添加“ F ”,引脚间距缩短如下。
关于引脚间距
- 如果基本封装是BGA或LGA(FBGA或FLGA),引脚间距为0.8mm或更小
- 当基本封装为QFP ( FQFP)时,引脚间距为0.5mm或更小
因此,“FBGA(Fine-pitch BGA)”是指引脚间距为0.8mm或更小的BGA 。
总结:FBGA是 BGA 封装的一种,比普通的 BGA 底部引脚间距更小。
这里再介绍一下强化BGA(Fortified BGA)
BGA-PCB焊点应力
如果芯片底部的连接器较短,且呈网格状排列,则在热胀冷缩循环过程中,会导致每个引脚或焊球之间的应力不均匀。当 DRAM 相对于所连接的印刷电路板 (PCB) 升温且膨胀速率不同时,就会发生这种情况。PCB和 DRAM 芯片之间的不同膨胀速率会对焊球施加应力,并可能导致连接断裂 – 这就是为什么用户不应将 DRAM 电压升至高于规格的原因之一,除非采取了额外的措施来保持内存冷却。更高的电压会产生更多的热量,并以更快的速度降低内部 DRAM 电路的性能。OCZ(FlexXLC、Reaper、ReaperX)和 Corsair(DHX、Dominator)的某些内存模块采用先进的散热技术,可减少热循环过程中 DRAM 和 PCB 之间的差异。
OCZ 和 Corsair 验证其 PCB 散热技术有效性的方法是,让模块长时间承受极端温度循环,然后用 X 射线检查 DRAM 球连接处是否有断裂。这是一个极其耗时的过程,也是超频玩家需要牢记的要点之一。

OCZ 和 Corsair 为 FBGA DRAM 提供专用 PCB 冷却 资料
来源: OCZ Technology 和 Corsair Memory
如前所述,BGA技术的另一种变体被称为强化BGA。顾名思义,它通过强化连接点来提高DRAM在热循环(从热到冷,反之亦然)中的可靠性。DRAM芯片底部的焊球直径与焊点在温度循环过程中的可靠性成正比。直径越大,可靠性越高——这也是某些内存模块能够耐受更高温度的原因之一。
内存模块制造商经常使用 X 射线技术检查从生产批次中抽取的样品,以查找异常焊点。BGA连接不易从各个角度接触,因此需要使用 X 射线、在线测试和专用显微镜等先进的成像技术。X射线图像可以从各个角度拍摄,以验证 DRAM 芯片与底层 PCB 之间的连接是否正确。成像解决方案的最新进展可以与符合 RoHS(《限制在电气和电子设备中使用某些有害物质指令》)规定的无铅焊膏配合使用,同时提供计算机生成的3D细节。

BGA X射线检测
来源: STL Electronics
常见的BGA缺陷包括焊点桥接、焊点缺失、错位和焊点开路。质量控制流程通常通过光学识别软件实现自动化。机器会尝试检测诸如焊点桥接、过多空隙、焊点直径不规则或球形焊点等缺陷。所有制造商都使用上述X射线技术的变体。

BGA焊球 – 边缘颜色较深的圆环表示润湿性良好,亮点表示空洞。
数据来源: Phoenix/X-ray GmbH
焊点中的空隙或气泡被认为是有害的,但在制造过程中极难避免,通常将其控制在总连接量的一定百分比以下。空隙过大会导致焊点缺焊,并损害连接几何形状。BGA 焊点中过多的空隙会在热循环过程中削弱接触力,从而缩短内存模块的使用寿命。
其他手动检查流程包括使用功能验证、内部电路测试仪 (ICT) 和专用探针。有时,会使用“最高放大倍数斜视图”(OVHM) X 射线技术代替典型的倾斜法,从一定角度检查焊球,而不会降低放大倍数。
LAB-Z注释: SMT 厂商是否能够对产品进行X光检测可以作为考察SMT能力的标准。我接触过的一搏科技和一些厂商都有这样的能力。SMT 完成之后,直接用X光检查,能够确保SOC焊接的可靠性。
参考:
1. https://detail-infomation.com/package-types-bga/
关于 PCB/应力/芯片不良的问题,感受最深的恐怕就是微软了。
微软公司在2005年11月推出游戏主机Xbox360后,众多用户曾向微软方面投诉游戏主机经常出现不同程度的故障,而且几率偏高。有调查显示,早期版本Xbox360返修率高达68%,而2007年7月的报告指出故障几率还是有33%。

三个红色灯光形成一个环形,绰号为“三红”(Red Ring of Death)。
微软随后将游戏主机三红故障部分保修期由一年延长至三年,但其他故障问题仍维持在一年保修。微软声称将于新推出的版本主机改进制造工艺。【参考2】
在花费了十几亿美元之后,微软终于搞清楚产生的原因是GPU 芯片本身。简单的说是基片、封胶几个部件的膨胀系数都不一样,封胶在高温下还有软化的趋向。这样导致出厂之后不同材料之间存在着应力,相互拉扯。用户在使用过程中热胀冷缩加剧了这种现象,最终导致内部封装的焊料失效。更详细的解释可以在【参考3】看到。
2.https://zh.wikipedia.org/wiki/Xbox_360%E6%95%85%E9%9A%9C%E5%95%8F%E9%A1%8C
3.https://www.zhihu.com/question/340045804/answer/2638540514