【问题标题】:APM in protected mode?APM 处于保护模式?
【发布时间】:2019-07-06 07:18:53
【问题描述】:

我正在尝试在我的操作系统中实施 APM。虽然我可以在实模式下启用 APM(使用 int 0x15),但如何在保护模式下切换电源状态?我需要跳转到实模式还是vm86模式?我阅读了文档,我更加困惑

此接口允许受保护模式的 APM 驱动程序调用 APM BIOS 功能无需首先切换到真实或 虚拟 86 模式

那么,如果我处于保护模式,我该如何调用 0x15 中断(以使用 APM 功能)?我做不到!

我知道 APM 有点过时了,但是 ACPI 太复杂了,我现在只想让事情变得简单。

顺便说一句,这是我目前的代码:

extern print_string
global set_power_stateoff

enableAPM:
    ; Installation check
    mov ah, 0x53
    mov al, 0x00
    xor bx, bx
    int 0x15
    jc .error
    ; Conecting to protected mode APM interface
    mov ah, 0x53
    mov al, [0x3]
    xor bx, bx
    int 0x15
    jc .error
    ; Enabling power mngm. for all devices
    mov al, 0x53
    mov ah, 0x08
    mov bx, 0001h
    mov cx, 0001h
    int 0x15
    jc .error ; if carry = 1, we have an error
    .error:
    mov si, apmerrno
    call print_string
    ret

set_power_stateoff:
    ; All devices off
    mov ah, 0x53
    mov al, 0x07
    mov bx, 0x0001
    mov cx, [0x0003]
    int 0x15

section .data:
apmerrno: db "APM interface not supported! :(", 0x0A, 0x0D, 0

编辑:我发现了一个叫做“BIOS32”的东西,它用于从保护模式调用 BIOS 中断。可以用于APM procmode调用吗?

【问题讨论】:

    标签: x86 nasm osdev protected-mode


    【解决方案1】:

    据我所知; “int 0x15, ax=0x5303” BIOS 函数返回您需要用于设置三个连续描述符(例如在您的 GDT 中)的信息以及 32 位入口点的这些区域之一中的偏移量。创建描述符后,您将调用您创建的第一个描述符所描述的代码段中的指定入口点(例如使用call far dword [ ..]),它的行为与“int 0x15”在实模式下的行为相同(在相同的寄存器中具有相同的输入和输出参数等)。

    注意:对于您发布的代码,mov al, [0x3] 是一个错误,应该是mov al,0x03(但我会将它与前面的指令结合起来 - 例如mov ax,(0x53 << 8) | 0x03)。

    【讨论】:

    • 官方规范的标题是“Advanced Power Management (APM) BIOS Interface Specification”。您应该能够将规范的标题剪切并粘贴到搜索引擎中并找到修订版 1.2(从 1996 年开始),其中包括对所有内容的描述(例如函数及其输入/输出参数)和一些附录(例如“附录 D - APM 驱动程序注意事项” ")
    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多