Вызовы прерывания 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 выполняют обычно определенные функции, а конкретные детали того, как эти функции выполняются на конкретном оборудовании системы, инкапсулируются в 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 предоставляет дополнительные возможности, которые реализованы в программном обеспечении BIOS. Например, BIOS поддерживает отдельные позиции курсора для восьми страниц текстового дисплея и обеспечивает вывод, подобный TTY, с автоматическим переносом строки и интерпретацией основных управляющих символов, таких как возврат каретки и перевод строки, в то время как CGA-совместимое оборудование для отображения текста имеет только один глобальный курсор дисплея и не может автоматически перемещать курсор, использовать позицию курсора для адресации памяти дисплея (чтобы определить, какая символьная ячейка будет изменена или исследована) или интерпретировать управляющие символы. В качестве другого примера интерфейс клавиатуры BIOS интерпретирует множество нажатий клавиш и комбинаций клавиш для отслеживания различных состояний сдвига (левый и правый Shift , Ctrl и Alt ), чтобы вызывать службу экрана печати при нажатии Shift + PrtScrn для перезагрузки. система при нажатии Ctrl + Alt + Del отслеживает состояния блокировки (Caps Lock, Num Lock и Scroll Lock) и, в машинах класса AT, контролирует соответствующие индикаторы состояния блокировки на клавиатуре, и для выполнения других аналогичных функций интерпретации и управления для клавиатуры. Напротив, обычные возможности стандартного аппаратного обеспечения ПК и клавиатуры PC-AT ограничиваются сообщением в систему о каждом примитивном событии нажатия или отпускания отдельной клавиши (т. Е. Переход из состояния «отпущено» в состояние «нажато». состояние или наоборот), выполняя командную перезагрузку и самопроверку клавиатуры, а для клавиатур класса AT - выполняя команду от хост-системы для установки абсолютных состояний индикаторов состояния блокировки (светодиодов).
Вызов BIOS: программные прерывания BIOS
Операционные системы и другое программное обеспечение взаимодействуют с программным обеспечением BIOS для управления установленным оборудованием через программные прерывания. Программное прерывание - это особая разновидность общей концепции прерывания. Прерывание - это механизм, с помощью которого ЦП может быть направлен на то, чтобы остановить выполнение основной программы и вместо этого немедленно выполнить специальную программу, называемую процедурой обслуживания прерывания (ISR). После завершения ISR ЦП продолжает выполнение основной программы. В процессорах x86, когда происходит прерывание, ISR для вызова находится в таблице адресов начальной точки ISR (называемых «векторами прерывания») в памяти: таблица векторов прерываний (IVT). Прерывание вызывается по номеру его типа от 0 до 255, номер типа используется в качестве индекса в таблице векторов прерываний, и по этому индексу в таблице находится адрес ISR, который будет запущен в ответ на прерывание. Программное прерывание - это просто прерывание, которое запускается программной командой; поэтому программные прерывания функционируют как подпрограммы, с той разницей, что программе, которая выполняет вызов программного прерывания, не требуется знать адрес ISR, а только номер прерывания. Это дает преимущества модульности, совместимости и гибкости конфигурации системы.
Вызовы прерывания BIOS можно рассматривать как механизм передачи сообщений между BIOS и клиентским программным обеспечением BIOS, например операционной системой. Сообщения запрашивают данные или действие из BIOS и возвращают запрашиваемые данные, информацию о состоянии и / или результат запрошенного действия вызывающему. Сообщения разбиты на категории, каждая из которых имеет собственный номер прерывания, и большинство категорий содержат подкатегории, называемые «функциями» и идентифицируемые «номерами функций». Клиент BIOS передает большую часть информации в BIOS в регистрах ЦП и получает большую часть информации обратно таким же образом, но данные, слишком большие для размещения в регистрах, такие как таблицы параметров управления или данные сектора диска для передачи на диск, передаются путем выделения буфера. (т.е. некоторое пространство) в памяти и передача адреса буфера в регистрах. (Иногда несколько адресов элементов данных в памяти могут передаваться в структуре данных в памяти, причем адрес этой структуры передается в BIOS в регистрах.) Номер прерывания указывается как параметр инструкции программного прерывания (на языке ассемблера Intel. , инструкция "INT"), а номер функции указывается в регистре AH; то есть вызывающий устанавливает регистр AH на номер желаемой функции. В общем, службы BIOS, соответствующие каждому номеру прерывания, работают независимо друг от друга, но функции внутри одной службы прерывания обрабатываются одной и той же программой BIOS и не являются независимыми. (Последний пункт имеет отношение к повторному вхождению .)
Программное обеспечение 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:
mov ah , 0x0e ; номер функции = 0eh: символьный дисплей мы ал , «!» ; AL = код символа для отображения int 0x10 ; вызов INT 10h, видеосервис BIOS
Таблица прерываний
Список общих классов прерываний BIOS можно найти ниже. Обратите внимание, что некоторые BIOS (особенно старые) не реализуют все эти классы прерываний.
BIOS также использует некоторые прерывания для передачи прерываний аппаратных событий программам, которые выбирают их получение или маршрутизацию сообщений для собственного использования. В таблице ниже представлены только те прерывания BIOS, которые предназначены для вызова программами (с использованием инструкции программного прерывания на языке ассемблера "INT") для запроса услуг или информации.
Вектор прерывания | Описание | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
05h | Выполняется при нажатии клавиши Shift- Print screen , а также при BOUND обнаружении инструкцией сбоя привязки. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
08h | Это прерывание часов реального времени. Срабатывает 18,2 раза в секунду. BIOS увеличивает счетчик времени суток во время этого прерывания. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
09h | Это прерывание клавиатуры. Обычно это срабатывает при нажатии клавиши на клавиатуре. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10h | Видео услуги
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11h | Список возвращаемого оборудования | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12h | Вернуть условный размер памяти | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13h | Низкоуровневые дисковые службы
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14h | Услуги последовательного порта
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15h | Разные системные услуги
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16h | Услуги клавиатуры
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17h | Услуги печати
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18h | Выполнить Cassette BASIC : на машинах IBM до первой линии PS / 2 это прерывание запускало ROM Cassette BASIC. Клоны не имели этой функции, и разные машины / BIOS выполняли бы множество различных действий, если бы выполнялся INT 18h, чаще всего это сообщение об ошибке, указывающее, что загрузочный диск отсутствует. Современные машины попытаются загрузиться из сети через это прерывание. На современных машинах это прерывание будет обрабатываться BIOS как сигнал от загрузчика о том, что он не смог выполнить свою задачу. Затем BIOS может предпринять соответствующие шаги. [3] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19h | После POST это прерывание используется BIOS для загрузки операционной системы. Программа может вызвать это прерывание для перезагрузки компьютера (но должна гарантировать, что аппаратные прерывания или операции DMA не приведут к зависанию или сбою системы во время повторной инициализации системы BIOS или процесса загрузки). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ah | Службы часов реального времени
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ah | Службы PCI - реализованы BIOS, поддерживающей PCI 2.0 или новее
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Bh | Ctrl-Break обработчик - вызывается , INT 09 когда Ctrl- Перерыв был нажат | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ch | Обработчик тиков таймера - вызывается INT 08 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Dh | Не называться; просто указатель на VPT (таблица параметров видео), которая содержит данные о видеорежимах | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Eh | Не называться; просто указатель на DPT (Таблица параметров дискет), содержащий различную информацию о дисководах для дискет. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Fh | Не называться; просто указатель на VGCT (Таблица символов видеографики), которая содержит данные для символов ASCII 80h дляFFh | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
41h | Указатель адреса: FDPT = Таблица параметров фиксированного диска (1-й жесткий диск) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
46h | Указатель адреса: FDPT = Таблица параметров фиксированного диска (2-й жесткий диск) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4Ah | Вызывается RTC для тревоги |
INT 18h
: выполнить BASIC
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, если быть точным].)
По прошествии времени, и BASIC больше не поставлялся на всех ПК, это прерывание просто отображало сообщение об ошибке, указывающее на то, что загрузочный том не был найден (как известно, «No ROM BASIC» или другие пояснительные сообщения в более поздних версиях BIOS); в других версиях BIOS пользователю предлагалось вставить загрузочный том и нажать клавишу, а затем после того, как пользователь нажал клавишу, он возвращался к загрузчику начальной загрузки (INT 19h), чтобы попытаться снова загрузиться.
Компания Digital Rainbow 100 B INT 18h
называла свой BIOS, несовместимый с IBM BIOS. Turbo Pascal , Turbo C и Turbo C ++ перепрофилировали INT 18 для выделения памяти и подкачки. Другие программы также повторно использовали этот вектор в своих целях.
Перехватчики BIOS
ДОС
В системах DOS IO.SYS или IBMBIO.COM перехватывают INT 13 для обнаружения смены гибких дисков, отслеживания вызовов форматирования, исправления ошибок границ DMA и решения проблем в BIOS ROM IBM "01/10/84" с кодом модели 0xFC перед первый звонок.
Обход BIOS
Многие современные операционные системы (например, Linux и Windows NT ) обходят вызовы прерывания BIOS после запуска, ядро ОС переключает ЦП в защищенный режим или длительный режим при запуске, предпочитая использовать свои собственные программы (например, драйверы ядра ) для управления подключенное оборудование напрямую. Причина этого заключалась в первую очередь в том, что эти операционные системы запускают процессор в защищенном режиме или в длительном режиме, тогда как для вызова прерывания BIOS требуется переключение в реальный режим или нереальный режим или использование режима Virtual 8086 . Реальный режим, нереальный режим и виртуальный режим 8086 работают медленно. Однако существуют также серьезные причины для безопасности, чтобы не переключаться в реальный режим, а код BIOS реального режима имеет ограничения как по функциональности, так и по скорости, что побуждает разработчиков операционной системы искать ему замену. Фактически, ограничения скорости BIOS сделали его обычным даже в эпоху DOS, чтобы программы обходили его, чтобы избежать ограничений производительности, особенно для отображения видеографики и быстрой последовательной связи. Проблемы с функциональностью BIOS включают ограничения в диапазоне определенных функций, несогласованность в подмножествах этих функций, поддерживаемых на разных компьютерах, и различия в качестве BIOS (то есть некоторые BIOS являются полными и надежными, другие сокращены и содержат ошибки). Взяв дело в свои руки и не полагаясь на BIOS, разработчики операционных систем могут устранить некоторые риски и сложности, с которыми они сталкиваются при написании и поддержке системного программного обеспечения. С другой стороны, поступая таким образом, разработчики берут на себя ответственность за предоставление программного обеспечения драйверов «на чистом железе» для каждой системы или периферийного устройства, с которыми они намерены работать в своей операционной системе (или за побуждение производителей оборудования предоставлять эти драйверы). Таким образом, должно быть очевидно, что компактные операционные системы, разработанные с небольшим бюджетом, будут, как правило, активно использовать BIOS, в то время как большие операционные системы, созданные огромными группами инженеров-программистов с большими бюджетами, чаще предпочитают писать свои собственные драйверы вместо использования BIOS, то есть , даже без учета проблем совместимости BIOS и защищенного режима.
Смотрите также
- Вызов прерывания DOS
- Таблица дескрипторов прерываний
- Базовый адрес ввода / вывода
- Список прерываний Ральфа Брауна
Рекомендации
- ^ «Загрузка · Linux Inside» . 0xax.gitbooks.io . Проверено 10 ноября 2020 .
- ^ https://www.slideshare.net/mobile/MikeWang45/grub2-booting-process
- ^ * Спецификация загрузки BIOS Версия 1.01 11 января 1996 г. Приложение D
- Список прерываний x86 (он же RBIL, список прерываний Ральфа Брауна)
- Руководство пользователя встроенного BIOS
- PhoenixBIOS 4.0 Руководство пользователя
- IBM Personal System / 2 и технический справочник по интерфейсу BIOS персонального компьютера , IBM, 1988 г., OCLC 20737442
- Системная BIOS для компьютеров IBM, совместимых устройств и компьютеров EISA , Phoenix Technologies , 1991 г., ISBN 0201577607
- Руководство программиста по AMIBIOS , American Megatrends , 1993, ISBN 0070015619
- Справочник программиста для ПК Тома Хогана, Microsoft Press, 1991 ISBN 155615321X