APM в защищенном режиме? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь внедрить APM в мою ОС.Хотя я могу включить APM в реальном режиме (используя int 0x15), как я могу переключать состояния питания в защищенном режиме?Мне нужно перейти в реальный режим или в режим vm86?Я прочитал документацию и запутался

Этот интерфейс позволяет драйверу APM защищенного режима вызывать функции APM BIOS без необходимости для первого переключения на реальный илирежим virtual-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?

1 Ответ

0 голосов
/ 12 февраля 2019

Насколько я знаю;Функция BIOS «int 0x15, ax = 0x5303» возвращает информацию, которую необходимо использовать для настройки трех последовательных дескрипторов (например, в вашем GDT) плюс смещение в одной из этих областей для 32-битной точки входа.После того, как вы создали дескрипторы, вы должны вызвать указанную точку входа в сегменте кода, который описывает первый созданный вами дескриптор (например, с call far dword [ ..]), и он будет вести себя так же, как «int 0x15» в реальном режиме.(с теми же параметрами ввода и вывода в одних и тех же регистрах и т. д.).

Примечание. Для кода, который вы разместили, mov al, [0x3] - это ошибка, и она должна быть mov al,0x03 (но я бы объединилэто с предыдущей инструкцией - например, mov ax,(0x53 << 8) | 0x03).

...