中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 有没有研究 FDAPM 关机的朋友。
作者:
标题: 有没有研究 FDAPM 关机的朋友。 上一主题 | 下一主题
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『楼 主』:  有没有研究 FDAPM 关机的朋友。 [已使用 LLM 解释]

由于这次遇到了 在dos下无法关机的现象。
最终找到了 FDAPM。是可以用ACPI关机的(我我想应该是这样的)
想把他的那些搞明白。
可惜我的汇编能力较弱。有很多地方看的迷迷糊糊。
有愿意搞这个的,我们一起研究他的代码。
源代码我这里有。

愿意的跟帖啊。
LLM 解释

FDAPM(FreeDOS Advanced Power Management)是 FreeDOS 项目中用于电源管理的内核级工具,由 Eric Auer 开发。在 2010 年前后,随着 PC 硬件从传统的 APM(高级电源管理)全面转向 ACPI(高级配置与电源接口),DOS 环境下的关机问题变得复杂。

1. DOS 关机的技术背景

在 DOS 时代,实现软关机主要有两种途径:

  • APM (Advanced Power Management): 这是通过 BIOS 中断实现的方案。程序调用 INT 15h, AX=5307h, CX=0003h。如果 BIOS 支持 APM 且已建立连接,关机动作由 BIOS 固件完成。
  • ACPI (Advanced Configuration and Power Interface): ACPI 不依赖 BIOS 中断,而是要求操作系统直接操作硬件寄存器。由于 DOS 是实模式操作系统,不具备 ACPI 解析器,因此直接通过 DOS 关机需要程序手动解析系统描述表。

2. FDAPM 实现 ACPI 关机的机制

FDAPM 的源代码(通常为汇编语言)实现 ACPI 关机遵循以下工程逻辑:

A. 寻找 RSDP (Root System Description Pointer)

程序首先在物理内存的特定区域(通常是 0E0000h0FFFFFh 之间,以 16 字节对齐)搜索字符串标志 "RSD PTR "。这是接入 ACPI 系统的唯一入口。

B. 解析表结构

  1. 从 RSDP 获得 RSDT(Root System Description Table)的物理地址。
  2. 在 RSDT 中遍历各个表的指针,寻找签名位 "FACP" 的表,即 FADT(Fixed ACPI Description Table)。
  3. 在 FADT 表中提取关键字段:
    • PM1a_CNT_BLK:PM1a 控制寄存器块的 I/O 端口地址。
    • PM1b_CNT_BLK:PM1b 控制寄存器块的 I/O 端口地址(如果存在)。

C. 获取 SLP_TYP 值

这是 ACPI 关机中最困难的部分。不同的芯片组(Intel, VIA, nVidia, AMD)对于“进入 S5 状态(关机)”所需的 SLP_TYP 编码值定义不同。

  • 标准做法需要解析 DSDT(Differentiated System Description Table)中的 AML 代码(ACPI 机器语言),这对小型 DOS 工具而言开销过大。
  • FDAPM 的处理策略: FDAPM 会尝试从 FADT 中获取信息,或使用已知芯片组的特征值。它会将 SLP_EN 位(第 13 位)置 1,并将 SLP_TYP 值写入 PM1a_CNT_BLK 对应的端口。

3. 为什么 FDAPM 在某些机器上会失效

在 2010 年左右的硬件环境下,FDAPM 关机失败通常源于以下原因:

  1. 实模式访问限制: 某些新式 BIOS 提供的 ACPI 表位于 1MB 以上的扩展内存中。如果 DOS 环境下没有加载有效的内存管理器(如 HIMEM.SYS)或未开启 A20 地址线,FDAPM 可能无法定位到这些表。
  2. 硬编码局限性: 早期 FDAPM 版本可能未涵盖所有芯片组的 SLP_TYP 定义。
  3. SMI 干扰: 部分硬件要求在进入 S5 状态前通过 SMI(系统管理中断)进行特定握手,而简单的 I/O 端口操作可能无法触发该逻辑,导致挂起而非关机。

4. 关键代码逻辑参考(汇编层级)

在阅读 FDAPM 源码时,应重点关注处理 ACPI_OFF 逻辑的函数。其核心操作通常如下:

; 伪代码逻辑示例
mov dx, [PM1a_CNT_BLK] ; 加载 I/O 端口地址
mov ax, [SLP_TYP_VAL]  ; 加载针对该芯片组的关机类型值
or  ax, 2000h          ; 设置第 13 位 (SLP_EN)
out dx, ax             ; 写入端口,触发硬关机

PM1b_CNT_BLK 不为 0,则需要向两个端口同时写入相同的值。

5. 建议的技术路径

对于无法关机的特定环境,建议:

  • 确保 FDAPM 版本是最新的(Eric Auer 曾多次更新以增加对新芯片组的支持)。
  • 检查 BIOS 设置中是否开启了 "APM Support" 或 "Legacy USB Support",这有时会影响实模式下的电源管理行为。
  • 若 FDAPM 的 ACPI 模式无效,可以尝试其多种参数方案(如 FDAPM POREFDAPM APMOFF),因为部分主板虽然宣称支持 ACPI,但其 BIOS 依然保留了对 APM 调用接口的兼容映射。


2010-8-17 16:28
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 2 楼』:   [已使用 LLM 解释]

我一边看代码,一般尝试用C写代码。

目前遇到的一个难题是。

我需要读取线性地址为 3FF40000 处的值。
但是用int 0x15 ,ah = 0x87,用int86x()来读取,确读到的值是0.

有什么更好的方法没啊??

谢谢!
LLM 解释

在 DOS(实模式)环境下访问高位线性地址(如 3FF40000)涉及跨越 1MB 原生寻址限制的技术。针对原帖中提到的 INT 15h, AH=87h 调用返回为 0 的问题,以及 FDAPM 实现关机的背景,以下是技术层面的分析与补充。

1. INT 15h, AH=87h 的实现机制与限制

INT 15h, AH=87h 是 BIOS 提供的“移动块”功能,允许在实模式下将数据在 0 到 4GB 的线性地址空间内进行拷贝。

  • 工作原理:BIOS 会临时切换到保护模式(或利用 Big Real Mode 技巧),根据用户提供的全局描述符表(GDT)执行 MOVSB/W 指令,完成后切回实模式。
  • GDT 要求:调用者必须预先构建一个包含 6 个描述符项的 GDT 结构。其中:
    • 第 0 和 第 5 项必须初始化为 0。
    • 第 1 项是 GDT 自身的描述符。
    • 第 2 项(源地址描述符)和第 3 项(目标地址描述符)必须正确设置段限长(通常设为 FFFFh)、基地址(线性地址)和访问权限位(通常为 93h)。
  • 返回 0 的可能原因
    • 地址合法性3FF40000 是一个接近 1GB 的物理地址。在 2010 年左右的硬件环境下,若物理内存小于 1GB,或该地址处于内存空洞(Memory Hole)及保留给 PCI 设备映射的区域,读取结果通常为全 0 或全 F。
    • GDT 构造错误int86x() 函数在 C 语言中传递的是结构体指针。如果 GDT 结构体中的 24 位或 32 位基地址字段填充错误(例如未考虑 Intel 的字节序或字段偏移),BIOS 将从错误的物理地址读取数据。
    • A20 总线未开启:虽然 INT 15h 理论上会处理 A20,但在某些 BIOS 实现中,若 A20 未开启,寻址会出现回卷。

2. ACPI 表寻址的动态性

原帖中试图读取固定地址 3FF40000 是不规范的。FDAPM 及其关机功能依赖于 ACPI(高级配置与电源接口)规范。在 DOS 下定位 ACPI 表(如 FADT, DSDT)必须遵循以下标准逻辑,而非硬编码地址:

  1. 寻找 RSDP(Root System Description Pointer)
    • 扫描 EBDA(扩展 BIOS 数据区)的前 1KB 区域。
    • 如果未找到,扫描 0E0000h 到 0FFFFFh 的只读内存区域。
    • 特征字符串为 "RSD PTR "(8 字节,含空格)。
  2. 获取 RSDT/XSDT 地址:RSDP 结构体中包含指向 RSDT(32 位地址)或 XSDT(64 位地址)的物理指针。
  3. 解析 FADT(Fixed ACPI Description Table):在 RSDT 指向的表列表中寻找标志为 "FACP" 的项。关机所需的寄存器地址(如 PM1a_CNT_BLK)就在 FADT 中。

3. FDAPM 的技术实现要点

FDAPM 能够实现关机,其核心不在于简单的内存读取,而在于对 I/O 端口的操作:

  • ACPI 关机逻辑:通过上述搜索过程找到 PM1a_CNT_BLK 端口地址。关机通常涉及向该端口写入一个特定的 SLP_TYP 值(从 DSDT 表的 \_S5 对象中解析获得)并置位 SLP_EN 位。
  • APM 关机逻辑:如果系统不支持 ACPI,FDAPM 会尝试 APM(高级电源管理)接口。通过 INT 15h, AX=5307h, CX=0003h 尝试关闭电源。

4. 调试建议

对于在 C 语言中使用 int86x 调用 INT 15h, AH=87h

  • 结构体对齐:确保定义的 GDT 结构体在内存中是紧凑的(使用 #pragma pack(1)),否则 C 编译器插入的填充字节会导致 BIOS 解释 GDT 失败。
  • 线性地址转换
    // 假设 gdt 为 48 字节结构体
    // 源地址 3FF40000h 需要拆分为字节放入 gdt[2].base_low, base_mid, base_high
    gdt[2].base_low  = 0x0000;
    gdt[2].base_mid  = 0xF4;
    gdt[2].base_high = 0x3F;
    
  • 替代方案:在 DOS 环境下读取高位物理内存,更稳健的方法是进入 Flat Real Mode(大实模式)。通过临时切换到保护模式加载 4GB 段限长的段寄存器(如 FS/GS),回到实模式后即可像操作普通指针一样访问 4GB 空间,无需频繁调用 INT 15h

5. 结论

3FF40000 处的全零反馈最可能是因为该地址在当前硬件环境中并非有效的 ACPI 静态数据区。建议放弃硬编码地址,改为实现标准的 RSDP 签名搜索算法,并检查 GDT 结构体的内存布局是否符合 INT 15h 的规范。



2010-8-24 17:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 3 楼』:   [已使用 LLM 解释]

unsigned char TheBuffer[50];
unsigned char Buffer[20];

//参数seg在这里是高16位,offset是低16位,需要取得值在他们表示的后16字节后。
int fetch_high(unsigned int seg,unsigned int offset)
{
unsigned int i;
union REGS in,out;
struct SREGS segregs;

//GDT的前16字节和后16字节。
for(i=0;i<16;i++)
{
TheBuffer[i] = 0;
TheBuffer[0x20 + i] = 0;
}

TheBuffer[0x10]=16;
TheBuffer[0x11]=0;
TheBuffer[0x12]=peekb(seg,offset + 0x10);//低16位中的低8位 值00
TheBuffer[0x13]=peekb(seg,offset + 0x11);//低16位中的高16位 值00
TheBuffer[0x14]=peekb(seg,offset + 0x12);//高16位中的低8位 值FF
TheBuffer[0x15]=0x93;//权限
TheBuffer[0x16]=0;
TheBuffer[0x17]=peekb(seg,offset + 0x13);//高16位中的高8位 值03

TheBuffer[0x18]=16;
TheBuffer[0x19]=0;
i = FP_OFF(Buffer);//想把高端的内存数值复制到本地的数组内
TheBuffer[0x1A]=i & 0xFF;
TheBuffer[0x1B]=i & 0xFF00;

i = FP_SEG(Buffer);
TheBuffer[0x1C]=i & 0xFF;

TheBuffer[0x1D]=0x93;
TheBuffer[0x1E]=0;
TheBuffer[0x1F]=i & 0xFF00;

segregs.es = FP_SEG(TheBuffer);
in.x.si = FP_OFF(TheBuffer);
in.h.ah = 0x87;
in.x.cx = 8;

//以下显示信息为了校验测试。
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[i]);
printf("\n");
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[0x10 + i]);
printf("\n");
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[0x20 + i]);
printf("\n");


int86x(0x15, &in, &out, &segregs);

if(out.x.cflag == 1)
{
printf("fetch_high error \n");
return 0;//error
}

for(i=0;i<16;i++)
printf("%2x ",Buffer[i]);

return 1;

}
LLM 解释

在 DOS 环境下通过 BIOS 中断 INT 15h, AH=87h 访问 1MB 以上的扩展内存(Extended Memory),需要严格遵循全局描述符表(GDT)的格式要求。原帖中尝试读取线性地址 3FF40000(即接近 1GB 的物理内存位置,通常属于 ACPI 表所在的区域)时遇到了错误或返回值为 0 的问题。

以下是对原代码实现逻辑的纠正与技术背景补充:

1. INT 15h, AH=87h 的工作机制

该功能允许实模式下的程序在不进入保护模式的情况下,由 BIOS 切换到临时保护模式来移动数据。它需要调用者准备一个包含 6 个描述符的 GDT 结构:

  • 空描述符 (Dummy): 8 字节。
  • GDT 自身描述符 (GDT Alias): 8 字节。
  • 源地址描述符 (Source): 8 字节,指向待读取的内存。
  • 目标地址描述符 (Destination): 8 字节,指向实模式下的缓冲区。
  • BIOS 代码段描述符: 8 字节。
  • 堆栈段描述符: 8 字节。

原代码中 TheBuffer 的偏移逻辑和字节填充存在多处错误。

2. GDT 描述符格式纠正

8 字节描述符的物理地址分布如下:

  • 第 0-1 字节:段界限 (Limit) 的低 16 位。
  • 第 2-4 字节:物理基地址 (Base) 的低 24 位。
  • 第 5 字节:访问权限位(通常设为 0x93,表示可读写的数据段)。
  • 第 6 字节:段界限的高 4 位及属性。
  • 第 7 字节:物理基地址的高 8 位。

3. 代码中的错误分析

  • 物理地址计算错误:实模式下的缓冲区地址不能简单地通过 FP_SEGFP_OFF 直接拆分填入。必须将其转换为 24 位或 32 位的线性物理地址(Segment << 4 + Offset)。
  • GDT 填充位置错误INT 15h, AH=87h 规定寄存器 ES:SI 指向 GDT 的起始地址。源描述符位于 ES:SI + 0x10,目标描述符位于 ES:SI + 0x18。原代码中填充 TheBuffer 的下标处理不规范,且未正确处理基地址的高位字节。
  • 环境依赖:在 2010 年左右的硬件上,3FF40000 这样的高位地址可能位于 BIOS 系统区或保留内存中。如果该区域被芯片组屏蔽、属于不可读的内存映射 I/O(MMIO),或者 A20 地址线未开启(尽管此中断通常会自动处理 A20),则无法读到有效值。

4. 正确的实现逻辑示例

若要从线性地址 target_phys_addr 读取数据到实模式缓冲区 Buffer,关键步骤如下:

#include <dos.h>
#include <stdio.h>

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

// 必须 8 字节对齐以保证兼容性
BYTE gdt[48]; 

void build_descriptor(BYTE* desc, DWORD base, WORD limit) {
    desc[0] = limit & 0xFF;         // Limit 0:15
    desc[1] = (limit >> 8) & 0xFF;
    desc[2] = base & 0xFF;          // Base 0:15
    desc[3] = (base >> 8) & 0xFF;
    desc[4] = (base >> 16) & 0xFF;  // Base 16:23
    desc[5] = 0x93;                 // Access: Present, Ring 0, Data, Expand-up, Writable
    desc[6] = (limit >> 16) & 0x0F; // Limit 16:19 + Attributes
    desc[7] = (base >> 24) & 0xFF;  // Base 24:31
}

int fetch_extended_memory(DWORD src_phys, void far* dest_ptr, WORD bytes_count) {
    union REGS in, out;
    struct SREGS sregs;
    DWORD dest_phys;

    // 转换实模式远指针为物理地址
    dest_phys = ((DWORD)FP_SEG(dest_ptr) << 4) + FP_OFF(dest_ptr);

    // 清空 GDT
    for(int i=0; i<48; i++) gdt[i] = 0;

    // 源描述符 (Index 2, Offset 0x10)
    build_descriptor(&gdt[0x10], src_phys, bytes_count - 1);
    // 目标描述符 (Index 3, Offset 0x18)
    build_descriptor(&gdt[0x18], dest_phys, bytes_count - 1);

    in.h.ah = 0x87;
    in.x.cx = bytes_count / 2; // 以字为单位
    in.x.si = FP_OFF(gdt);
    sregs.es = FP_SEG(gdt);

    int86x(0x15, &in, &out, &sregs);

    return (out.x.cflag == 0); // 返回 1 表示成功
}

5. 关于 FDAPM 与 ACPI 关机

FDAPM 是 FreeDOS 环境下的电源管理工具。它之所以能实现关机,是因为它能够解析 ACPI 表(通过在高端内存搜索 RSD PTR 签名),定位到 FADT 描述表,并获取 PM1a_CNT_BLK 寄存器的 IO 端口地址。关机操作通常是向该端口写入一个特定的 SLP_TYP 值并置位 SLP_EN 位。

原帖中读取 3FF40000 失败的原因可能是:

  1. 地址不对:ACPI 表的物理地址并非固定,必须通过扫描内存中的 RSDP 结构来获取。
  2. 数据单位INT 15h, AH=87hCX 寄存器是以字(Word)为单位计算的,如果 CX 设置错误,读取长度会异常。
  3. 内存可见性:部分笔记本电脑或服务器的 ACPI 区域位于 4GB 地址空间的顶端,实模式下的 24 位地址限制可能无法覆盖这些区域。虽然 AH=87h 在 386 以后的 BIOS 中支持 32 位线性地址(即 4GB 范围),但某些 16 位 C 编译器的库函数可能未正确处理超出 16MB(24位地址限制)以上的地址填充。


2010-8-24 23:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

问题已经解决:
谢谢各位!


2010-8-25 09:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

今天遇到了惠普 400 wrokstation

居然 fdapm 都不能关。

郁闷啊。。。。。。


2010-9-7 14:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
pfox
银牌会员




积分 1451
发帖 446
注册 2002-10-20
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

现在不少主板fdapm都不能关了,所以现在比较好用的方法是直接按电源开关。希望楼主能够改造出一个更好用的关机软件。





我的下载空间
2010-9-16 12:08
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zhgwbzhd
高级用户





积分 506
发帖 187
注册 2005-12-4
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

嗯,我相信会解决的。

我现在正在致力于此。


2010-9-28 16:22
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
asdfq
初级用户





积分 34
发帖 15
注册 2018-12-28
状态 离线
『第 8 楼』:  就当水一贴 [已使用 LLM 解释]

GRUB4DOS 的 halt 是能关机的。但是它毕竟是启动器而不是电源管理程序。虽然可以在 DOS 下用命令行运行,但是颇有些杀鸡用牛刀的感觉。

在源代码中 sage2/asm.S 找 grub_halt 是关机代码。

然而我不会汇编(逃)

传言正常靠谱操作 ACPI 需要写虚拟机什么的,但 GRUB4DOS 的不像有这类东西。

希望 fdapm 更新。

Last edited by asdfq on 2023-8-8 at 19:07 ]
LLM 解释

技术背景与原理分析

1. 关于 FDAPM 的局限性与 APM 规范

FDAPM 是 FreeDOS 生态中常用的电源管理工具,其关机功能主要依赖于 APM (Advanced Power Management) BIOS 接口。APM 诞生于 1992 年,通过 INT 15h, AX=5307h 等中断调用来实现关机。

在 2010 年前后(如帖中提到的 HP 400 工作站),硬件行业已全面转向 ACPI (Advanced Configuration and Power Interface)。虽然许多 BIOS 提供向下兼容的 APM 模拟,但这种模拟往往不完整或在特定芯片组上失效,导致 FDAPM 无法正常执行关机操作。

2. GRUB4DOS 与 ACPI 关机的实现机制

帖子中提到的 GRUB4DOS halt 命令之所以在某些 FDAPM 失效的机器上成功关机,是因为它不仅尝试了 APM 调用,还包含了对 ACPI 寄存器直接操作的逻辑。

在不依赖完整 ACPI 驱动(或虚拟机解析器)的情况下,DOS 及其相近环境可以通过以下步骤尝试 ACPI 关机:

  • 定位 FADT 表:在内存中搜索 RSDP 标志,定位到 RSDT,进而找到 FADT (Fixed ACPI Description Table)。
  • 获取 I/O 端口:从 FADT 中读取 PM1a_CNT_BLK 的端口地址。
  • 写入状态位:向该端口写入特定的关机命令值(通常包含 SLP_TYPx 位和 SLP_EN 置位)。

GRUB4DOS 的实现(stage2/asm.S)采用的是精简后的启发式搜索,通过扫描内存定位 ACPI 表并尝试直接写入端口。这种方法虽然不需要运行复杂的 ACPI 状态机,但对于某些需要特定初始化序列或多端口操作的硬件,其兼容性仍存在上限。

3. 源代码中的技术误区(针对 Post #3)

Post #3 中展示的 C 代码尝试使用 INT 15h, AH=87h 块移动服务来读取高端内存。这里存在几个技术细节:

  • GDT 结构构造:代码中构造的 TheBuffer 实际上是一个全局描述符表 (GDT)。INT 15h, AH=87h 要求传入一个包含 6 个描述符项的表(Null, GDT 自引用, 源段, 目标段, BIOS 使用段, 堆栈段)。
  • 指针处理:代码中大量使用 peekbFP_OFF/FP_SEG 手动拼接 GDT。在实模式下,如果 TheBuffer 跨越了 64KB 边界,由于未处理段溢出,可能会导致数据读取异常。
  • 权限位 (Access Rights):代码中硬编码为 0x93(10010011b),表示存在、特权级 0、数据段、向上扩展、可写、已访问。这是标准的实模式下访问高端内存的描述符设置。
  • 逻辑目的:该代码段似乎是在尝试从 ACPI 表所在的物理内存地址提取数据。

4. ACPI 关机的现代替代方案

对于现代硬件(2005 年以后),如果 APM 无效,单纯依靠 BIOS 中断已不可靠。

  • 合法技术路径:目前在 DOS 环境下实现高兼容性关机的方案通常是集成开源的 ACPI 探测逻辑。
  • 开源参考:如 FreeDOS 项目中的其他电源工具或 SeaBIOS 的实现源码,它们提供了在无 OS 环境下解析 ACPI 表的规范方法。
  • 虚拟机说明:用户提到的“写虚拟机”是指 ACPI 的 _S5 状态切换有时包含在 ACPI Machine Language (AML) 中,这确实需要一个 DSDT/SSDT 解释器(即 AML 解释器)来执行。但对于大多数台式机,直接操作 FADT 定义的固定寄存器(Fixed Register)通常足以触发关机。

5. 结论

FDAPM 无法关机的主要原因是其对 ACPI 的支持不足,而非代码 Bug。在 2010 年及以后的硬件环境下,依赖 APM 协议已不再具有通用性。GRUB4DOS 的成功源于其对物理内存中 ACPI 表结构的直接检索和对 I/O 端口的直接操作,这在本质上绕过了传统的 BIOS 中断调用。



2023-8-8 19:04
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: