Есть ли способ получить список всех прерываний BIOS, присутствующих в текущей системе программно? - PullRequest
0 голосов
/ 07 апреля 2019

Я ищу список прерываний BIOS, предоставленных моим ПК.

Чтобы получить самые распространенные вызовы BIOS, существуют различные общедоступные ресурсы, но я надеялся получить список всех (возможно, не очень публичных) вызовов BIOS для моего ПК.

Существует ли программа для этого или каким-либо другим способом, который я мог бы написать (желательно на ассемблере или в C)?

Моя цель - избежать разборки BIOS. Мне также известно, что BIOS относительно похожи по своему низкоуровневому API, и поэтому список вызовов API похож.

1 Ответ

7 голосов
/ 07 апреля 2019

" Список прерываний Ральфа Брауна " может быть полезен для вас.

На этом сайте перечислены большинство прерываний, обычно используемых в системах x86:

В списке перечислены не только прерывания BIOS, но также прерывания MS-DOS и прерывания, используемые обычными программами.Это включает в себя раздел, в котором перечислены системные вызовы Linux (прерывание 0x80).

... т.е., пожалуйста, не включайте ...

К сожалению, вам придется отделить«общие» прерывания BIOS, прерывания, присутствующие только в определенных BIOS, и прерывания MS-DOS самостоятельно.

Однако для многих прерываний в списке говорится что-то вроде: «Только в BIOS, сделанных Example Software Inc.»

... мое недавнее редактирование ...

Если я вас правильно понимаю, вы хотите иметь какой-то API, который сообщает вам, какие прерывания присутствуют в определенномsystem.

К сожалению, такого API не существует:

BIOS не обязательно является одним программным обеспечением.Вместо этого некоторые аппаратные компоненты (например, графическая карта) могут иметь собственное встроенное ПО.

Встроенное ПО такого компонента обычно не имеет собственных прерываний, но оно может добавить функциональность к прерываниям BIOS, изменяявектор прерывания.

Прошивка видеокарты может добавить функцию AX=5678h в int 10h, изменив вектор прерывания так, чтобы он указывал на следующий фрагмент кода:

new_int_10_vector:
    cmp ax, 5678h
    je new_function

    ; (In reality, the next line is not as simple as shown here)
    jmp original_int_10_vector

new_function:
    ; Perform the "new" function "AX=5678h" of "int 10h"
    ; ...
    iret

Если современный BIOSпоставщики хотели бы ввести функцию, в которой перечислены все поддерживаемые функции (функция, которую вы ищете), у них возникнет проблема:

Как BIOS обнаружит, что в прошивке видеокарты добавлена ​​дополнительная функция AX=5678h до int 10h?

...