КЕРНАЛ - Википедия - KERNAL

КЕРНАЛ[1] является Коммодор имя для ПЗУ -резидент Операционная система ядро в его 8 бит домашние компьютеры; из оригинала ДОМАШНИЙ ПИТОМЕЦ 1977 года, за которым последовали расширенные, но тесно связанные версии, используемые в его преемниках: VIC-20, Коммодор 64, Плюс / 4, C16, и C128.

Описание

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

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

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

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

Пример

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

   CHROUT = $ ffd2; CHROUT - адрес процедуры вывода символов CR = $ 0d; PETSCII код возврата каретки; привет: ldx # 0; начните с символа 0, загрузив 0 в индексный регистр x, затем: lda message, x; загрузить байт из адресного сообщения + x в аккумулятор beq done; если аккумулятор содержит ноль, мы закончили и хотим выйти из цикла jsr CHROUT; вызвать CHROUT для вывода символа на текущее устройство вывода (по умолчанию на экран) inx; увеличить x, чтобы перейти к следующему символу bne next; цикл назад, пока последний символ не равен нулю (максимальная длина строки 255 байт) done: rts; возврат из подпрограммы; сообщение: .byte "Привет, мир! ".byte CR, 0; возврат каретки и нулевое обозначение конца строки

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

Название

КЕРНАЛ был известен как ядро[6] внутри Commodore со времен ПЭТ, но в 1980 году Роберт Рассел неправильно написал это слово как ядро в своих записных книжках. Когда технические писатели Commodore Нил Харрис и Энди Финкель собрали записи Рассела и использовали их в качестве основы для руководства программиста VIC-20, неправильное написание последовало за ними и застряло.[7]

Согласно раннему мифу о коммодоре, о котором сообщил писатель / программист Джим Баттерфилд среди прочего, "слово" KERNAL - это аббревиатура (или, что более вероятно, backronym ) означает Kборт Eпопытка рead Network Аnd Lчернила, что на самом деле имеет смысл, учитывая его роль. Berkeley Softworks позже использовал его при названии основных процедур своей ОС с графическим интерфейсом для 8-битных домашних компьютеров: GEOS КЕРНАЛ.

На независимом от устройства вводе-выводе

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

Из-за ограничений архитектуры 6502 в то время для открытия канала ввода-вывода требуется три системных вызова. Первый обычно устанавливает логическое имя файла через СЕТНАМ системный вызов. Второй звонок, SETLFS, устанавливает адрес «устройства» GPIB / IEEE-488 для связи. Ну наконец то ОТКРЫТО вызывается для выполнения фактической транзакции. Затем приложение использовало ЧКИН и ЧКОУТ системные вызовы для установки текущих входных и выходных каналов приложения соответственно. Приложения могут иметь любое количество одновременно открытых файлов (до некоторого системно-зависимого ограничения; например, C64 позволяет открывать десять файлов одновременно). После этого CHRIN и CHROUT оказались полезными для фактического проведения ввода и вывода соответственно. ЗАКРЫТЬ затем закрывает канал.

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

    70 ...    80 УДАЛЕННОЕ ВРАЩЕНИЕ ЖУРНАЛОВ, В НАСТОЯЩЕЕ ВРЕМЯ ОТКРЫТО НА ЛОГИЧЕСКОМ КАНАЛЕ №1.    90 ЗАКРЫТЬ 1    100 ОТКРЫТО 15,8,15,«R0: ERROR.1 = 0: ERROR.0»:УДАЛИТЬ ПЕРЕИМЕНОВАТЬ ФАЙЛ ERROR.0 TO ERROR.1    110 ВХОД# 15,А,Млрд долларов,C,D:УДАЛИТЬ КАНАЛ.    120 ЗАКРЫТЬ 15    130 ЕСЛИ А=0 ТОГДА ИДТИ К 200    140 РАСПЕЧАТАТЬ "ОШИБКА ПЕРЕИМЕНОВАНИЯ ФАЙЛА ЖУРНАЛА:"    150 РАСПЕЧАТАТЬ "КОД:"+А    160 РАСПЕЧАТАТЬ "MSG:"+Млрд долларов    170 КОНЕЦ    200 REM ПРОДОЛЖАЙТЕ ОБРАБОТКУ ЗДЕСЬ, СОЗДАВАЯ НОВЫЙ ФАЙЛ ЖУРНАЛА ПО ВРЕМЕНИ ...    210 ОТКРЫТО 1,8,1,"0: ОШИБКА.0; S, W"    220 ...

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

Форматы логических файлов зависят от конкретного устройства. Самым распространенным устройством, конечно же, является система гибких дисков, которая использует формат, аналогичный MD: NAME, ATTRS, где M - это своего рода флаг ($ для списка каталогов, @ для обозначения желания перезаписать файл, если он уже существует, в противном случае не используется.), D - (необязательный) номер физического диска (0: или 1: для системы с двумя приводами, просто 0: для однодисковых устройств, таких как 1541 и др., по умолчанию 0: если не указано), ИМЯ - это имя ресурса длиной до 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 ROM необходимо переместить в более позднюю версию.
  3. ^ «Изучение ВМЦ-20».
  4. ^ Кевелсон, Мортон (январь 1986 г.). «Синтезаторы речи для компьютеров Commodore / Часть II». Эй!. п. 32. Получено 17 июля 2014.
  5. ^ Многие из подпрограмм KERNAL (например, OPEN и CLOSE) были перенесены через третью страницу в RAM, что позволило программисту перехватывать связанные вызовы KERNAL и добавлять или заменять исходные функции.
  6. ^ В ядро является наиболее фундаментальной частью программы, обычно операционной системой, которая постоянно находится в памяти и предоставляет базовые услуги. Это часть операционной системы, которая находится ближе всего к машине и может активировать оборудование напрямую или взаимодействовать с другим программным уровнем, который управляет оборудованием.
  7. ^ На грани: захватывающий взлет и падение Commodore, стр.202.
  8. ^ Справочное руководство программиста Commodore 128, Commodore Business Machines, Inc., 1986, стр. 382

внешняя ссылка