Как вызываются подпрограммы прерываний из bios
Получение информации об оборудовании
INT 11h - Получить список оборудования.
Прежде чем пытаться работать с каким-либо устройством ввода/вывода, следует убедиться в том, что оно есть в составе оборудования компьютера. В процессе инициализации тестовые модули, находящиеся в BIOS, динамически определяют состав аппаратного обеспечения машины и записывают конфигурацию системы в специально отведенную для этого ячейку памяти.
Программа, вызывая прерывание INT 11h, получает в регистре AX содержимое этой ячейки. Каждый бит в слове конфигурации отвечает за соответствующее устройство.
Анализируя слово конфигурации, программа может узнать, входят ли в состав оборудования компьютера дискеты и если входят, то сколько дисководов имеется в наличии, присутствует ли арифметический сопроцессор, какой начальный режим дисплейного адаптера используется, сколько в системе принтеров, адаптеров последовательного интерфейса RS232, подключен ли игровой адаптер (джойстик)?
Обычно прикладная программа не работает сама с аппаратурой, а пользуется услугами операционной системы. При обращении к стандартной аппаратуре через операционную систему программа пользователя получит признак ошибки, если запрашиваемое устройство отсутствует. Программы, составленные на языке программирования Си при использовании библиотеки эмуляции арифметического сопроцессора, сами определяют, имеется сопроцессор или нет, и не пытаются пользоваться отсутствующим устройством. Операции сопроцессора эмулируются центральным процессором и программа просто работает медленнее.
Но если программа обращается непосредственно к портам ввода/вывода отсутствующего устройства, это может привести в лучшем случае к зависанию системы.
INT 12h - Получить размер основной памяти.
Если Ваш компьютер оборудован расширенной памятью (адресное пространство этой памяти находится выше границы в 1 мегабайт), размер этой памяти в килобайтах можно узнать, вызвав прерывание INT 15h со значением регистра AX, равным 8800h.
Работа с дисплейным адаптером.
Прерывание INT 10h выполняет все многочисленные операции по обслуживанию дисплейного адаптера.
При вызове прерывания INT 10h, как и при вызове многих других прерываний, регистр AH содержит номер функции, которую требуется выполнить. Остальные регистры при вызове прерывания содержат операнды.
Программирование дисплейного адаптера - сложная задача. Функции, выполняемые прерыванием INT 10h обширны, полностью они будут описаны во втором томе книги. Приведем краткий обзор функций прерывания INT 10h.
00h - Задание видеорежима.
Эта функция обычно вызывается первой при начале работы с дисплейным адаптером или при необходимости изменить текущий режим адаптера. Что здесь имеется в виду?
Напомним, что дисплейный адаптер может работать либо в текстовом, либо в графическом режиме. На самом деле существует несколько текстовых и несколько графических режимов, различающихся количеством строк и столбцов, способом представления цвета и т.д.
В процессе инициализации BIOS задает начальный режим адаптера исходя из его типа. Если Вашей программе нужен другой режим, отличный от исходного, она должна использовать эту функцию. При этом необходимо учитывать, что дисплейные адаптеры могут поддерживать не все режимы.
01h - Установить характеристики курсора.
С помощью этой функции вы можете установить размер и форму курсора, сделать курсор мигающим или убрать его совсем.
02h - Установить положение курсора.
Эта функция позволяет управлять расположением курсора на экране, в частности, один из способов убрать курсор - расположить его за пределами экрана, например, на несуществующей 26 строке.
03h - Получить положение курсора.
Программа может узнать в любое время, где расположен курсор. Это может потребоваться ей, например, для того, чтобы переместить курсор в следующую позицию (вправо, вверх, вниз, на 10 символов левее текущего положения и т.д.).
04h - Получить положение светового пера.
Световое перо используется относительно редко, однако если оно есть, то функция 04h позволит вам работать с этим устройством.
05h - Выбрать активную страницу дисплейной памяти.
Компьютер хранит, как правило, не один отображаемый образ экрана, а несколько. Для этого видеопамять (память для хранения видеоизображения, находится на плате видеоконтроллера) разбивается на так называемые страницы. Отображается только активная страница видеопамяти.
Используя механизм страниц, программа может заранее подготовить изображение в неактивной странице, затем сделать подготовленную страницу активной. Изображение новой страницы мгновенно появится на экране.
С помощью этих функций вы сможете переместить выбранную область окна на заданное число строк вверх или вниз. Освободившееся место будет заполняться пустыми строками. Одно из применений этой функции - полная очистка экрана.
08h, 09h - Прочитать/записать символ и атрибут.
С помощью этих функций можно прочитать или записать символ и его атрибут. При записи символа можно задать число повторений. Функцию записи с повторением удобно использовать для заполнения области экрана каким-либо символом.
Запись/чтение символа начинается с текущего положения курсора.
0Ah - Записать символ.
Эта функция предназначена для записи символа в видеопамять без задания для него индивидуального значения атрибута. Используется текущий атрибут. Можно задавать кратность записи.
0Bh - Выбрать цветовую палитру.
Эта функция позволяет управлять цветом рамки вокруг изображения в текстовом режиме и цветом фона в графическом режиме (для адаптеров EGA, VGA).
0Ch, 0Dh - Записать/прочитать графическую точку.
Можно высветить точку заданного цвета в заданном месте экрана для выбранной дисплейной страницы или прочитать значение цвета любой точки на экране соответственно.
0Eh - Запись символа на экран в стиле TTY.
После записи символа на экран курсор продвигается на следующую позицию, при этом обрабатываются такие управляющие символы, как BEL (подача звукового сигнала), возврат на одну позицию, перевод строки, возврат к началу строки.
0Fh - Прочитать текущий видеорежим.
Если Ваша программа изменяет видеорежим, она может сохранить старый видеорежим, получив его с помощью этой функции.
Кроме того, функция возвращает количество столбцов на экране и номер текущей активной дисплейной страницы.
10h, 11h, 12h - Обслуживание адаптера EGA.
Эти функции работают только при использовании дисплейных адаптеров EGA и VGA. Они позволяют устанавливать свою цветовую палитру, загружать знакогенератор (например, шрифтом для русских букв) и выполнять некоторые другие функции.
13h - Запись строки.
Для машин класса AT и выше при наличии дисплейных адаптеров EGA или VGA эта функция позволяет вывести на экран произвольную строку символов заданной длины, с заданным атрибутом и в заданном месте экрана. Можно также задать номер дисплейной страницы.
Если вы не можете использовать эту функцию (Ваш компьютер - XT или дисплейный адаптер - CGA), единственный способ вывести на экран строку символов с помощью прерывания INT 10h - вызывать в цикле функции 09h, 0Ah или 0Eh для вывода строки по одному символу.
Обслуживание клавиатуры.
Обработчик прерывания INT 16h выполняет несколько функций, связанных с обслуживанием клавиатуры. Мы не будем сейчас перечислять эти функции, они будут подробно описаны в главе, посвященной клавиатуре. С помощью функций обслуживания клавиатуры можно выполнить ввод кода нажатой клавиши как с ожиданием нажатия, так и без ожидания. В последнем случае функция сразу после вызова возвращает код нажатой клавиши или признак того, что никакая клавиша не нажималась.
Заметим, что символы, введенные с клавиатуры, помещаются в специальный клавиатурный буфер. Функция ввода символа без ожидания нажатия на клавишу проверяет состояние буфера - есть в нем символы, или нет. Если в буфере есть символы, первый помещенный в буфер символ возвращается программе. Этот символ затем может быть считан функцией ввода с ожиданием нажатия - фактически ожидания при этом не будет.
Для очистки буфера клавиатуры также можно использовать пару описанных выше функций: сначала программа проверяет пуст ли буфер, и, если он не пуст, считывает символ. Считанный символ никуда не помещается (теряется). После считывания символа программа опять проверяет содержимое буфера и так до тех пор, пока клавиатурный буфер не окажется пустым.
Для машин класса не ниже AT обработчик прерывания INT 16h выполняет и другие функции: установку задержки, запись символов в буфер клавиатуры, обслуживание расширенной клавиатуры.
Обслуживание дисковой подсистемы.
Прерывание INT 13h предназначено для обслуживания жестких и флоппи-дисков. Многочисленные функции прерывания INT 13h выполняют все операции по вводу/выводу на диски. Мы сделаем обзор только самых важных функций, остальные будут рассмотрены в книге 3, посвященной файловой системе.
00h - Сброс дисковой системы.
Эта функция выполняет установку в исходное состояние всей дисковой системы или выбранного дискового устройства. Используется обычно перед началом работы с устройством.
01h - Получить состояние дисковой системы.
Эта функция позволяет проверить результат выполнения предыдущей операции. Если операция завершилась аварийно, при помощи этой функции можно определить код ошибки.
02h/03h - Чтение/запись секторов.
Выполняется чтение секторов в оперативную память компьютера или запись информации из памяти в сектора диска.
Сектор задается для выбранных устройства, дорожки и головки. Программа должна также задать количество читаемых/записываемых секторов.
04h - Проверка секторов.
Функция проверяет сектора на правильность циклической контрольной суммы, CRC (Cyclic Redundancy Check); записи содержимого секторов в память не происходит.
Другие функции прерывания INT 13h.
Среди других функций прерывания INT 13h - форматирование дорожки, позиционирование головки на заданную дорожку диска, тестирование и предварительная установка диска, запуск диагностики контроллера и многое другое. Описание этих функций мы отложим до глав, посвященных файловой системе.
Вывод на принтер (параллельный порт).
BIOS содержит простейшую поддержку принтера - три функции прерывания INT 17h. Это функция 01h - инициализация принтера, 02h - опрос состояния принтера и 00h - вывод символа на принтер.
Поскольку к персональному компьютеру можно подключить несколько последовательных портов, при обращении к принтеру следует указывать номер порта.
Обслуживание последовательного порта связи
Функции прерывания INT 14h обслуживают порт последовательной передачи данных RS232. С помощью этих функций можно задавать формат и скорость передачи данных, определять состояние портов и, конечно, выполнять побайтную передачу данных.
Работа с системными часами.
Функции прерывания INT 1Ah обслуживают часы, имеющиеся в каждом компьютере. С их помощью вы можете установить время и дату, опросить текущее состояние часов. Вы можете работать с часами реального времени, которые имеются на машинах класса не ниже AT.
Вызов прикладной программой прерывания INT 19h приведет к перезагрузке операционной системы.
Системный сервис для машин класса AT.
Прерывание INT 15h использовалось в компьютерах IBM PC и IBM PC Jr для управления кассетным накопителем на магнитной ленте (функции 0-3). Для машин класса AT и более высокого класса прерывание INT 15h имеет и другое назначение. С его помощью обслуживается расширенная клавиатура, выполняется программная задержка, задаваемая в микросекундах, обслуживается расширенная память. Кроме того, одна из функций прерывания INT 15h переводит процессор 80286 или 80386 в защищенный режим. Заметим, что вернуть процессор обратно в реальный режим можно только сигналом начального сброса. Это же относится и к арифметическому сопроцессору 80287.
Функция C0h прерывания INT 15h выдает дополнительные сведения о конфигурации аппаратных средств компьютера.
Для PS/2 назначение некоторых функций этого прерывания другое по сравнению с машиной AT.
Int20H ОБЩЕЕ ПРЕРЫВАНИЕ ПРОГРАММЫ. Пpеpывание int20h обеспечивает
возможность пpеpывания любой пpогpаммы, pаботающей под
упpавлением MS-DOS. Обpаботчик возвpащает адpеса
пpеpывания, Ctrl-Break и кpитической ошибки, находящиеся в
psp пpогpаммы. Int20H используется с момента создания
MS-DOS. Пеpед обpащением к обpаботчику в pегистp CS
записывается адpес сегмента psp. Для пpеpывания pаботы
пpогpаммы пpогpаммисты пpедпочитают использовать системную
функцию 4СН, поскольку pезультат ее pаботы возвpащается
пеpеменной ERRORLEVEL.
Int21H ДИСПЕТЧЕР ФУНКЦИЙ MS-DOS. Пpеpывание обеспечивает
доступ к любой системной функции (см.следующий pаздел).
Int22H АДРЕС ПРЕРЫВАНИЯ ПРОГРАММЫ. Обpаботчик этого пpеpывания
возвpащает адpес памяти, по котоpому пеpедается упpавление
в pезультате пpеpывания пpогpаммы. Адpес находится в psp
пpогpаммы.
Int23H АДРЕС Ctrl-Break. Возвpащает адpес подпpогpаммы, котоpая
получает упpавление пpи нажатии Ctrl-Break. Адpес
находится в psp пpогpаммы.
Int24H ССЫЛКА НА УПРАВЛЯЮЩУЮ ЗАПИСЬ КРИТИЧЕСКОЙ ОШИБКИ.
Возвpащает адpес подпpогpаммы, котоpая получает упpавление
в pезультате кpитической ошибки. Адpес находится в psp
пpогpаммы. Пеpед обpащением к обpаботчику MS-DOS помещает
код ошибки в младшую часть pегистpа DI:
Код ошибки Описание
0 Дискета с защитой по записи
1 Неизвестное устpойство
2 Внешнее устpойство в состоянии неготовности
3 Неизвестная команда
4 Ошибка в данных
5 Невеpная длина стpуктуpы вызова
6 Ошибка поиска
7 Неизвестный тип накопителя
8 Не найден сектоp
9 На пpинтеpе нет бумаги
А Ошибка пpи записи
В Ошибка пpи чтении
С Общая ошибка
В pегистpах BP:SI возвpащается длинный адpес заголовка
блока упpавления для устpойства (см.ч.2,гл.14), из-за
котоpого пpоизошла кpитическая ошибка.
Int25H АБСОЛЮТНОЕ ЧТЕНИЕ ДИСКА. Пpеpывание используется для
считывания содеpжимого сектоpов логического диска в память
машины. Пеpед обpащением к обpаботчику необходимо ввести в
pегистpы значения:
AL Номеp устpойства, на котоpом находится диск (0=A,
1=B и т.д.).
CX Количество пpочитываемых сектоpов
DX Номеp пеpвого читаемого логического сектоpа
DS:BX Длинный адpес памяти, по котоpому загpужаются
пpочитанные данные.
В пpоцессе обpаботки пpеpывания содеpжимое pегистpов
уничтожается, за исключением содеpжимого pегистpов
сегмента. Если Int25H отpаботал ноpмально, то его pабочий
флаг очищается, в пpотивном случае значение флага pавно
единице. (Значения кода ошибки пpиведены пpи pассмотpении
пpеpывания Int24H).
Int26H АБСОЛЮТНАЯ ЗАПИСЬ НА ДИСК. Пpеpывание используется для
заполнения сектоpов логического диска данными. За
исключением того, что пpоизводится опеpация записи,
обpаботчик идентичен Int25H.
Int27H TSR. Обpаботчик используется для пpеpывания pаботы
pезидентной пpогpаммы (котоpая после этого сохpаняется
в памяти). Пеpед обpащением к обpаботчику в pегистp DX
помещается (конечный коpоткий адpес пpогpаммы+1). Этот
адpес выбиpается относительно psp пpогpаммы. Int27H
возвpащает вектоp пpеpывания, вектоp Ctrl-C и вектоp
кpитической ошибки пpогpаммы. Поэтому его нельзя
использовать для загpузки обpаботчиков кpитической ошибки.
Пpогpаммы, использующие Int27H не могут занимать более 64
К памяти. Для пpеpывания таких пpогpамм пpедпочтительней
использовать системную функцию 31Н (MS-DOS 2.Х и 3.Х).
Int28H Может использоваться только опеpационной системой (см.
Пpиложение В).
Int29H-2ЕН Заpезеpвиpованы MS-DOS (см.Пpиложение В).
Int2FH МУЛЬТИПЛЕКСНОЕ ПРЕРЫВАНИЕ. Обpаботчик этого пpеpывания
pазpаботан для поздних веpсий MS-DOS (начиная с веpсии
3.0). С его помощью можно установить мультиплексный
интеpфейс между двумя пpоцессами. Пpоцессом называется
пpогpамма или команда MS-DOS, выполняющаяся в данный
момент вpемени. В мультиплексном pежиме два пpоцесса могут
выполняться одновpеменно, т.е. пpоисходит попеpеменное
пеpеключение пpоцессоpа с одного пpоцесса на дpугой, пока
не завеpшится их выполнение. Пpеpывание 2FH использует
обpаботчик команды PRINT, позволяющей выводить данные на
печать пpи одновpеменно pаботающем пpоцессе (см.описание
команды PRINT).
Каждой пpогpамме, pаботающей в мультиплексном pежиме,
пpисваивается свой мультиплексный номеp. Мультиплексные
номеpа 00-7FH pезеpвиpуются опеpационной системной.
Команде PRINT пpисвоен мультиплексный номеp 1. Номеpа 80Н-
-FFH доступны пользователям. Не имеется опpеделенного
способа пpисвоения мультиплексного номеpа пpикладной
пpогpамме извне (пpогpаммистом). Каждая пpикладная
пpогpамма должна иметь уникальный мультиплексный номеp.
Поэтому pазpаботчики опеpационной системы pекомендуют
составлять пpогpамму так, чтобы можно было изменить ее
мультиплексный номеp. Чтобы подчеpкнуть важность этого
свойства, добавим, что номеp B7H пpисвоен подфункции,
опpеделяющей pежим pаботы APPEND. Поэтому в веpсии 3.3
pекомендуется пpисваивать пpогpаммам номеpа, лежащие в
интеpвале значений C0H-FFH.
Каждая мультиплексная пpогpамма загpужает в память
обpаботчик Int2FH. Эти обpаботчики оpганизуют цепочку,
аналогичную цепочке дpайвеpов (см.гл.14). Пеpед обpащением
к обpаботчику Int2FH пpогpамма должна записать в pегистp
AH мультиплексный номеp обpаботчика, к котоpому
пpоизводится доступ. Получив упpавление, опеpационная
система пpосматpивает цепочку Int2FH, чтобы найти
обpаботчик с тpебуемым номеpом. Затем упpавление
пеpедается этому обpаботчику, котоpый и обслуживает
сигнал на пpеpывание.
Пеpед обpащением к Int2FH также необходимо поместить в
pегистp AL код функции. Код функции пеpедается обpаботчику
и опpеделяет тип тpебуемой опеpации сеpвиса. Все
обpаботчики должны отвечать на "запpос о состоянии"
(AL=00) из вызывающей пpогpаммы. Возвpатный код помещается
в pегистp AL и может иметь следующие значения:
AL=0 Обpаботчик не включен в опеpационную систему, его
можно включить
AL=1 Обpаботчик не включен в опеpационную систему и его
нельзя включать
AL=FF Обpаботчик включен в опеpационную систему
Вызовы прерывания BIOS - это средство, которое операционные системы и прикладные программы используют для вызова средств программного обеспечения базовой системы ввода-вывода на компьютерах, совместимых с IBM PC . Традиционно вызовы BIOS в основном используются программами DOS и некоторым другим программным обеспечением, таким как загрузчики (включая, в основном, исторически относительно простое прикладное программное обеспечение, которое загружается напрямую и запускается без операционной системы, особенно игровое программное обеспечение). BIOS работает в режиме реального адреса (Real Mode) процессора x86, поэтому программы, вызывающие BIOS, должны либо также работать в реальном режиме, либо должны переключаться из защищенного режима в реальный режим перед вызовом BIOS, а затем снова переключаться. По этой причине современные операционные системы, которые используют ЦП в защищенном режиме или в длительном режиме, обычно не используют вызовы прерывания BIOS для поддержки системных функций, хотя они используют вызовы прерывания BIOS для проверки и инициализации оборудования во время загрузки . [1] Реальный режим имеет ограничение памяти 1 МБ , современные загрузчики (например, GRUB2 , Windows Boot Manager ) используют нереальный режим или защищенный режим (и выполняют вызовы прерывания BIOS в режиме Virtual 8086 , но только для загрузки ОС) для доступа до 4 ГБ памяти. [2]
На всех компьютерах программные инструкции управляют физическим оборудованием (экраном, диском, клавиатурой и т. Д.) С момента включения питания. В ПК BIOS, предварительно загруженный в ПЗУ на материнской плате, берет на себя управление сразу после сброса ЦП, в том числе при включении питания, при нажатии кнопки аппаратного сброса или при критическом программном сбое ( тройная ошибка ). заставляет схему материнской платы автоматически запускать аппаратный сброс. BIOS проверяет оборудование и инициализирует его состояние; находит, загружает и запускает загрузочную программу (обычно загрузчик ОС и исторический ROM BASIC ); и обеспечивает базовое аппаратное управление программным обеспечением, работающим на машине, которое обычно представляет собой операционную систему (с прикладными программами), но может быть непосредственно загружаемым отдельным программным приложением.
Со стороны IBM они предоставили всю информацию, необходимую для полного использования BIOS или для прямого использования оборудования и полного отказа от BIOS при программировании ранних моделей IBM PC (до PS / 2). С самого начала у программистов был выбор: использовать или нет BIOS в зависимости от оборудования и периферии. IBM настоятельно поощряла создание программ с хорошим поведением, которые обращались к оборудованию только через вызовы BIOS INT (и вызовы служб DOS), чтобы поддерживать совместимость программного обеспечения с текущими и будущими моделями ПК, имеющими разное периферийное оборудование, но IBM понимала, что для некоторых Разработчики программного обеспечения и заказчики оборудования требовали от пользовательского программного обеспечения возможности напрямую управлять оборудованием. Частично это было связано с тем, что значительная часть всех аппаратных функций и функций не была предоставлена службами BIOS. В двух примерах (среди многих) адаптеры MDA и CGA могут выполнять аппаратную прокрутку, а последовательный адаптер ПК может передавать данные с прерываниями, но IBM BIOS не поддерживает ни одну из этих полезных технических функций.
Сегодня BIOS на новом ПК по-прежнему поддерживает большинство, если не все, вызовы функций прерывания BIOS, определенные IBM для IBM AT (представленного в 1984 году), а также многие новые, а также расширения некоторых оригинальных ( например, расширенные диапазоны параметров), опубликованные различными другими организациями и совместными отраслевыми группами. Это, в сочетании с аналогичной степенью совместимости оборудования, означает, что большинство программ, написанных для IBM AT, все еще могут правильно работать на новом ПК сегодня, предполагая, что более высокая скорость выполнения приемлема (что обычно для всех, кроме игр, использующих Время на основе ЦП). Несмотря на значительные ограничения служб, доступ к которым осуществляется через прерывания BIOS, они оказались чрезвычайно полезными и устойчивыми к технологическим изменениям.
Вызовы прерывания BIOS выполняют функции аппаратного управления или ввода-вывода, запрошенные программой, возвращают программе информацию о системе или выполняют и то, и другое. Ключевым элементом назначения вызовов BIOS является абстракция: вызовы BIOS выполняют обычно определенные функции, а конкретные детали того, как эти функции выполняются на конкретном оборудовании системы, инкапсулируются в BIOS и скрыты от программы. Так, например, программе, которая хочет читать с жесткого диска, не нужно знать, является ли жесткий диск приводом ATA , SCSI или SATA (или ранее - приводом ESDI , либо приводом MFM или RLL с возможно, контроллер Seagate ST-506 , возможно, один из нескольких типов контроллеров Western Digital или другой проприетарный контроллер другой марки). Программе нужно только идентифицировать определенный BIOS номер диска, к которому она хочет получить доступ, и адрес сектора, который она должна прочитать или записать, и BIOS позаботится о переводе этого общего запроса в конкретную последовательность требуемых элементарных операций. для выполнения задачи через конкретное оборудование контроллера диска, подключенное к этому диску. Программа избавлена от необходимости знать, как управлять на низком уровне каждым типом жесткого диска (или видеоадаптера, или интерфейса порта, или периферийных устройств часов реального времени), к которым может потребоваться доступ. Это упрощает программирование операционных систем и приложений и делает программы меньше, уменьшая дублирование программного кода, поскольку функциональность, включенная в BIOS, не обязательно должна быть включена в каждую программу, которая в этом нуждается; Вместо этого в программы включены относительно короткие вызовы BIOS. (В операционных системах, где не используется BIOS, служебные вызовы, предоставляемые самой операционной системой, обычно выполняют ту же функцию и цель.)
BIOS также освобождает разработчиков компьютерного оборудования (в той степени, в которой программы написаны для использования исключительно BIOS) от необходимости поддерживать точную совместимость оборудования со старыми системами при разработке новых систем, чтобы поддерживать совместимость с существующим программным обеспечением. Например, аппаратное обеспечение клавиатуры на IBM PCjr работает совсем иначе, чем аппаратное обеспечение клавиатуры на более ранних моделях ПК IBM, но для программ, которые используют клавиатуру только через BIOS, эта разница почти незаметна. (Хорошим примером другой стороны этой проблемы является то, что значительная часть программ для ПК, которые использовались на момент выпуска PCjr, не использовали клавиатуру исключительно через BIOS, поэтому IBM также включила в PCjr аппаратные функции для эмуляции как работает оригинальное аппаратное обеспечение клавиатуры IBM PC и IBM PC XT . Эмуляция оборудования неточна, поэтому не все программы, которые пытаются напрямую использовать аппаратное обеспечение клавиатуры, будут правильно работать на PCjr, но все программы, которые используют только службы клавиатуры BIOS, будут .)
Операционные системы и другое программное обеспечение взаимодействуют с программным обеспечением BIOS для управления установленным оборудованием через программные прерывания. Программное прерывание - это особая разновидность общей концепции прерывания. Прерывание - это механизм, с помощью которого ЦП может быть направлен на то, чтобы остановить выполнение основной программы и вместо этого немедленно выполнить специальную программу, называемую процедурой обслуживания прерывания (ISR). После завершения ISR ЦП продолжает выполнение основной программы. В процессорах x86, когда происходит прерывание, ISR для вызова находится в таблице адресов начальной точки ISR (называемых «векторами прерывания») в памяти: таблица векторов прерываний (IVT). Прерывание вызывается по номеру его типа от 0 до 255, номер типа используется в качестве индекса в таблице векторов прерываний, и по этому индексу в таблице находится адрес ISR, который будет запущен в ответ на прерывание. Программное прерывание - это просто прерывание, которое запускается программной командой; поэтому программные прерывания функционируют как подпрограммы, с той разницей, что программе, которая выполняет вызов программного прерывания, не требуется знать адрес ISR, а только номер прерывания. Это дает преимущества модульности, совместимости и гибкости конфигурации системы.
Программное обеспечение BIOS обычно возвращается вызывающему абоненту с кодом ошибки в случае неудачи или с кодом состояния и / или запрошенными данными в случае успеха. Сами данные могут иметь размер от одного бита или до 65 536 байтов целых необработанных секторов диска (максимум, который может поместиться в один сегмент памяти реального режима). BIOS многократно расширялся и улучшался на протяжении многих лет многими различными корпоративными организациями, и, к сожалению, результатом этого развития является то, что не все функции BIOS, которые можно назвать, используют согласованные соглашения для форматирования и передачи данных или для отчетности о результатах. Некоторые функции BIOS сообщают подробную информацию о состоянии, в то время как другие могут даже не сообщать об успехе или неудаче, а просто молча возвращаются, оставляя вызывающему объекту предположить успех (или проверить результат каким-либо другим способом). Иногда также может быть сложно определить, поддерживается ли конкретный вызов функции BIOS на определенном компьютере или каковы ограничения параметров вызова на этом компьютере. (Для некоторых недопустимых номеров функций или допустимых номеров функций с недопустимыми значениями ключевых параметров - особенно с ранней версией IBM BIOS - BIOS может ничего не делать и возвращать без кода ошибки; тогда это [неудобная, но неизбежная] ответственность вызывающий абонент либо избегает этого случая, не выполняя такие вызовы, либо положительно проверяет ожидаемый эффект вызова, а не предполагает, что вызов был эффективным. одна версия BIOS от определенного поставщика может быть недействительной в более ранней или другой версии BIOS от того же поставщика или в версии BIOS - любого относительного возраста - от другого поставщика.)
Поскольку в вызовах прерывания BIOS используется передача параметров на основе регистров ЦП, вызовы ориентированы на выполнение из языка ассемблера и не могут выполняться напрямую из большинства языков высокого уровня (HLL). Однако язык высокого уровня может предоставлять библиотеку подпрограмм-оболочек, которые переводят параметры из формы (обычно на основе стека), используемой языком высокого уровня, в форму на основе регистров, требуемую BIOS, а затем обратно в соглашение о вызовах HLL после BIOS возвращается. В некоторых вариантах C вызовы BIOS могут выполняться с использованием встроенного языка ассемблера в модуле C. (Поддержка встроенного языка ассемблера не является частью стандарта ANSI C, но является расширением языка; поэтому модули C, использующие встроенный язык ассемблера, менее переносимы, чем чистые стандартные модули C.)
Вызов прерывания
Вызов прерывания может быть выполнен с помощью инструкции языка ассемблера INT x86 . Например, чтобы вывести символ на экран с помощью прерывания BIOS 0x10, можно выполнить следующие инструкции языка ассемблера x86:
Список общих классов прерываний BIOS можно найти ниже. Обратите внимание, что некоторые BIOS (особенно старые) не реализуют все эти классы прерываний.
INT 18h традиционно перешли к реализации Cassette BASIC (предоставляемой Microsoft), хранящейся в дополнительных ПЗУ . Этот вызов обычно вызывается, если BIOS не может идентифицировать какие-либо тома загрузочного диска при запуске.
В то время, когда в 1981 году был выпущен оригинальный IBM PC (тип машины IBM 5150), ключевой особенностью был BASIC в ПЗУ. Современные популярные персональные компьютеры, такие как Commodore 64 и линейка Apple II, также имели Microsoft Cassette BASIC в ПЗУ (хотя Commodore переименовал их лицензионную версию в Commodore BASIC), поэтому на значительной части предполагаемого рынка IBM PC требовал BASIC для конкуренции. Как и в других системах, ROM BASIC IBM PC служил примитивной бездисковой операционной системой, позволяя пользователю загружать, сохранять и запускать программы, а также писать и уточнять их. (Оригинальный IBM PC был также единственной моделью ПК от IBM, которая, как и его два вышеупомянутых конкурента, включала аппаратное обеспечение интерфейса кассеты. Базовая модель IBM PC имела только 16 Кбайт ОЗУ и не имела дисковых накопителей [ любого типа ], поэтому кассета интерфейс и BASIC в ПЗУ были важны для того, чтобы можно было использовать базовую модель. ПК IBM с объемом ОЗУ менее 32 КБ не может загружаться с диска. Из пяти микросхем ПЗУ по 8 КБ в исходном ПК IBM, общим объемом 40 КБ, четыре содержат BASIC, и только один содержит BIOS; когда установлено только 16 KiB RAM, ROM BASIC составляет более половины всей системной памяти [4/7, если быть точным].)
Компания Digital Rainbow 100 B INT 18h называла свой BIOS, несовместимый с IBM BIOS. Turbo Pascal , Turbo C и Turbo C ++ перепрофилировали INT 18 для выделения памяти и подкачки. Другие программы также повторно использовали этот вектор в своих целях.
В системах DOS IO.SYS или IBMBIO.COM перехватывают INT 13 для обнаружения смены гибких дисков, отслеживания вызовов форматирования, исправления ошибок границ DMA и решения проблем в BIOS ROM IBM "01/10/84" с кодом модели 0xFC перед первый звонок.
Многие современные операционные системы (например, Linux и Windows NT ) обходят вызовы прерывания BIOS после запуска, ядро ОС переключает ЦП в защищенный режим или длительный режим при запуске, предпочитая использовать свои собственные программы (например, драйверы ядра ) для управления подключенное оборудование напрямую. Причина этого заключалась в первую очередь в том, что эти операционные системы запускают процессор в защищенном режиме или в длительном режиме, тогда как для вызова прерывания BIOS требуется переключение в реальный режим или нереальный режим или использование режима Virtual 8086 . Реальный режим, нереальный режим и виртуальный режим 8086 работают медленно. Однако существуют также серьезные причины для безопасности, чтобы не переключаться в реальный режим, а код BIOS реального режима имеет ограничения как по функциональности, так и по скорости, что побуждает разработчиков операционной системы искать ему замену. Фактически, ограничения скорости BIOS сделали его обычным даже в эпоху DOS, чтобы программы обходили его, чтобы избежать ограничений производительности, особенно для отображения видеографики и быстрой последовательной связи. Проблемы с функциональностью BIOS включают ограничения в диапазоне определенных функций, несогласованность в подмножествах этих функций, поддерживаемых на разных компьютерах, и различия в качестве BIOS (то есть некоторые BIOS являются полными и надежными, другие сокращены и содержат ошибки). Взяв дело в свои руки и не полагаясь на BIOS, разработчики операционных систем могут устранить некоторые риски и сложности, с которыми они сталкиваются при написании и поддержке системного программного обеспечения. С другой стороны, поступая таким образом, разработчики берут на себя ответственность за предоставление программного обеспечения драйверов «на чистом железе» для каждой системы или периферийного устройства, с которыми они намерены работать в своей операционной системе (или за побуждение производителей оборудования предоставлять эти драйверы). Таким образом, должно быть очевидно, что компактные операционные системы, разработанные с небольшим бюджетом, будут, как правило, активно использовать BIOS, в то время как большие операционные системы, созданные огромными группами инженеров-программистов с большими бюджетами, чаще предпочитают писать свои собственные драйверы вместо использования BIOS, то есть , даже без учета проблем совместимости BIOS и защищенного режима.
BIOS прерывания вызовов представляют собой средство , что операционные системы и прикладные программы используют для вызова объектов Basic Input / Output System программного обеспечения на IBM PC совместимых компьютеров. Традиционно вызовы BIOS в основном используются программами DOS и некоторым другим программным обеспечением, таким как загрузчики (включая, в основном, исторически относительно простое прикладное программное обеспечение, которое загружается напрямую и запускается без операционной системы, особенно игровое программное обеспечение). BIOS работает в режиме реального адреса (Real Mode) процессора x86, поэтому программы, вызывающие BIOS, должны либо также работать в реальном режиме, либо должны переключаться из защищенного режима в реальный режим перед вызовом BIOS, а затем снова переключаться. По этой причине современные операционные системы, которые используют ЦП в защищенном режиме или в длительном режиме, обычно не используют вызовы прерывания BIOS для поддержки системных функций, хотя они используют вызовы прерывания BIOS для проверки и инициализации оборудования во время загрузки . [1] Реальный режим имеет ограничение памяти 1 МБ , современные загрузчики (например, GRUB2 , Windows Boot Manager ) используют нереальный режим или защищенный режим (и выполняют вызовы прерывания BIOS в режиме Virtual 8086 , но только для загрузки ОС) для доступа до 4 ГБ памяти. [2]
На всех компьютерах программные инструкции управляют физическим оборудованием (экраном, диском, клавиатурой и т. Д.) С момента включения питания. В ПК BIOS, предварительно загруженный в ПЗУ на материнской плате, берет на себя управление сразу после сброса ЦП, в том числе при включении питания, при нажатии кнопки аппаратного сброса или при критическом программном сбое ( тройная ошибка ). заставляет схему материнской платы автоматически запускать аппаратный сброс. BIOS проверяет оборудование и инициализирует его состояние; находит, загружает и запускает загрузочную программу (обычно загрузчик ОС и исторический ROM BASIC ); и обеспечивает базовый аппаратный контроль для программного обеспечения, работающего на машине, которое обычно является операционной системой (с прикладными программами), но может быть непосредственно загружающимся отдельным программным приложением.
Со стороны IBM они предоставили всю информацию, необходимую для полного использования BIOS или для прямого использования оборудования и полного отказа от BIOS при программировании ранних моделей IBM PC (до PS / 2). С самого начала у программистов был выбор: использовать или нет BIOS в зависимости от оборудования и периферии. IBM настоятельно поощряла создание программ с хорошим поведением, которые обращались к оборудованию только через вызовы BIOS INT (и вызовы служб DOS), для поддержки совместимости программного обеспечения с текущими и будущими моделями ПК, имеющими разное периферийное оборудование, но IBM понимала, что для некоторых Разработчики программного обеспечения и заказчики оборудования требовали от пользовательского программного обеспечения возможности напрямую управлять оборудованием. Частично это было связано с тем, что значительная часть всех аппаратных функций и функций не была предоставлена службами BIOS. В двух примерах (среди многих) адаптеры MDA и CGA могут выполнять аппаратную прокрутку, а последовательный адаптер ПК может передавать данные с прерываниями, но IBM BIOS не поддерживает ни одну из этих полезных технических функций.
Сегодня BIOS на новом ПК по-прежнему поддерживает большинство, если не все, вызовы функций прерывания BIOS, определенные IBM для IBM AT (представленного в 1984 году), а также многие новые, а также расширения некоторых оригинальных ( например, расширенные диапазоны параметров), опубликованные различными другими организациями и совместными отраслевыми группами. Это, в сочетании с аналогичной степенью совместимости оборудования, означает, что большинство программ, написанных для IBM AT, все еще могут правильно работать на новом ПК сегодня, предполагая, что более высокая скорость выполнения приемлема (что обычно для всех, кроме игр, использующих Время на основе ЦП). Несмотря на значительные ограничения служб, доступ к которым осуществляется через прерывания BIOS, они оказались чрезвычайно полезными и устойчивыми к технологическим изменениям.
Вызовы прерывания BIOS выполняют функции аппаратного управления или ввода-вывода, запрошенные программой, возвращают программе информацию о системе или выполняют и то, и другое. Ключевым элементом назначения вызовов BIOS является абстракция: вызовы BIOS выполняют обычно определенные функции, а конкретные детали того, как эти функции выполняются на конкретном оборудовании системы, инкапсулируются в BIOS и скрыты от программы. Так, например, программе, которая хочет читать с жесткого диска, не нужно знать, является ли жесткий диск приводом ATA , SCSI или SATA (или ранее - приводом ESDI , либо приводом MFM или RLL с возможно, контроллер Seagate ST-506 , возможно, один из нескольких типов контроллеров Western Digital или другой проприетарный контроллер другой марки). Программе нужно только идентифицировать определенный BIOS номер диска, к которому она хочет получить доступ, и адрес сектора, который она должна прочитать или записать, и BIOS позаботится о переводе этого общего запроса в конкретную последовательность требуемых элементарных операций. для выполнения задачи через конкретное оборудование контроллера диска, подключенное к этому диску. Программа избавлена от необходимости знать, как управлять на низком уровне каждым типом жесткого диска (или видеоадаптера, или интерфейса порта, или периферийных устройств часов реального времени), к которым может потребоваться доступ. Это и упрощает программирование операционных систем и приложений, и уменьшает размер программ, уменьшая дублирование программного кода, поскольку функциональные возможности, включенные в BIOS, не нужно включать в каждую программу, которая в этом нуждается; Вместо этого в программы включены относительно короткие вызовы BIOS. (В операционных системах, где не используется BIOS, служебные вызовы, предоставляемые самой операционной системой, обычно выполняют ту же функцию и цель.)
BIOS также освобождает разработчиков компьютерного оборудования (в той степени, в которой программы написаны для использования исключительно BIOS) от необходимости поддерживать точную совместимость оборудования со старыми системами при разработке новых систем, чтобы поддерживать совместимость с существующим программным обеспечением. Например, аппаратное обеспечение клавиатуры на IBM PCjr работает совсем иначе, чем аппаратное обеспечение клавиатуры на более ранних моделях ПК IBM, но для программ, которые используют клавиатуру только через BIOS, эта разница почти незаметна. (Хорошим примером другой стороны этой проблемы является то, что значительная часть программ для ПК, которые использовались на момент выпуска PCjr, не использовали клавиатуру исключительно через BIOS, поэтому IBM также включила в PCjr аппаратные функции для эмуляции как работает оригинальное аппаратное обеспечение клавиатуры IBM PC и IBM PC XT . Эмуляция оборудования неточна, поэтому не все программы, которые пытаются напрямую использовать аппаратное обеспечение клавиатуры, будут правильно работать на PCjr, но все программы, которые используют только службы клавиатуры BIOS, будут .)
Операционные системы и другое программное обеспечение взаимодействуют с программным обеспечением BIOS для управления установленным оборудованием через программные прерывания. Программное прерывание - это особая разновидность общей концепции прерывания. Прерывание - это механизм, с помощью которого ЦП может быть направлен на то, чтобы остановить выполнение основной программы и вместо этого немедленно выполнить специальную программу, называемую процедурой обслуживания прерывания (ISR). После завершения ISR ЦП продолжает выполнение основной программы. В процессорах x86, когда происходит прерывание, ISR для вызова находится в таблице адресов начальной точки ISR (называемых «векторами прерывания») в памяти: таблица векторов прерываний (IVT). Прерывание вызывается по номеру его типа от 0 до 255, номер типа используется в качестве индекса в таблице векторов прерываний, и по этому индексу в таблице находится адрес ISR, который будет запущен в ответ на прерывание. Программное прерывание - это просто прерывание, которое запускается программной командой; поэтому программные прерывания функционируют как подпрограммы, с той разницей, что программе, которая выполняет вызов программного прерывания, не требуется знать адрес ISR, а только номер прерывания. Это дает преимущества модульности, совместимости и гибкости конфигурации системы.
Программное обеспечение BIOS обычно возвращается вызывающему абоненту с кодом ошибки в случае неудачи или с кодом состояния и / или запрошенными данными в случае успеха. Сами данные могут иметь размер от одного бита или до 65 536 байтов целых необработанных секторов диска (максимум, который может поместиться в один сегмент памяти реального режима). BIOS многократно расширялся и улучшался на протяжении многих лет многими различными корпоративными организациями, и, к сожалению, результатом этого развития является то, что не все функции BIOS, которые можно назвать, используют согласованные соглашения для форматирования и передачи данных или для отчетности о результатах. Некоторые функции BIOS сообщают подробную информацию о состоянии, в то время как другие могут даже не сообщать об успехе или неудаче, а просто молча возвращаются, оставляя вызывающему объекту предположить успех (или проверить результат каким-либо другим способом). Иногда также может быть сложно определить, поддерживается ли конкретный вызов функции BIOS на определенном компьютере или каковы ограничения параметров вызова на этом компьютере. (Для некоторых недопустимых номеров функций или допустимых номеров функций с недопустимыми значениями ключевых параметров - особенно с ранней версией IBM BIOS - BIOS может ничего не делать и возвращать без кода ошибки; тогда это [неудобная, но неизбежная] ответственность вызывающий абонент либо избегает этого случая, не выполняя такие вызовы, либо положительно проверяет ожидаемый эффект вызова, а не предполагает, что вызов был эффективным. одна версия BIOS от определенного поставщика может быть недействительной в более ранней или другой версии BIOS от того же поставщика или в версии BIOS - любого относительного возраста - от другого поставщика.)
Поскольку в вызовах прерывания BIOS используется передача параметров на основе регистров ЦП, вызовы ориентированы на выполнение из языка ассемблера и не могут выполняться напрямую из большинства языков высокого уровня (HLL). Однако язык высокого уровня может предоставлять библиотеку подпрограмм-оболочек, которые переводят параметры из формы (обычно на основе стека), используемой языком высокого уровня, в форму на основе регистров, требуемую BIOS, а затем обратно в соглашение о вызовах HLL после BIOS возвращается. В некоторых вариантах C вызовы BIOS могут выполняться с использованием встроенного языка ассемблера в модуле C. (Поддержка встроенного языка ассемблера не является частью стандарта ANSI C, но является расширением языка; поэтому модули C, использующие встроенный язык ассемблера, менее переносимы, чем чистые стандартные модули C.)
Вызов прерывания
Вызов прерывания может быть выполнен с помощью инструкции языка ассемблера INT x86 . Например, чтобы вывести символ на экран с помощью прерывания BIOS 0x10, можно выполнить следующие инструкции языка ассемблера x86:
Список общих классов прерываний BIOS можно найти ниже. Обратите внимание, что некоторые BIOS (особенно старые) не реализуют все эти классы прерываний.
INT 18h традиционно перешли к реализации Cassette BASIC (предоставляемой Microsoft), хранящейся в дополнительных ПЗУ . Этот вызов обычно вызывается, если BIOS не может идентифицировать какие-либо тома загрузочного диска при запуске.
В то время, когда в 1981 году был выпущен оригинальный IBM PC (тип машины IBM 5150), ключевой особенностью был BASIC в ПЗУ. Современные популярные персональные компьютеры, такие как Commodore 64 и линейка Apple II, также имели Microsoft Cassette BASIC в ПЗУ (хотя Commodore переименовал их лицензионную версию в Commodore BASIC), поэтому на значительной части предполагаемого рынка IBM PC требовал BASIC для конкуренции. Как и в других системах, ROM BASIC IBM PC служил примитивной бездисковой операционной системой, позволяя пользователю загружать, сохранять и запускать программы, а также писать и уточнять их. (Оригинальный IBM PC был также единственной моделью ПК от IBM, которая, как и его два вышеупомянутых конкурента, включала аппаратное обеспечение интерфейса кассеты. Базовая модель IBM PC имела только 16 Кбайт ОЗУ и не имела дисковых накопителей [ любого типа ], поэтому кассета интерфейс и BASIC в ПЗУ были важны для того, чтобы можно было использовать базовую модель. ПК IBM с объемом ОЗУ менее 32 КБ не может загружаться с диска. Из пяти микросхем ПЗУ по 8 КБ в исходном ПК IBM, общим объемом 40 КБ, четыре содержат BASIC, и только один содержит BIOS; когда установлено только 16 KiB RAM, ROM BASIC составляет более половины всей системной памяти [4/7, если быть точным].)
Компания Digital Rainbow 100 B INT 18h называла свой BIOS, несовместимый с IBM BIOS. Turbo Pascal , Turbo C и Turbo C ++ перепрофилировали INT 18 для выделения памяти и подкачки. Другие программы также повторно использовали этот вектор в своих целях.
В системах DOS IO.SYS или IBMBIO.COM перехватывают INT 13 для обнаружения смены гибких дисков, отслеживания вызовов форматирования, исправления ошибок границ DMA и решения проблем в BIOS ROM IBM "01/10/84" с кодом модели 0xFC перед первый звонок.
Многие современные операционные системы (например, Linux и Windows NT ) обходят вызовы прерывания BIOS после запуска, ядро ОС переключает ЦП в защищенный режим или длительный режим при запуске, предпочитая использовать свои собственные программы (например, драйверы ядра ) для управления подключенное оборудование напрямую. Причина этого заключалась прежде всего в том, что эти операционные системы запускают процессор в защищенном режиме или в длительном режиме, тогда как для вызова прерывания BIOS требуется переключение в реальный режим или нереальный режим или использование режима Virtual 8086 . Реальный режим, нереальный режим и виртуальный режим 8086 работают медленно. Однако существуют также серьезные причины для безопасности, чтобы не переключаться в реальный режим, а код BIOS реального режима имеет ограничения как по функциональности, так и по скорости, что побуждает разработчиков операционной системы искать ему замену. Фактически, ограничения скорости BIOS сделали его обычным даже в эпоху DOS, чтобы программы обходили его, чтобы избежать ограничений производительности, особенно для отображения видеографики и быстрой последовательной связи. Проблемы с функциональностью BIOS включают ограничения в диапазоне определенных функций, несогласованность в подмножествах этих функций, поддерживаемых на разных компьютерах, и различия в качестве BIOS (то есть некоторые BIOS являются полными и надежными, другие сокращены и содержат ошибки). Взяв дело в свои руки и не полагаясь на BIOS, разработчики операционных систем могут устранить некоторые риски и сложности, с которыми они сталкиваются при написании и поддержке системного программного обеспечения. С другой стороны, поступая таким образом, разработчики берут на себя ответственность за предоставление программного обеспечения драйверов «на чистом железе» для каждой системы или периферийного устройства, с которыми они намерены работать в своей операционной системе (или за побуждение производителей оборудования предоставлять эти драйверы). Таким образом, должно быть очевидно, что компактные операционные системы, разработанные с небольшим бюджетом, будут, как правило, активно использовать BIOS, в то время как большие операционные системы, созданные огромными группами инженеров-программистов с большими бюджетами, чаще предпочитают писать свои собственные драйверы вместо использования BIOS, то есть , даже без учета проблем совместимости BIOS и защищенного режима.
Читайте также: