APM处于保护模式?

时间:2019-02-12 15:30:46

标签: x86 nasm osdev protected-mode

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

  

此接口允许受保护模式APM驱动程序调用APM   BIOS功能无需,首先切换到 real或   虚拟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调用吗?

1 个答案:

答案 0 :(得分:2)

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

注意:对于您发布的代码,mov al, [0x3]是一个错误,应为mov al,0x03(但是我将其与上一条指令结合在一起,例如mov ax,(0x53 << 8) | 0x03)。