De KERNAL, afgeleid van het woord kernel, is Commodores naam voor zijn eigen in ROM ingebakken besturingssysteem voor de 8-bit thuiscomputers. Dit geldt voor de modellen vanaf de PET uit 1977 tot en met zijn opvolgers, de VIC-20, Commodore 64, Plus/4, C16, C128 en uiteindelijk de nooit uitgebrachte C65. De KERNAL van de 8-bit computers bevat alle low-level, dicht bij de hardware staande OS-routines. Al die routines konden door middel van een jumptabel aangeroepen worden. Om terugwaartse compatibiliteit te garanderen, is deze tabel nagenoeg voor alle modellen hetzelfde gebleven voor alle 8-bitters. De routines zelf zitten voornamelijk in de adresrange ($E000-$FFFF). Bij de Commodore 64 begint de Kernal vanaf $E45F, bij de VIC-20 vanaf $E0F6.
Bij bijna alle Commodore 8-bitters zijn de BASIC interpreter-routines ook in ROM ingebakken. Bij de Commodore 64 bevinden die zich in de adresranges $A000-$BFFF en $E000-$E45E. De hele range van 16 KB is in twee ROM's van het type 2364, elk 8 kB groot, ondergebracht. Dit geldt ook voor de VIC-20. Juist bij deze twee meest bekende computers heeft men het dan ook vaak over de KERNAL-ROM en BASIC-ROM.
De KERNAL is oorspronkelijk geschreven voor de PET door John Feagans, van wie ook het idee afkomstig is om de BASIC-routines volledig van die van het besturingssysteem te scheiden. De KERNAL is daarna door diverse personen verder ontwikkeld, onder andere Robert Russell heeft veel extra's aan de VIC-20 en Commodore 64 toegevoegd. Commodore produceerde naast bovengenoemde computers ook onder andere IBM-PC-compatibele systemen en de wel bekende Amiga. Zowel de pc's als Amiga's waren 16- of 32-bits systemen. Een bewijs dat de Amiga niets met de 8-bitters had te maken is het feit dat er hier sprake is van de Amiga ROM Kernel. Let op de correcte spelling van het woord kernel. Bij pc's spreken we niet van KERNAL maar van BIOS.
Een eenvoudig, maar typisch voorbeeld hoe de KERNAL te gebruiken laat de volgende routine zien, geschreven in 6502-assembly language met de ca65-assemblersyntax:
CHROUT = $ffd2 ; CHROUT zend een teken naar het huidige uitgangskanaal CR = $0d ; PETSCII code voor Carriage Return ; hello: ldx #0 ; start met het eerste teken, tellend vanaf nul next: lda message,x ; lees teken X uit de boodschap, is het een nul? beq done ; ja, dan zijn we klaar, ga naar label 'done'. jsr CHROUT ; zend het teken, standaard is dit het beeldscherm inx ; volgend teken, X = nul? (maximaal 255 tekens) bne next ; nee, herhaal de lus done: rts ; beëindig de subroutine ; message: .byte "Hello, world!" .byte CR, 0 ; Carriage Return en een nul markeren het einde van de boodschap
Dit stukje code roept de CHROUT
routine aan, welke op adres $FFD2
(65490) gevonden kan worden. De routine stuurt een stukje tekst naar het huidige uitgangskanaal. Dat is in de regel het beeldscherm maar kan ook een printer, floppy drive of de RS-232-poort zijn.
De KERNAL werd bij Commodore in eerste instantie ook gewoon kernel genoemd. Maar het verhaal gaat dat in 1980 Robert Russell per ongeluk een schrijffout in zijn notities maakte door kernal op te schrijven. Toen Neil Harris en Andy Finkel Russells notities gebruikten als basis voor het VIC-20 Programmer's Manual, namen zij de spelfout over en deze is bij de opvolgers blijven plakken. Volgens een Commodore-mythe, onder andere vermeld door schrijver en programmeur Jim Butterfield, is KERNAL een acroniem (of aannemelijker, een backroniem) voor Keyboard Entry Read, Network, And Link. Berkeley Softworks gebruikte het woord later ook voor zijn de low-level routines van zijn GUI OS voor 8-bit homecomputers: de GEOS-KERNAL. GEOS is onder andere uitgebracht voor de Commodore 64, C128 en pc.