Как получить информацию о VESA BIOS - PullRequest
0 голосов
/ 12 июня 2018

Я изучаю Phil-Opp Tutorials о написании ОС на Rust, и, немного поиграв с ней, я хочу поиграть с отображением реальной графики на экране.

Я понял, что, вероятно, мне следует начать с использования линейного буфера кадров с VESA.Я нашел несколько учебных пособий на osdev.org здесь и здесь , но они продолжают говорить о "кодах функций" и es:di.Вторая ссылка гласит:

ФУНКЦИЯ: Получить информацию VESA BIOS

Код функции: 0x4F00

Описание: Возвращает информацию VESA BIOS, включая производителя, поддерживаемые режимы, доступная видеопамять и т. д. Ввод: AX = 0x4F00

Ввод: ES: DI = Сегмент: смещение указателя на место хранения информационной структуры VESA BIOS.

Выход: AX = 0x004Fв случае успеха другие значения указывают, что VESA BIOS не поддерживается.

В любом случае, вышеуказанная функция возвращает следующую структуру и сохраняет ее в ES: DI, как они были при входе.На входе ES: DI должен содержать указатель на следующую структуру:

vbe_info_structure: .signature db "VBE2" ; indicate support for VBE 2.0+ .table_data: resb 512-4 ; reserve space for the table below

Хотя я смотрел некоторые уроки на ассемблере, я понятия не имею, что«код функции» есть.Из того, что я понимаю, если я mov ax, 0x4f00 и создаю структуру, подобную приведенной выше, она волшебным образом перезапишет структуру, которую я мог бы затем передать в качестве параметра в мой Rust-код?Как мне установить или установить es:di?(Из исследований я подумал, что это просто автоматически устанавливается на современные процессоры)

Должен ли я вместо этого делать все эти вещи в Inline Assembly?Должен ли я просто использовать UEFI и переписать свое ядро?Я был бы рад, если бы вы могли привести пример доступа к vbe_info_structure в коде Rust (я работаю в long mode).

Вот мой файл boot.asm, но пока он не работаетпока: https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2. Спасибо!

1 Ответ

0 голосов
/ 06 августа 2018

В вашем файле boot.asm у вас есть:

get_vesa_info:
    mov ax, 0x4f00
    mov [es:di], vbe_info_structure
    int 0x10
    ret

Третья строка должна быть заменена на

    mov di, vbe_info_structure

Объяснение: как сейчас, он пытается записатьконстанта vbe_info_structure по адресу, на который указывает es: di (который в вашем случае не определен).Вместо этого вам нужно загрузить адрес vbe_info_structure в di и, таким образом, передать его в процедуру int 0x10.

Кстати, int 0x10 выполняет несколько функций.Чтобы сказать ему, какой из них вы хотите вызвать, вы передаете «код функции» в регистр топора.Думайте о коде функции как о названии функции (в сборке нет имен, только цифры и адреса).

Кроме того, вам необходимо правильно настроить es.Либо сделайте

push ds
pop es

, предполагая, что ds уже указывает на section.data, либо с помощью директивы ассемблера (assume es section.data? - не уверен насчет этого, я давно не использовалассемблер).Или, может быть, так:

mov ax, @section.data
mov es, ax

, что, конечно, следует сделать перед загрузкой 0x4f00 в топор.

...