KERNAL [ 1 ] es el nombre que Commodore le da al núcleo del sistema operativo residente en la ROM de sus computadoras domésticas de 8 bits : desde el PET original de 1977, seguido de las versiones extendidas pero relacionadas utilizadas en sus sucesores: el VIC-20 ; Commodore 64 ; Plus/4 ; Commodore 16 ; y Commodore 128 .
Descripción
El KERNAL de las máquinas Commodore de 8 bits consta de las rutinas del sistema operativo de bajo nivel, cercanas al hardware, aproximadamente equivalentes a la BIOS en los PC compatibles con IBM (a diferencia de las rutinas del intérprete BASIC , también ubicadas en la ROM), así como funcionalidades de E/S de nivel superior e independientes del dispositivo. Es invocable por el usuario a través de una tabla de saltos en la RAM cuya parte central (la más antigua), por razones de retrocompatibilidad , [ a ] permanece prácticamente idéntica en toda la serie de 8 bits. La ROM del KERNAL ocupa los últimos 8 KB del espacio de direcciones de 64 KB de la CPU de 8 bits ($E000–$FFFF).
La tabla de saltos se puede modificar para que apunte a rutinas escritas por el usuario, por ejemplo, para integrar un cargador rápido de modo que sus rutinas de reemplazo rápido se utilicen en todo el sistema o para reemplazar la rutina de salida de texto del sistema por una que funcione en modo de mapa de bits en lugar de modo de caracteres. Este uso de una tabla de saltos era novedoso en las computadoras pequeñas de la época. [ 2 ]
Los juegos de Adventure International publicados para el VIC-20 en cartucho son un ejemplo de software que utiliza el KERNAL. Dado que solo utilizan la tabla de saltos, los juegos se pueden volcar a disco, cargar en un Commodore 64 y ejecutar sin modificaciones. [ 3 ]
El kernel fue escrito inicialmente para el Commodore PET por John Feagans, quien introdujo la idea de separar las rutinas BASIC del sistema operativo. Posteriormente, fue desarrollado por varias personas, en particular por Robert Russell, quien añadió muchas de las características para el VIC-20 y el C64.
Ejemplo
Un ejemplo sencillo, pero característico, del uso del KERNAL lo proporciona la siguiente subrutina en lenguaje ensamblador 6502 [ b ] (escrita en formato/sintaxis de ensamblador ca65 ), que implementa el clásico programa "¡ Hola, mundo! ":
CHROUT = $ffd2 ; CHROUT es la dirección de la rutina de salida de caracteres CR = $0d ; Código PETSCII para retorno de carro ; hello: ldx # 0 ; comienza con el carácter 0 cargando 0 en el registro de índice x next: lda message , x ; carga el byte de la dirección message+x en el acumulador beq done ; si el acumulador contiene cero, hemos terminado y queremos salir del bucle jsr CHROUT ; llama a CHROUT para enviar el carácter al dispositivo de salida actual (por defecto, la pantalla) inx ; incrementa x para pasar al siguiente carácter bne next ; vuelve al bucle mientras el último carácter no sea cero (longitud máxima de la cadena 255 bytes) done: rts ; regresa de la subrutina ; message: .byte "¡Hola, mundo!" .byte CR , 0 ; Retorno de carro y cero que marca el final de la cadenaNótese el uso del código PETSCII para el retorno de carro , el registro de índice x y el acumulador . Este fragmento de código utiliza la CHROUTrutina, cuya dirección se encuentra en la dirección $FFD2(65490), para enviar una cadena de texto al dispositivo de salida predeterminado (por ejemplo, la pantalla).
El nombre
El KERNAL era conocido como kernel [ c ] dentro de Commodore desde los tiempos del PET, pero en 1980 Robert Russell escribió mal la palabra como kernal en sus cuadernos. Cuando los redactores técnicos de Commodore, Neil Harris y Andy Finkel, recopilaron las notas de Russell y las usaron como base para el manual del programador del VIC-20, el error ortográfico los acompañó y se mantuvo. [ 4 ]
Según los primeros mitos sobre Commodore, y como lo reportó el escritor y programador Jim Butterfield, entre otros, la "palabra" KERNAL es un acrónimo (o, más probablemente, un acrónimo inverso ) que significa Keyboard Entry Read , Network , And Link , lo cual es al menos parcialmente creíble considerando su función. Berkeley Softworks lo usó más tarde para nombrar las rutinas principales de su sistema operativo con interfaz gráfica de usuario para computadoras domésticas de 8 bits: GEOS KERNAL.
En E/S independiente del dispositivo
Sorprendentemente, el núcleo implementó una API de E/S independiente del dispositivo, no muy diferente de la de Unix o Plan-9 , que, hasta donde se sabe públicamente, nadie llegó a explotar. Mientras que en estos últimos sistemas se podría argumentar razonablemente que "todo es un archivo", en los primeros se podría afirmar fácilmente que "todo es un dispositivo GPIB ".
Debido a las limitaciones de la arquitectura 6502 en ese momento, abrir un canal de E/S requiere tres llamadas al sistema . La primera normalmente establece el nombre de archivo lógico a través de la SETNAMllamada al sistema. La segunda llamada, SETLFS, establece la dirección del "dispositivo" GPIB/ IEEE-488 con el que comunicarse. Finalmente OPENse llama para realizar la transacción real. La aplicación luego usa las llamadas al sistema CHKINy CHKOUTpara establecer los canales de entrada y salida actuales de la aplicación, respectivamente. Las aplicaciones pueden tener cualquier número de archivos abiertos simultáneamente (hasta algún límite dependiente del sistema; por ejemplo, el C64 permite que se abran diez archivos a la vez). Posteriormente, CHRINy CHROUTresultan útiles para realizar realmente la entrada y la salida, respectivamente. CLOSEluego cierra un canal.
Obsérvese que no existe ninguna llamada al sistema para "crear" un canal de E/S, ya que los dispositivos no se pueden crear ni destruir dinámicamente en circunstancias normales. Del mismo modo, no existe ningún medio para buscar ni para realizar funciones de "control de E/S" como ioctl () en Unix. De hecho, el KERNAL se asemeja mucho más a la filosofía de Plan-9 en este aspecto, donde una aplicación abriría un canal de "comando" especial al dispositivo indicado para realizar transacciones "meta" o "fuera de banda". Por ejemplo, para borrar ("borrar") un archivo de un disco, el usuario normalmente "abrirá" el recurso llamado S0:THE-FILE-TO-RMVen el dispositivo 8 o 9, canal 15. Según la convención establecida en el mundo de Commodore de 8 bits, el canal 15 representa el "canal de comando" para periféricos, que se basa en técnicas de paso de mensajes para comunicar tanto comandos como resultados, incluidos los casos excepcionales. Por ejemplo, en Commodore BASIC , podrían encontrar un software similar al siguiente:
70 ... 80 REM ROTA LOS REGISTROS ACTUALMENTE ABIERTOS EN EL CANAL LÓGICO #1. 90 CERRAR 1 100 ABRIR 15 , 8 , 15 , "R0:ERROR.1=0:ERROR.0" : REM CAMBIAR EL NOMBRE DEL ARCHIVO ERROR.0 A ERROR.1 110 ENTRADA# 15 , A , B$ , C , D : REM LEER EL CANAL DE ERRORES 120 CERRAR 15 130 SI A = 0 ENTONCES IR A 200 140 IMPRIMIR "ERROR CAMBIANDO EL NOMBRE DEL ARCHIVO DE REGISTRO:" 150 IMPRIMIR " CÓDIGO: " ; A 160 PRINT " MSG : " + B$ 170 END 200 REM CONTINUAR PROCESANDO AQUÍ, CREANDO NUEVO ARCHIVO DE REGISTRO A MEDIDA QUE AVANZAMOS... 210 OPEN 1 , 8 , 1 , "0:ERROR.0,S,W" 220 ...Según la documentación establecida, los números de dispositivo están restringidos al rango [0,16]. Sin embargo, esta limitación proviene de la adaptación específica del protocolo IEEE-488 y, en efecto, se aplica solo a periféricos externos. Con todas las llamadas al sistema KERNAL relevantes vectorizadas, los programadores pueden interceptar llamadas al sistema para implementar dispositivos virtuales con cualquier dirección en el rango [32,256]. Es posible cargar un binario de controlador de dispositivo en memoria, modificar los vectores de E/S de KERNAL y, a partir de ese momento, se podría direccionar un nuevo dispositivo (virtual). Hasta ahora, esta capacidad nunca se ha utilizado públicamente, presumiblemente por dos razones: (1) KERNAL no proporciona ningún medio para asignar dinámicamente identificadores de dispositivo, y (2) KERNAL no proporciona ningún medio para cargar una imagen binaria reubicable. Por lo tanto, la responsabilidad de las colisiones, tanto en el espacio de E/S como en el espacio de memoria, recae sobre el usuario, mientras que la compatibilidad de la plataforma en una amplia gama de máquinas recae sobre el autor del software. No obstante, se podría implementar fácilmente software de soporte para estas funciones si se deseara.
Los formatos lógicos de nombres de archivo tienden a depender del dispositivo específico al que se dirigen. El dispositivo más común es el sistema de disquete, que utiliza un formato similar a MD:NAME,ATTRS, donde M es una especie de indicador ($ para listar el directorio, @ para indicar el deseo de sobrescribir un archivo si ya existe, sin uso en caso contrario), D es el número de unidad de disco físico (opcional) (0: o 1: para sistemas de doble unidad, solo 0: para unidades de un solo disco como el 1541, etc., que por defecto es 0: si no se especifica), NAMEes un nombre de recurso de hasta 16 caracteres de longitud (se permiten la mayoría de los caracteres excepto ciertos caracteres especiales), y ATTRSes una lista opcional de atributos o indicadores separados por comas. Por ejemplo, si el usuario quiere sobrescribir un archivo de programa llamado PRGFILE, podría ver un nombre de archivo como @0:PRGFILE,Putilizado junto con el dispositivo 8 o 9. Mientras tanto, un nombre de archivo para el controlador RS-232 (dispositivo 2) consta simplemente de cuatro caracteres, codificados en formato binario. [ 5 ]
Otros dispositivos, como el teclado (dispositivo 0), el casete (dispositivo 1), la interfaz de visualización (dispositivo 3) y la impresora (dispositivos 4 y 5), no requieren nombres de archivo para funcionar, ya sea porque se utilizan valores predeterminados razonables o simplemente porque no los necesitan en absoluto.
Véase también
Notas
- ↑ La tabla de saltos del KERNAL, utilizada para acceder a todas las subrutinas del KERNAL, es una matriz de instrucciones JMP (salto) que conducen a las subrutinas correspondientes. Esta función garantiza la compatibilidad con software escrito por el usuario en caso de que sea necesario reubicar el código dentro de la ROM del KERNAL en una revisión posterior.
- ↑ Muchas de las subrutinas KERNAL (por ejemplo, OPEN y CLOSE) se canalizaban a través de la página tres de la RAM, lo que permitía a un programador interceptar las llamadas KERNAL asociadas y añadir o reemplazar las funciones originales.
- ↑ El núcleo es la parte más fundamental de un programa, normalmente un sistema operativo, que reside en la memoria en todo momento y proporciona los servicios básicos. Es la parte del sistema operativo más cercana a la máquina y puede activar el hardware directamente o interactuar con otra capa de software que lo controla.
Referencias
- ↑ Guía de referencia del programador de Commodore 64. Commodore Business Machines, Inc., 1982, pág. 268.
- ↑ Swank, Joel (enero de 1983). "Explorando el VIC-20" . BYTE .
- ↑ Kevelson, Morton (enero de 1986). "Sintetizadores de voz para ordenadores Commodore / Parte II" . Ahoy! N.º 25, pág. 32. Consultado el 2 de marzo de 2026 .
- ↑ Bagnall, Brian (2006). Al límite: El espectacular ascenso y caída del comodoro . Canadá: Variant Press. pág. 202.
- ↑ Guía de referencia para programadores de Commodore 128 , Commodore Business Machines, Inc., 1986, pág. 382
Bibliografía
- Steil, Michael (17 de febrero de 2018). «Historia del Comodoro KERNAL» . pagetable.com .
Enlaces externos
- Código fuente KERNAL original para todas las máquinas Commodore.
- Utilidad de monitorización de E/S del kernel de Commodore 64
- núcleos de sistemas operativos
- Commodore 64
- ortografía no estándar
- Software de 1977
- Software Commodore