2025年2月更新,Step to UEFI 文章索引:
Insyde EXE BIOS Rom 提取器
很多时候,Insyde BIOS 是以 EXE 的形式给出来的,直接在 Windows下运行即可烧写当前设备。但是很多时候我们期望使用烧录器来烧写,这种情况,我们需要提取 EXE 中的BIOS ROM 文件。
本文根据【参考1】编写,主要步骤是:
- 使用 7z 解压 EXE 文件(选中EXE后解压即可)
- 之后使用十六进制工具打开解压出来的 winflash.fd 文件
- 在winflash.fd 中搜索 “$_IFLASH_BIOSIMG”,这个字符串起始位置+ 这个字符串长度+8字节就是 BIOS Rom 的起始位置
- 在winflash.fd 中搜索 “$_IFLASH_INI_IMG”,这个字符串起始位置-8字节就是 BIOS Rom 的结束位置
- 将中间内容粘贴为一个单独的文件就是这个 EXE 对应的 BIOS Rom了。
编写一个批处理和VC 来实现自动化。
对应的 Bat代码:
if "%1"=="" (
echo Please give the filename
exit /b 1
)
if NOT exist "%1" (
echo %1 not exist!
exit /b 1
)
mkdir tempdir
7z x %1 -otempdir -y
Ins2ROM
对应的 VC 代码:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
bool readFileToMemory(const std::string& filePath, std::vector<char>& buffer) {
std::ifstream file(filePath, std::ios::binary | std::ios::ate);
if (!file) {
std::cerr << "Failed to open file: " << filePath << std::endl;
return false;
}
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);
buffer.resize(size);
if (!file.read(buffer.data(), size)) {
std::cerr << "Failed to read file: " << filePath << std::endl;
return false;
}
return true;
}
bool saveMemoryToFile(const std::string& filePath, const std::vector<char>& buffer, size_t start, size_t end) {
if (start >= end || end > buffer.size()) {
std::cerr << "Invalid start or end position." << std::endl;
return false;
}
std::ofstream outFile(filePath, std::ios::binary);
if (!outFile) {
std::cerr << "Failed to open output file: " << filePath << std::endl;
return false;
}
outFile.write(buffer.data() + start, end - start);
if (!outFile) {
std::cerr << "Failed to write to output file: " << filePath << std::endl;
return false;
}
return true;
}
int main() {
const std::string inputFilePath = ".\\tempdir\\winflash.fd";
const std::string outputFilePath = "BIOSRom.bin";
const std::string startPattern = "$_IFLASH_BIOSIMG";
const std::string endPattern = "$_IFLASH_INI_IMG";
std::cout << "Insyde EXE to BIOS ROM" << std::endl;
std::cout << " www.lab-z.com" << std::endl;
std::cout << " 2025 02" << std::endl;
std::vector<char> buffer;
if (!readFileToMemory(inputFilePath, buffer)) {
std::cerr << "Can't find" << inputFilePath << std::endl;
return 1;
}
auto startIt = std::search(buffer.begin(), buffer.end(), startPattern.begin(), startPattern.end());
auto endIt = std::search(buffer.begin(), buffer.end(), endPattern.begin(), endPattern.end());
if (startIt == buffer.end() || endIt == buffer.end() || startIt >= endIt) {
std::cerr << "Patterns not found or in wrong order." << std::endl;
return 1;
}
size_t startPos = std::distance(buffer.begin(), startIt) + startPattern.size()+ 8;
size_t endPos = std::distance(buffer.begin(), endIt)-8;
if (!saveMemoryToFile(outputFilePath, buffer, startPos, endPos)) {
return 1;
}
std::cout << "BIOSRom.bin successfully created." << std::endl;
return 0;
}
完整的编译后的工具打包在一起:
参考:
1. https://zhuanlan.zhihu.com/p/21169375283
Step to memory 002 计算机的存储层次
《PC 内存的秘密 第一部分》 本文来自
https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_1/3/
第三章 DDR内存家族
计算机内存层次结构 不同类型的内存在计算机工程总体方案中发挥着不同的作用。它们根据用途、速度、复杂性和制造成本进行分类。
通常,更快的内存设计和制造成本更高。因此,它们的容量通常更有限。反之亦然,较慢的内存和存储系统几乎总是具有更大的容量。
计算机内存层次结构是一种金字塔结构,通常用于说明不同内存类型之间的显著差异。此图及其变体可在互联网上的各种参考网站(如维基百科)上找到。

此处所示的计算机内存层次结构版本代表了标准台式计算机中各种内存技术之间的不同性能水平。
DDR 内存系列
双倍数据速率的SDRAM (Double Data Rate SDRAM,缩写DDR) 是 1993 年推出的同步动态随机存取内存(synchronous dynamic random-access memory SDRAM ,缩写SDR) 技术的一次革命性进步。随着SDR技术在 1999 年达到极限,DDR 技术被设计为接下来十年的解决方案。
描述 DDR 内存规格的方法有两种。一种使用实际的 DRAM 芯片规格;另一种使用内存模块规格。这两种方法有时可以互换使用,但随着研究的深入,您会发现并非所有内存即便标称着相同的规格,彼此之间还是存在着差异。
DDR 各代之间的主要区别
除了物理差异之外,每一代 DDR 之间都有基础性的区别。每一项技术进步的目标都是为了解决更高性能相关的问题或副作用,例如信号噪声、偏移、抖动、时序不准确、干扰等等。
前几代中也会存在上述问题,只是在较慢的速度下这些问题通常不会导致严重的问题。而当内存的速度提升之后,就需要新技术来缓解高速信号的信号不确定性。更高的性能需要更严格的容差。

SDR 对内存数据采样发生在时钟的每一个上升沿,DDR 则是在上升沿和下降沿,因此,速度可以做到两倍。
时钟周期是指波形从波谷到达波峰再次到达波谷所需的时间,此处显示的正弦波信号实际形状介于方波和正弦波之间。在一个时钟周期内,时钟上升沿发送一次数据,下降沿发送一次,这样就实现了一个时钟周期发送2次数据。这是 DDR 技术的关键。

从下图也可以看到,同样的时间内,频率越高(周期越小),可以发送的数据也会越多:

下面表格是 DDR1-3 的一些简单对比:
Features | Unit | DDR1 | DDR2 | DDR3 |
Connecting Pins | ||||
DIMM | 184 | 240 | 240 | |
SO-DIMM | 100 200 | 200 | 204 | |
Registered DIMM | 184 | 240 | 240 | |
Mini-DIMM | – | 244 | – | |
Micro-DIMM | 172 | 214 | – | |
Packaging | 60-pin TSOP2 / 60-pin FBGA / LQFP | 60/84-pin FBGA | 78/96-pin FGBA / FBGA with Mirroring | |
Length | mm | |||
DIMM | 133.35 (5.25) | 133.35 (5.25) | 133.35 (5.25) | |
SO-DIMM | 66.7 (2.625) | 66.7 (2.625) | 66.7 (2.625) | |
Registered DIMM | 133.35 (6.25) | 133.35 (6.25) | 133.35 (6.25) | |
Mini-DIMM | – | 82 (3.23) | 83 (3.23) | |
Micro-DIMM | 54 (2.13) | 54 (2.13) | 54 (2.13) | |
Dram Core Freq | MHz | 100 – 200 | 100 – 200 | 100 – 200 |
Topology | Asymmetric T-Branch (T-Daisy) | Symmetric T-Branch | Fly-By with Termination | |
JEDEC Classified Data Rate | DDR-200/266/333/400 | DDR2-400/533/667/800 | DDR3-800/1066/1333/1600 | |
Prefetch Width | bits | 2 | 4 | 8 |
Bandwidth (theoretical) | GB/s | |||
Single-Channel | 1.6 / 2.13 / 2.67 / 3.2 | 3.2 / 4.26 / 5.34 / 6.4 | 6.4 / 8.53 / 10.67 / 12.8 | |
Dual-Channel | 2.2 / 4.26 / 5.32 / 6.4 | 6.4 / 8.52 / 10.68 / 12.8 | 12.8 / 17.06 / 21.34 / 25.6 | |
Module Capacity | 128MB – 1GB | 256MB – 4GB (8GB) | 512MB – 8GB (16GB) | |
Number of Banks | 4 | 4 or 8 | 8 | |
Read/Write Leveling | No | No | Yes | |
Supply Voltage | Volts | 2.5 +/- 0.2 | 1.8 +/- 0.1 | 1.5 +/- 0.075 |
Max Operating Temp | ºC (ºF) | 85 (185) | 85 (185) | 85 (185) |
I/O Width | x4 / x8 / x16 | x4 / x8 / x16 | x4 / x8 / x16 / x32 | |
DIMM Calibration Resistors | No | No | Yes | |
Burst Length | 2, 4 | 4, 8 | 4 (Burst Chop), 8 | |
RHoS | Vendor Dependent | Vendor Dependent | Vendor Dependent | |
Latency | ||||
CAS Latency (CL) | tCK | 2, 2.5, 3 | (2), 3, 4, 5, 6 | 5, 6, 7, 8, 9, 10, (11) |
Additive Latency (AL) | tCK | – | 0, 1, 2, 3, 4 | 0, 1, 2 |
READ Latency (RL) | tCK | CL | CL+AL | CL+AL |
WRITE Latency (WL) | tCK | 1 | RL-1 | 5, 6, 7, 8 |
CAS Write Latency (CWL) | tCK | – | – | 5, 6, 7 |
DQ Timing | ||||
READ | DLL aligns DQ, DQS to CK | DLL aligns DQ, DQS, DQSb, RDQS to CK | DLL aligns DQ, DQS, DQSb to CK | |
WRITE | Setup / Hold to DQS | Setup / Hold to DQS DQSb | Setup / Hold to DQS DQSb | |
Data Strobes | Single-ended data strobe | Single-ended or Differential data strobe | Differential data strobe with WRITE leveling | |
Termination | Motherboard Chipset | On-Die Termination | Dynamic On-Die | |
Driver Calibration | No | Off-Chip Driver (OCD) | On-Chip Self-Calibration with ZQ pin | |
DQ Driver Strength | Narrow Envelope | 18 +/-3 Ohms, OCD Calibration | 30-40 Ohms, ZQ pin Calibration | |
Interrupts | Yes | Wr-Wr, Rd-Rd (4n only) | Burst Chop for Rd and Wr | |
Reset Function | No | No | Yes (Asynchronous) | |
Thermal Sensor | No | SO-DIMM (on DIMM), FB-DIMM (on Die) | SO-DIMM (on DIMM), FB-DIMM (on Die) | |
Automatic Self Refresh (ASR) | Supported | Supported | Supported | |
Temp. Compensated Self Refresh (TCSR) | Supported | Supported | Supported | |
Self Refresh Temp (SRT) | <= 85 ºC | <= 95 ºC | <= 85 ºC, <= 95 ºC | |
Partial Array Self Refresh (PASR) | Supported | Supported | Supported | |
Deep Power Down (DPD) | Supported | Supported | Supported | |
Clock Stop Mode | Supported | Supported | Supported |
来源: JEDEC, Altera Corporation, Elpida Memory, Infineon Technologies, Kingston Technology, Micron Technology, MOSAID Technologies, Qimonda, Rambus, Samsung Semiconductor, Via Technology
ACPIWMI 测试
本文根据 https://zhuanlan.zhihu.com/p/683044464 创建一个WMI ACPI device编写,在实体机上测试通过。
- 原项目代码中有一点问题,需要修改 AcpiWmi.rc 中的代码最后一行为下面
MofResource MOFDATA AcpiWmi.def
2.编译后即可生成 AcpiWmi.dll

3.将这个文件放置到 c:\Windows\system32\drivers目录下
4.将如下 ASL 代码插入本机 ACPI DSDT 中()
Device(AAAA)
{
// pnp0c14 is pnp id assigned to WMI mapper
Name(_HID, "PNP0C14")
Name(_UID, "BBBB")
Name(_WDG, Buffer()
{
// MyMethod
// {8EC32B9D-EC6B-4138-91E8-8EB30C092E95}
0x9D, 0x2B, 0xC3, 0x8E, 0x6B, 0xEC, 0x38, 0x41, 0x91, 0xE8, 0x8E, 0xB3, 0x0C, 0x09, 0x2E, 0x95,
0x41, 0x41, // Object Id (AA)
1, // Instance Count
0x02, // Flags (WMIACPI_REGFLAG_METHOD)
// MyEvent
// {48149424-41F4-4D93-A725-F0E5C4724F8A}
0x24, 0x94, 0x14, 0x48, 0xF4, 0x41, 0x93, 0x4D, 0xA7, 0x25, 0xF0, 0xE5, 0xC4, 0x72, 0x4F, 0x8A,
0x80, // Object Id, NotificationValue
0x00, // Reserved
1, // Instance Count
0x08, // Flags (WMIACPI_REGFLAG_EVENT)
// Binary Mof
0x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10,
0x43, 0x43, // Object Id (CC)
0x01,
0x00
})
Name(WQCC, Buffer()
{
//Copy binaray hex txt here
0x46, 0x4f, 0x4d, 0x42, 0x01, 0x00, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00,
0x44, 0x53, 0x00, 0x01, 0x1a, 0x7d, 0xda, 0x54, 0x18, 0xd7, 0x85, 0x00, 0x01, 0x06, 0x18, 0x42,
0x10, 0x07, 0x10, 0x22, 0x21, 0x04, 0x12, 0x01, 0xa1, 0xc8, 0x2c, 0x0c, 0x86, 0x10, 0x38, 0x2e,
0x24, 0x15, 0x07, 0x85, 0x12, 0x02, 0xa1, 0xfe, 0x04, 0xf2, 0x2b, 0x00, 0xa1, 0x43, 0x01, 0x32,
0x05, 0x18, 0x14, 0xe0, 0x14, 0x41, 0x04, 0xbd, 0x0a, 0xb0, 0x29, 0xc0, 0xa4, 0x00, 0x8b, 0x02,
0xb4, 0x0b, 0xb0, 0x2c, 0x40, 0xb7, 0x00, 0xe9, 0xb0, 0x44, 0x24, 0x38, 0x4a, 0x0c, 0x38, 0x4a,
0x27, 0xb6, 0x70, 0xc3, 0x06, 0x2f, 0x14, 0x45, 0x33, 0x88, 0x92, 0xa0, 0x72, 0x01, 0xbe, 0x11,
0x04, 0x5e, 0xae, 0x00, 0xc9, 0x13, 0x90, 0x66, 0x01, 0x86, 0x05, 0x58, 0x17, 0x20, 0x7b, 0x08,
0x54, 0xea, 0x10, 0x50, 0x72, 0x86, 0x80, 0x1a, 0x40, 0xab, 0x13, 0x10, 0x7e, 0xa5, 0x53, 0x42,
0x12, 0x84, 0x33, 0x56, 0xf1, 0xf8, 0x9a, 0x45, 0xd3, 0x73, 0x92, 0x73, 0x0c, 0x39, 0x1e, 0x17,
0x7a, 0x58, 0x08, 0x0d, 0x20, 0x2c, 0xd2, 0x90, 0x25, 0x77, 0xd1, 0x04, 0x86, 0x71, 0x79, 0x2c,
0xde, 0xbb, 0x80, 0x11, 0x23, 0x65, 0x03, 0x32, 0x44, 0x49, 0x70, 0xa8, 0x51, 0x5b, 0xa2, 0x00,
0xf3, 0xe3, 0xd0, 0xec, 0xda, 0x1e, 0x0b, 0x81, 0x64, 0xd2, 0x86, 0x82, 0x92, 0x02, 0xa1, 0xb1,
0x9d, 0xa9, 0x67, 0x14, 0xf1, 0x48, 0x0d, 0x93, 0xc0, 0xa3, 0x88, 0x6c, 0x34, 0x0e, 0x8d, 0x1d,
0x86, 0x87, 0x19, 0xec, 0x20, 0x0e, 0xe3, 0x98, 0x23, 0x27, 0xf0, 0x84, 0x8e, 0xf4, 0xc8, 0x0b,
0x9b, 0xa7, 0x50, 0x63, 0x34, 0x07, 0x45, 0x42, 0x1c, 0x05, 0xd0, 0x63, 0x0a, 0x7b, 0xb4, 0xb1,
0xcf, 0xd7, 0xc2, 0x07, 0x2b, 0x8c, 0x23, 0x38, 0xae, 0x04, 0xff, 0xff, 0x33, 0x3f, 0x83, 0x53,
0x88, 0x16, 0xa1, 0xa0, 0x7b, 0x80, 0x30, 0x62, 0x1e, 0x52, 0x94, 0x80, 0xf1, 0x62, 0x84, 0x88,
0x7a, 0x54, 0x06, 0x0c, 0x14, 0x24, 0xd0, 0x59, 0xc5, 0x88, 0x52, 0x34, 0x98, 0x20, 0x03, 0x7b,
0x02, 0xc6, 0x88, 0x17, 0xe2, 0x69, 0xe0, 0xa8, 0x8c, 0xd3, 0x33, 0x8c, 0x4e, 0x01, 0xd8, 0x79,
0x1c, 0x12, 0x46, 0x06, 0x84, 0x10, 0xcf, 0xe4, 0x58, 0x4d, 0x60, 0xf7, 0x37, 0x08, 0xe1, 0x9e,
0x50, 0x67, 0x02, 0x94, 0x09, 0x50, 0x38, 0x3c, 0x8d, 0xac, 0x2d, 0x20, 0xa2, 0x0d, 0x47, 0x28,
0xc7, 0xd8, 0x18, 0x9a, 0x10, 0xa3, 0x44, 0x8b, 0x12, 0x2c, 0x8a, 0x81, 0x0d, 0x17, 0xeb, 0x4c,
0x63, 0x9e, 0xaa, 0xc1, 0x03, 0xc5, 0x68, 0x4d, 0x80, 0xfd, 0x41, 0x90, 0x70, 0x27, 0x03, 0x49,
0x38, 0x1b, 0x78, 0x34, 0xa8, 0x63, 0x83, 0x4f, 0x07, 0x3e, 0x19, 0x3c, 0x2d, 0x78, 0x54, 0xe7,
0x16, 0xe4, 0x8c, 0x0f, 0xec, 0x61, 0xe2, 0xb1, 0xc0, 0x07, 0x00, 0x36, 0x35, 0xff, 0x14, 0x7c,
0x4e, 0xc0, 0xbb, 0x06, 0xd4, 0x05, 0xe1, 0xf1, 0x80, 0x0d, 0x33, 0x1c, 0x66, 0x88, 0x9e, 0x75,
0xb8, 0x13, 0x38, 0x44, 0x06, 0xe8, 0x39, 0x3d, 0x19, 0x60, 0x07, 0x76, 0x32, 0x8f, 0x05, 0x6f,
0x16, 0xcd, 0xde, 0x29, 0x08, 0xc1, 0xf1, 0xf8, 0x3a, 0xc1, 0x26, 0x9c, 0xc0, 0xf2, 0x07, 0x81,
0x1a, 0x99, 0xa1, 0x7d, 0xb7, 0x38, 0xad, 0xd7, 0x02, 0x1f, 0x00, 0x4c, 0x60, 0xb1, 0x10, 0x52,
0x00, 0xa1, 0xf1, 0x80, 0x5f, 0xf1, 0x11, 0x84, 0xdc, 0x1d, 0x3c, 0x5f, 0x9f, 0x48, 0xb0, 0xff,
0xff, 0xf3, 0x09, 0xbc, 0x31, 0xf9, 0xbe, 0x70, 0x4c, 0xcf, 0x14, 0x0c, 0xee, 0x20, 0x4e, 0x39,
0xc4, 0x03, 0x03, 0xe6, 0x8c, 0x02, 0x5c, 0x42, 0xad, 0x54, 0x9f, 0x19, 0x07, 0x02, 0x91, 0x8d,
0xb5, 0xfa, 0xdc, 0x41, 0xa5, 0x53, 0x49, 0xe3, 0x7c, 0x34, 0x58, 0xdf, 0x22, 0x70, 0x82, 0xc1,
0x74, 0xb8, 0xe1, 0x52, 0x29, 0x24, 0x14, 0x42, 0xe3, 0x31, 0xb8, 0xa5, 0xc1, 0x51, 0x10, 0x8f,
0xdf, 0xb1, 0x21, 0xe4, 0xe4, 0x28, 0x80, 0x3a, 0x00, 0x78, 0x78, 0xe7, 0x73, 0x9e, 0xef, 0x09,
0x09, 0x1c, 0x13, 0x42, 0xa7, 0x07, 0x9f, 0x17, 0xf0, 0x57, 0x03, 0x1f, 0x04, 0xf8, 0xe8, 0x9e,
0x41, 0xc0, 0x72, 0x66, 0x61, 0x0b, 0x3c, 0x38, 0x1b, 0x3f, 0x6a, 0x10, 0x14, 0x5f, 0x3d, 0x7c,
0xf2, 0x30, 0x6a, 0x8c, 0x67, 0x10, 0xdf, 0x40, 0xd8, 0x59, 0x85, 0x0f, 0xc7, 0x1f, 0x19, 0x3a,
0x12, 0x32, 0x80, 0xf3, 0x48, 0xc0, 0x8f, 0x09, 0xf0, 0x27, 0xe2, 0x49, 0xfb, 0x00, 0x62, 0x02,
0x0b, 0x3c, 0x26, 0x80, 0x02, 0xc8, 0xb7, 0x02, 0x1f, 0x7c, 0x9e, 0x0c, 0xd8, 0xff, 0x7f, 0x0e,
0xcf, 0x3e, 0x3e, 0xf9, 0xb0, 0x91, 0x22, 0xc6, 0x2f, 0x0b, 0x20, 0x92, 0x35, 0x2e, 0xd4, 0x70,
0x7d, 0x66, 0x60, 0x37, 0x06, 0xdc, 0xa0, 0x5e, 0x19, 0x7c, 0x18, 0x30, 0xac, 0x0f, 0x00, 0x1c,
0xd6, 0x68, 0x61, 0x4f, 0xf6, 0x69, 0xc2, 0x83, 0xf5, 0xcc, 0x7c, 0x8d, 0xf1, 0x19, 0x04, 0x2c,
0x80, 0x78, 0xef, 0x57, 0x01, 0x32, 0x01, 0x03, 0xb2, 0xa3, 0xce, 0x43, 0x01, 0x58, 0x3c, 0x4e,
0x87, 0x5c, 0x70, 0x70, 0x07, 0x0e, 0x63, 0x44, 0x79, 0x86, 0xe0, 0x30, 0xb1, 0xc3, 0xfa, 0xd8,
0xe2, 0x33, 0x80, 0x0f, 0x26, 0xec, 0x90, 0x83, 0x1d, 0x56, 0x7c, 0x43, 0x24, 0x18, 0xec, 0xe9,
0x60, 0x02, 0xc5, 0x59, 0xac, 0xa2, 0xc0, 0xa0, 0x8e, 0x4d, 0xc0, 0x3b, 0xc0, 0x49, 0x09, 0x94,
0x83, 0xc5, 0xff, 0xff, 0x47, 0xca, 0x26, 0x8d, 0x03, 0x3a, 0x7b, 0xec, 0xa1, 0xc9, 0x83, 0x86,
0x75, 0xac, 0x02, 0xe7, 0xa1, 0x09, 0x36, 0xe8, 0x8b, 0xd2, 0xb3, 0x52, 0x8c, 0xb0, 0x21, 0x9e,
0x32, 0x42, 0xbc, 0x31, 0xb1, 0x13, 0x4b, 0x14, 0x36, 0xd0, 0x60, 0xcf, 0x1a, 0x51, 0x5e, 0x2f,
0x7a, 0xc3, 0xd3, 0x6d, 0x29, 0x4a, 0xb4, 0xc3, 0x78, 0xc0, 0x88, 0x72, 0xa2, 0xf1, 0x42, 0x19,
0x23, 0xd2, 0x09, 0x04, 0x7c, 0x68, 0x62, 0xe1, 0x1f, 0x2c, 0x3a, 0x17, 0xf8, 0xd0, 0x04, 0x70,
0xe3, 0xff, 0x7f, 0xd3, 0x21, 0x27, 0x0c, 0x9d, 0x7c, 0xf0, 0x97, 0x05, 0x0c, 0xc1, 0xc0, 0x10,
0x3a, 0xb4, 0x58, 0xd4, 0xa1, 0x05, 0x75, 0xb2, 0xf0, 0xa1, 0x82, 0xdd, 0x0a, 0x1e, 0x1a, 0xd8,
0x99, 0x05, 0x73, 0x50, 0x01, 0xff, 0x11, 0x07, 0x77, 0xcc, 0x80, 0x7b, 0xab, 0xc0, 0xcd, 0x88,
0x1f, 0x7f, 0xc0, 0x79, 0x19, 0xf2, 0xa1, 0x0b, 0x9c, 0xa7, 0x2a, 0xdc, 0x99, 0x0b, 0x78, 0x8c,
0x09, 0x77, 0xcc, 0x04, 0xc7, 0xa0, 0xd8, 0x11, 0x13, 0x96, 0x42, 0x9b, 0x3e, 0x35, 0x1a, 0xb5,
0x6a, 0x50, 0xa6, 0x46, 0x99, 0x06, 0xb5, 0xfa, 0x54, 0x6a, 0xcc, 0x98, 0x87, 0xa1, 0xf9, 0x81,
0xa0, 0x13, 0x82, 0x23, 0x82, 0xd0, 0xff, 0x7f, 0x80, 0x67, 0x82, 0x8c, 0x1c, 0x71, 0x0c, 0x22,
0x20, 0x8b, 0x35, 0x01, 0xc2, 0xa2, 0x82, 0x70, 0x15, 0x20, 0xec, 0xff, 0x0f
})
// Storage for 1 instances of ULONG
Name(AADD, 0)
//
// MyMethod data block
// Arg0 has the instance being queried
// Arg1 has the method id
// Arg2 has the data passed
Method(WMAA, 3)
{
Store(Arg2, AADD)
Notify(AAAA, 0x80)
Return(0)
}
// More info about an event
// Arg0 is the event id that was fired
Method(_WED, 1)
{
Return(AADD)
}
}
5.编译加载修改后的 DSDT, 然后使用 ASL.exe Load 到本机。需要注意,在 Windows 11中需要打开测试模式(bcdedit /set testsigning on)
6.重启之后,确认可以在设备管理器中出现了我们的设备

7.之后,以管理员权限运行 WMICreator, 在 Receive an event 页面,选择 root\WMI(有时候需要等待一下才能出现),然后 Event Class 上选择 “AcpiWmi_MyEvent”, 然后点击Execute Code 就在等待事件了

8.接下来再以管理员权限运行一个 WMICreator, 在 Execute a method 页面,Namespace 选择“root\WMI”, Classes withmethods 选择 “AcpiWmi_MyMethod”, Method 中选择FireEvent, 接下来 Method [in] parameters 随便输入一个数字, 点击Execute Code 即调用了 ACPI 中的Method

特别注意:这里必须再上面设置 hack= XXX, 然后下面的 instance 也选中,否则在运行的时候会出现错误提示!
9.最后我们在第一个打开的 WMI Creator 中看到有事件发生:

本文提到的,修改后的完整代码:
Intel: ICPS
ICPS 是 Intel® Connectivity Performance Suite 的缩写, 是 Intel 推出的用于帮助提升网络连接体验的功能。例如,当前有多个可以连接上网的 WIFI AP,使用这个技术,可以自动判断那个信号质量更好,然后选择连接到这个 AP上。
Step to Memory 001 存储架构
继续之前的《PC 内存的秘密 第一部分》,来自 https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_1/2/
第二章 存储架构
计算机上内存系统最显眼的部分是内存和板载插槽。每一代和每一类型的内存外形和插槽都略有不同,这样的设计用来避免因为误插不同型号的内存而造成损坏。
每个内存模块上都有称为 DRAM 的小型内存芯片,有时也被称为更通用的名称 – 集成电路 (IC)。DRAM 核心是一组称为单元的电容器,它们通过保持电荷来保留数据(0 或 1)。
在读取数据之前,指定的电容器会放电到一个放大器(电压电流太小,无法被直接读取,因此需要一个放大器)。也是因为这个原因信号读取过程是一个破坏性动作,会擦除电容器上的电荷。所以,在读取之后还需要额外的过程来为已读取的单元充电。这种易失性是 RAM 技术与 NAND 和 NOR 等固态存储器之间的主要区别。
根据金士顿内存公司的数据,对于第一代双倍数据速率内存(DDR1),普通计算机访问物理内存大约需要 200ns(纳秒),而硬盘驱动器则需要 12,000,000ns。如果换算成更容易理解的时间单位,两者的速度相差60,000 倍。这意味着做某件事需要 1 分钟或 42 天。
Cache(缓存)和 RAM 之间的区别
缓存也是一种内存,比 DDR 等标准系统内存快得多。这种内存用于充当频繁请求数据的专用存储区域,以实现超快速访问。根据情况,缓存也会被称作“缓冲区”。现代的缓存都是位于处理器芯片内,这些缓存根据优先级和访问速度进行分段:1 级 (L1)、2 级 (L2) 和 3 级 (L3)。L1 速度最快,延迟最低,但容量(通常以KB为单位)最小。在处理数据时,DDR 内存模块中最常访问的指令和数据会被复制到 L1 缓存中。缓存有许多不同的职责:有些仅用于数据,而有些则更专门用于命令代码或程序指令。所有现代台式机 CPU 都有一个专用的、独立的 L1 缓存,用于指令和数据。

L1 缓存的速度比标准 DDR2 甚至 DDR3 内存快很多倍。搭配最新 Intel X38 芯片组的 Intel E6750 的 L1 缓存性能约为 42,500MB/s。其次是速度稍慢但容量大得多(通常以MB为单位)的 L2 缓存,性能约为 20,500MB/s。相比之下,最新的双通道 DDR3 内存在 1,333MHz 和平均延迟设置下带宽约为 8,800MB/s。
一些 DDR 内存模块使用缓冲技术来实现更高的可靠性和性能。这些具有先进逻辑和电路的 “缓冲”内存是专门设计用于工作站和服务器级的。
Fully-Buffered DIMM (FB-DIMM) 使用高级内存缓冲器 (AMB) 来改善数据传输、信号完整性和错误检测。它旨在以串行方式移动数据,而不是 AMB 和内存控制器之间的并行架构。 FB-DIMM 的问题在于可扩展性较差,同时额外的芯片芯片会导致数据访问延迟以及发热严重的问题
常见的台式机内存模块被称为“无缓冲”DIMM;它们使用不同的内存总线技术,相比之下要便宜得多。读者应该注意,尽管标记为“DDR2”,但 FB-DIMM 与常见的台式计算机不兼容。
这里多介绍一下:这种内存长下面这样【参考1】

传统的内存拓扑结构都是这样:

FB-DIMM拓扑结构这样:

固态存储器 重要的是不要混淆这两种截然不同的存储器:易失性 RAM 技术和非易失性闪存存储器。闪存(或非易失性)存储器基于两种基本技术 – NAND 和 NOR。既然它们与 DDR 无关,为什么我们必须考虑这些类型的存储器?
计算机系统的未来在很大程度上依赖于现有的 DDR 存储器与非易失性闪存存储器协同工作,以提高整体系统性能。与随机存取存储器 (RAM) 技术不同,基于闪存的存储器无需一直供电即可保留数据。虽然它们的访问速度比当前的 DDR 技术慢,但由于没有机械部件,它们在随机读取期间通常比典型的机械硬盘驱动器快得多。

在 ReadyBoost 下,Microsoft Vista 和未来的操作系统将同时使用这两种类型的内存来提高整体系统性能。一个很好的例子是英特尔基于 NAND 闪存技术的“Turbo 内存”。在研发阶段,英特尔内部称为“Robson”技术,但现在 Turbo 内存已成为最新“Santa Rosa”迅驰平台不可或缺的一部分。它就像一个用于频繁使用的文件和应用程序的大型缓存,由于随机读取延迟很小并且能避免文件碎片(无需像硬盘寻道),因此比硬盘更快。
支持这种双存储技术的操作系统在启动时具有优势,因为关键操作系统文件可以在启动期间存储在基于闪存的内存中。
这种设计可以认为是在内存和硬盘之间再添加一层 Cache, 但是随着固态硬盘的普及,机械硬的落幕,这种多增加一层缓存的设计也退出了历史舞台。
固态硬盘
全固态硬盘驱动器是未来个人电脑的重要组成部分,它们的功耗相比机械硬盘要低得多。另外,在恶劣的移动环境中,其可靠性和生存能力远远高于标准机械磁盘驱动器。
通常,固态存储技术比当前的 DDR 技术慢,并且数据写入寿命可能相对较短,随着技术进步这个问题正在迅速改变。新技术在不断增加固态存储的寿命和存储密度。这种设备的寿命取决于制造商采用的错误校正、位冗余、操作逻辑和自诊断算法的组合。
使用固态硬盘的直接好处是,由于没有任何移动和旋转的机械系统,数据在任何突然的高 G 运动中都能生存下来。此外,固态硬盘的功耗和工作温度更低,是笔记本电脑和移动设备的理想选择。
因此,可以合理预期传统机械硬盘的许多故障将被消除。全球大型数据中心的运营成本有望大幅降低,空调需求减少,灾难性故障也更少。随着成本下降和密度增加,未来几年固态内存的市场将比 DRAM 技术更大。

原文距离今天已经有一段时间了,这段时间里,因为固态硬盘的迅速发展(主要是价格迅速降低),ReadyBoost 技术已经退出了历史舞台。如果有人诟病机械硬盘的缓慢,最好的方法就是更换为固态键盘。不过我个人还是更喜欢机械硬盘,因为这种硬盘只要妥善保存能够维持数据,并且在寿命将近时会有足够的提示而不是忽然完全坏掉。
参考:
CH32X033 更改 UART1 到 PA10
CH32X035 EVT EXAM 中 USART1 默认使用 PB10 做 TX ,但是CH32X033 没有 PB10。这里介绍如何调整设置使用 PA10 为 TX。

对应着修改 DEBUG.C 的代码即可:
/*********************************************************************
* @fn USART_Printf_Init
*
* @brief Initializes the USARTx peripheral.
*
* @param baudrate - USART communication baud rate.
*
* @return None
*/
void USART_Printf_Init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
#if(DEBUG == DEBUG_UART1)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_USART1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#elif(DEBUG == DEBUG_UART2)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
相当于Remap USART TX 为 PA10。
Windows 11安装时创建本地账户的方法
在安装界面输入如下命令
start ms-cxh:localonly
具体操作可以参考如下视频:
Step to Memory 000 内存常识
作为一名BIOS工程师,内存是无法回避的问题。最近在看一些内存的知识,忽然发现如果想理解现在的设计,那么必须去阅读过去的设计,这样才能知道为什么设计成今天的样子。而这一段让我想起来那一句名言:“He who controls the past controls the future.”
这一系列文章将从个人视角尝试介绍和理解x86 消费级内存相关知识。
首篇献给 《PC 内存的秘密》系列文章。需要注意的是这篇文章发表于2007年,其中一些知识已经发生了变化,在对应的位置我会标记出来。
《PC 内存的秘密 第一部分》原文来自 https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_1/1/
第一章 基础知识
前言
作者:Richard Swinburne
Ryan Leng 是计算机系统领域的独立技术顾问和审计师,为公司提供硬件、软件、网络、安全、IT 政策制定和培训方面的服务。
他最初接受的是计算机科学和经济学方面的培训,之后从事了许多领域的工作,包括计算机硬件集成、软件设计和工程、监控系统、广告、多媒体制作、用户界面工程和图形设计。不久前,
Ryan 带着他尚未出版的关于 DDR 技术的书籍与bit-tech
进行了接触,我们读到这本书时,对其深度和对细节的关注以及能够以易于理解的方式传达复杂的想法印象深刻。 无论您是否精通内存技术知识,对于 PC 架构的基本部分来说,这仍然是一本有趣的读物。我们将他的工作分成几个部分,我们在此处发布的第一部分涵盖了基础知识。此处发布的信息仅仅是一份更大文档的摘录。
Ryan 解释道:“本文旨在与大家分享我关于内存技术的知识和经验,尤其是我广泛使用过的双倍数据速率 (DDR) RAM。本文讨论了许多主题,包括代际差异、趋势、DDR 信号管理技术、系统优化策略、内存兼容性问题和购买注意事项。
我还希望帮助解释一些内存相关技术,这些技术可能在某些在线社区和“技术”网站中解释得模糊或不正确。为了使本文更易于理解,最重要的是,更容易让普通读者理解,我删除了许多细节和高度技术性的信息。
本文开始于研究华硕、升技、映泰、友通、海盗船、金士顿、威刚等产品的严重 DDR2 内存兼容性问题(800MHz 及以上)。DDR 内存技术的不确定性不断增加,内存系统设计人员一直都知道这一点,并且发现缓解和解决这些问题越来越具有挑战性。
为什么这对普通用户和爱好者很重要? RAM 稳定性问题和超频限制是相辅相成无法分割的。【最简单的理解是:如果你手上的6400Mhz内存,通过某种稳定的超频设置可以稳定的跑在8533Mhz, 那么对于供应商来说就会打上8533Mhz的标签进行出售了】。了解如何测试和解决兼容性问题可以帮助提高用户对 RAM 超频的了解。”
我们感谢 Ryan 为我们带来他的专业材料,并祝愿他未来一切顺利。
基础知识
管理内存技术标准的行业机构是联合电子设备工程委员会 (JEDEC)。近年来,该机构更名为“JEDEC 固态技术协会”。JEDEC 是更大的半导体工程标准化机构电子工业联盟 (EIA) 的一部分。EIA 是一个代表电子行业所有领域的行业协会。
您现在使用的计算机的所有制造商都是 EIA 和 JEDEC 的成员。自 1958 年以来,JEDEC 一直是固态行业标准的领先开发者。在过去 15 年中,DRAM 性能提高了 4,000%。然而,设计仍然相对简单,这是有意为之。RAM技术最基本的方面是需要持续供电才能保留数据,这个过程称为自刷新。因为现在的工业已经对现有基础设施进行了大量的投资,因此成本的考量一直推动着内存系统的设计。大部分复杂性被特意放在内存控制器中。这一切努力使得 DRAM 的产量相对较高,价格也相当便宜。消费产品的主要目标往往是向市场提供尽可能便宜的产品,以最大限度地提高普及率,而不是提供技术上更优越但是需要颠覆大量设计的产品。
根据MOSAID 公司的 Graham Allan 和 Jody Defazio 表示:“目前的市场领导者 是DDR2方案,它提供供应安全、高存储容量、低成本和合理的通道带宽,但插槽并不方便且需要非常复杂的控制器才能让它工作起来。”为了便于分辨,SDRAM 将被表示为“SDR”,第一代 DDR SDRAM 将用“DDR1”表示,这里的“DDR”是 “Double-Data Rate standard”的缩写,表示双倍数据速率标准相关的内存技术系列。
测量
在讨论内存时,我们无法逃避诸如时钟周期、时序、每秒兆比特 (Mbps) 和兆赫 (MHz) 等术语。它们都是相关的,用于解释不同情况下内存系统的速度概念。

通常使用兆字节 (MB) 和千兆字节 (GB) 来描述存储容量。带宽和速度有着不同的测量单位,他们都是我们描述系统性能的方式,不仅限于内存,还应用于计算机的其他部分。需要注意的是,上述单位在作为存储单位时,我们通常以1024为单位。比如,1K表示 1024字节。
一个用于说明发送的数据量(Bits),通常以给定时间段内的单位(每秒位数)计算。另一个用于测量数据流动的速度(Hz)。“流”越快,一秒钟内可以承载更多的数据单位。在讨论内存系统的速度时,这两个通常互换使用。
高级用户会注意到一个称为时钟周期(CK 或 tCK)的测量单位用于描述内存延迟。它们是内存操作状态更改期间的必要延迟,其中延迟越短内存性能越好,速度越快。此外,时钟周期可以转换为纳秒 (ns)。比如,当前时钟频率是1000Hz,对应着一个时钟的周期就是 1/1000秒。10个时钟周期就是 10*(1/1000)秒。
使用“公路”的概念来理解
内存路径类似于道路。带宽(每秒比特数)类似于道路某一部分在给定时间内可以处理的最大汽车数量,这个值与可用车道的宽度或数量直接相关。
频率(Hz)相当于对这些汽车施加的最大速度限制。更高的速度限制将允许更多车辆以更快的速度行驶。但是,这个可能会导致更频繁的发生碰撞。内存延迟可以被认为是这些道路上有交通信号灯的路口。它们会造成延迟以避免车辆碰撞。缩短等待时间将增加车辆流量,但前提是它们已经准备好并有足够的时间移动。
Windows 驱动 SYS/INF/CAT的功能与用途
1.SYS 文件(驱动程序核心文件)
SYS 文件是驱动程序的核心二进制文件,包含硬件设备与操作系统交互的代码逻辑。例如,当用户插入新硬件时,系统会调用对应的 SYS 文件实现设备初始化、中断处理和数据传输等功能。
- 功能:直接控制硬件设备,提供操作系统与硬件之间的接口。
- 生成方式:通过编译驱动程序源代码(如 C/C++)生成,编译时会根据目标系统架构(如 32 位或 64 位)生成对应的文件。
2.INF 文件(安装信息文件)
INF 文件是文本格式的配置文件,指导 Windows 如何安装驱动程序。其内容包含设备标识、文件复制路径、注册表项修改等信息。
- 功能:定义设备与驱动程序的匹配规则(如硬件 ID、兼容 ID)。
- 指定需要复制的文件(如 SYS、DLL)及其目标路径。配置注册表、服务启动参数等系统设置。
示例结构:
Inf
[Version]
Signature="$WINDOWS NT$"
Class=SampleDriver
[Manufacturer]
%Manufacturer%=MyCompany
[MyCompany.NT]
%DeviceName%=DriverInstall, HardwareID\VEN_1234
3.CAT 文件(安全目录文件)
CAT 文件是经过数字签名的安全目录文件,用于验证驱动程序的完整性和合法性。
- 功能:包含驱动程序文件的哈希值列表,确保文件未被篡改。
- 支持 Windows 的驱动程序强制签名验证(尤其在 64 位系统中)。
三者的协作流程
- 系统检测到新硬件时,根据硬件 ID 匹配 INF 文件。
- 按照 INF 文件的指示复制 SYS 文件到系统目录并配置注册表。
- 通过 CAT 文件验证驱动签名,确保安全后完成安装。
上述回答来自 CSDN
ESP32 PSRAM 测试程序
一个测试 PSRAM 的程序
int n_elements = 1000;
unsigned char * acc_data_all;
void setup(){
delay(3000);
Serial.begin(115200);
acc_data_all = (unsigned char *) ps_malloc (n_elements * sizeof (unsigned char));
if(psramInit()){
Serial.println("\nPSRAM is correctly initialized");
}else{
Serial.println("PSRAM not available");
}
memcpy(acc_data_all,"www.lab-z.com",14);
}
void loop() {
Serial.println((char*)&acc_data_all[0]);
delay(1000);
}
当使用 DFRobot FireBeetle 2 ESP32-S3 时,需要如下设置:
