stringtranslate.com

КЕРНАЛ

KERNAL [1] — это название Commodore для ядра операционной системы, резидентного в ПЗУ , на 8-битных домашних компьютерах ; от оригинального PET 1977 года, за которым последовали расширенные, но связанные версии, используемые в его преемниках: VIC-20 , Commodore 64 , Plus/4 , Commodore 16 и Commodore 128 .

Описание

KERNAL 8-битных машин Commodore состоит из низкоуровневых, близких к аппаратным подпрограммам ОС, примерно эквивалентных BIOS в IBM PC-совместимых устройствах (в отличие от подпрограмм интерпретатора BASIC , также расположенных в ПЗУ), а также высокоуровневая, независимая от устройства функциональность ввода-вывода, вызываемая пользователем через таблицу переходов в оперативной памяти, центральная (самая старая) часть которой по соображениям обратной совместимости [2] остается в основном идентичной на протяжении всей 8-битной серии. ПЗУ KERNAL занимает последние 8 КБ 64-КБ адресного пространства 8-битного процессора ($E000–$FFFF).

Таблицу переходов можно изменить так, чтобы она указывала на написанные пользователем процедуры, например, чтобы интегрировать быстрый загрузчик , чтобы его процедуры быстрой замены использовались во всей системе, или заменить системную процедуру вывода текста на ту, которая работает в растровом, а не в символьном режиме. режим. В то время такое использование таблицы переходов было новинкой для маленьких компьютеров. [3]

Игры Adventure International , выпущенные для VIC-20 на картридже, являются примером программного обеспечения, использующего KERNAL. Поскольку они используют только таблицу переходов, игры можно сбрасывать из памяти на диск, загружать в Commodore 64 и запускать без изменений. [4]

KERNAL был первоначально написан для Commodore PET Джоном Фигансом, который предложил идею отделения процедур BASIC от операционной системы. В дальнейшем его доработали несколько человек, в частности Роберт Рассел, который добавил многие функции для VIC-20 и C64.

Пример

Простой, но характерный пример использования KERNAL представлен следующей подпрограммой языка ассемблера 6502 [5] (написанной в формате/синтаксисе ассемблера ca65 ):

 CHROUT = $ffd2; CHROUT — адрес процедуры вывода символов. CR = $0д; Код PETSCII для возврата каретки  ; привет: лдкс #0; начните с символа 0, загрузив 0 в индексный регистр x следующий: lda-сообщение, x ; загрузить байт из адреса message+x в аккумулятор все готово; если аккумулятор содержит ноль, мы закончили и хотим выйти из цикла jsr ЧРОУТ; вызвать CHROUT для вывода символа на текущее устройство вывода (по умолчанию — экран) вход ; увеличьте x, чтобы перейти к следующему символу бне следующий; выполнить цикл назад, пока последний символ не равен нулю (максимальная длина строки 255 байт) сделанный: ртс; возврат из подпрограммы  ; сообщение: .byte " Привет, мир! " .байт CR, 0; Возврат каретки и нулевая отметка конца строки

Эта заглушка кода использует CHROUTпроцедуру, адрес которой находится по адресу $FFD2(65490), для отправки текстовой строки на устройство вывода по умолчанию (например, на экран дисплея).

Имя

KERNAL был известен как kernel [6] внутри Commodore со времен PET, но в 1980 году Роберт Рассел в своих записных книжках неправильно написал это слово как Kernal . Когда технические писатели Commodore Нил Харрис и Энди Финкель собрали заметки Рассела и использовали их в качестве основы для руководства программиста VIC-20, орфографические ошибки последовали за ними и прижились. [7]

Согласно раннему мифу о Коммодоре, о котором среди прочих сообщил писатель и программист Джим Баттерфилд , «слово» KERNAL — это аббревиатура (или, что более вероятно, бэкроним ) , означающая « Чтение с клавиатуры » , « Сеть », «Связь » . , что на самом деле имеет смысл, учитывая его роль. Позднее Berkeley Softworks использовала его, называя основные процедуры своей ОС с графическим интерфейсом для 8-битных домашних компьютеров: GEOS KERNAL.

Об аппаратно-независимом вводе-выводе

Удивительно, но KERNAL реализовал аппаратно-независимый API ввода-вывода, мало чем отличающийся от API Unix или Plan-9 , который, насколько известно, фактически никто не использовал. В то время как в этих последних системах можно было бы разумно утверждать, что «все является файлом», другие могли бы легко утверждать, что в первых «все является GPIB -устройством».

Из-за ограничений архитектуры 6502 того времени для открытия канала ввода-вывода требуется три системных вызова. Первый обычно устанавливает логическое имя файла посредством SETNAMсистемного вызова. Второй вызов SETLFSустанавливает адрес «устройства» GPIB/IEEE-488 для связи. Наконец OPENвызывается для выполнения фактической транзакции. Затем приложение использовало системные вызовы CHKINи CHKOUTдля установки текущих входных и выходных каналов приложения соответственно. Приложения могут иметь любое количество одновременно открытых файлов (вплоть до некоторого ограничения, зависящего от системы; например, C64 позволяет одновременно открывать десять файлов). После этого CHRINони CHROUTокажутся полезными для фактического проведения ввода и вывода соответственно. CLOSEзатем закрывает канал.

Обратите внимание, что не существует системного вызова для «создания» канала ввода-вывода, поскольку в обычных обстоятельствах устройства не могут создаваться или уничтожаться динамически. Аналогично, в Unix не существует средств для поиска и выполнения функций «управления вводом-выводом», таких как ioctl (). Действительно, здесь KERNAL оказывается гораздо ближе к философии Plan-9, где приложение открывает специальный «командный» канал для указанного устройства для проведения таких «мета» или «внеполосных» транзакций. Например, чтобы удалить («стереть») файл с диска, пользователь обычно «открывает» ресурс, вызываемый S0:THE-FILE-TO-RMVна устройстве 8 или 9, канал 15. Согласно установленному соглашению в 8-битном мире Commodore канал 15 представляет «командный канал» для периферийных устройств, основанный на методах передачи сообщений для передачи как команд, так и результатов, включая исключительные случаи. Например, в Commodore BASIC они могут найти программное обеспечение, похожее на следующее:

 В НАСТОЯЩЕЕ ВРЕМЯ ОТКРЫТО НА ЛОГИЧЕСКОМ КАНАЛЕ №1 70 ... 80 REM ROTATE ЖУРНАЛОВ. 90 ЗАКРЫТЬ 1 100 ОТКРЫТЬ 15 , 8 , 15 , "R0:ERROR.1=0:ERROR.0" : REM ПЕРЕИМЕНОВАТЬ ФАЙЛ ERROR.0 В ERROR.1 110 INPUT# 15 , A , B$ , C , D : REM ЧТЕНИЕ ОШИБКИ КАНАЛА 120 ЗАКРЫТЬ 15 130 IF A = ​​0 THEN GOTO 200 140 ПЕЧАТЬ «ОШИБКА ПЕРЕИМЕНОВАНИЯ ФАЙЛА ЖУРНАЛА:» 150 ПЕЧАТЬ « КОД: » + A 160 ПЕЧАТЬ « СООБЩЕНИЕ : » + B$ 170 КОНЕЦ 200 REM ПРОДОЛЖИТЕ ОБРАБОТКУ ЗДЕСЬ, СОЗДАНИЕ НОВОГО ФАЙЛ ЖУРНАЛА КАК МЫ ИДЕМ... 210 ОТКРЫТЬ 1 , 8 , 1 , "0:ERROR.0,S,W" 220 ...                                       

Номера устройств согласно установленной документации ограничены диапазоном [0,16]. Однако это ограничение возникло в результате специфической адаптации протокола IEEE-488 и, по сути, распространяется только на внешние периферийные устройства. Благодаря векторизации всех соответствующих системных вызовов KERNAL программисты могут перехватывать системные вызовы для реализации виртуальных устройств с любым адресом в диапазоне [32,256]. Возможно, можно загрузить двоичный файл драйвера устройства в память, исправить векторы ввода-вывода KERNAL, и с этого момента можно будет обращаться к новому (виртуальному) устройству. До сих пор эта возможность никогда не была публично известна как используемая, предположительно по двум причинам: (1) KERNAL не предоставляет средств для динамического выделения идентификаторов устройств и (2) KERNAL не предоставляет средств для загрузки перемещаемого двоичного образа. Таким образом, бремя коллизий как в пространстве ввода-вывода, так и в пространстве памяти ложится на пользователя, а совместимость платформ на широком спектре машин ложится на автора программного обеспечения. Тем не менее, при желании можно легко внедрить вспомогательное программное обеспечение для этих функций.

Форматы логических имен файлов обычно зависят от конкретного устройства. Наиболее распространенным используемым устройством, конечно же, является система гибких дисков, в которой используется формат, аналогичный MD:NAME,ATTRS, где M — своего рода флаг ($ для списка каталогов, @ для обозначения желания перезаписать файл, если он уже существует, не используется в противном случае), D — это (необязательный) номер физического диска (0: или 1: для систем с двумя дисками, просто 0: для однодисковых устройств, таких как 1541 и др., который по умолчанию равен 0: если не указан). ), NAME— это имя ресурса длиной до 16 символов (допускается большинство символов, за исключением некоторых специальных символов), а также ATTRSнеобязательный список атрибутов или флагов, разделенных запятыми. Например, если пользователь хочет перезаписать файл программы с именем PRGFILE, он может увидеть имя файла, подобное @0:PRGFILE,Pиспользуемому в сочетании с устройством 8 или 9. Между тем, имя файла для драйвера RS-232 (устройство 2) состоит просто из четырех символов, закодированных в двоичном формате. [8]

Другие устройства, такие как клавиатура (устройство 0), кассета (устройство 1), интерфейс дисплея (устройство 3) и принтер (устройства 4 и 5), для работы не требуют имен файлов, либо предполагая разумные значения по умолчанию, либо просто не нуждаясь в них. совсем.

Примечания

  1. ^ Справочное руководство программиста Commodore 64 . Commodore Business Machines, Inc., 1982, с. 268
  2. ^ Таблица переходов KERNAL, используемая для доступа ко всем подпрограммам в KERNAL, представляет собой массив инструкций JMP (перехода), ведущих к реальным подпрограммам. Эта функция обеспечивает совместимость с программным обеспечением, написанным пользователем, в случае, если код ПЗУ KERNAL необходимо переместить в более поздней версии.
  3. ^ «Исследование VIC-20». Январь 1983 года.
  4. ^ Кевелсон, Мортон (январь 1986 г.). «Синтезаторы речи для компьютеров Commodore / Часть II». Эй! . п. 32 . Проверено 17 июля 2014 г.
  5. ^ Многие из подпрограмм KERNAL (например, OPEN и CLOSE) переносились через третью страницу в оперативной памяти, что позволяло программисту перехватывать связанные вызовы KERNAL и добавлять или заменять исходные функции.
  6. ^ Ядро — это наиболее фундаментальная часть программы, обычно операционной системы, которая постоянно находится в памяти и предоставляет основные службы . Это часть операционной системы, которая находится ближе всего к машине и может активировать оборудование напрямую или взаимодействовать с другим программным уровнем, который управляет оборудованием.
  7. ^ На грани: захватывающий взлет и падение Коммодора , страница 202.
  8. ^ Справочное руководство для программистов Commodore 128 , Commodore Business Machines, Inc., 1986, стр. 382

Внешние ссылки