케르날
KERNALKERNAL은[1] 8비트 가정용 컴퓨터의 ROM 상주 운영 체제 핵심을 가리키는 코모도르의 이름이다. 1977년 원래의 PET에서 나온 이후 후속 제품인 VIC-20, Commodore 64, Plus/4, C16 및 C128에 사용된 확장되었지만 강하게 관련된 버전이 그 뒤를 잇는다.
설명
Commodore 8비트 기계의 KERNAL은 IBM PC 호환 장치의 BIOS와 거의 동등한 낮은 수준의 하드웨어에 가까운 OS 루틴(기본 통역 루틴과 대조적으로 ROM에 위치함)과 더 높은 수준의 장치 독립적인 I/O 기능으로 구성되며, 중앙(가장 오래된) RAM의 점프 테이블을 통해 사용자가 호출할 수 있다.역호환성 때문에,[2] 부품은 전체 8비트 시리즈에서 대체로 동일하다.KERNAL ROM은 8비트 CPU의 64KB 주소 공간($E000–$FFF) 중 마지막 8KB를 차지한다.
점프 테이블은 사용자가 작성한 루틴을 가리키도록 수정할 수 있다. 예를 들어 화면 디스플레이 루틴을 다시 작성하여 애니메이션 그래픽을 표시하거나 문자 집합을 RAM으로 복사하는 것이다.이러한 점프 테이블의 사용은 그 당시 작은 컴퓨터들에게는 새로운 것이었다.[3]
카트리지 상의 VIC-20용으로 출판된 어드벤처 인터내셔널 게임은 KERNAL을 사용하는 소프트웨어의 한 예다.점프 테이블만 사용하기 때문에 게임은 메모리가 디스크에 저장되고 코모도어 64에 로드되며 수정 없이 실행될 수 있다.[4]
KERNAL은 처음에 운영체제에서 BASIC 루틴을 분리하는 아이디어를 도입한 John Feagans에 의해 Commodore PET를 위해 작성되었다.그것은 특히 VIC-20과 C64의 많은 특징들을 추가한 로버트 러셀과 같은 몇몇 사람들에 의해 더욱 발전되었다.
예
KERNAL을 사용하는 간단하지만 특징적인 예는 다음과 같은 6502 어셈블리 언어 서브루틴[5](ca65 어셈블리러 형식/syntax로 작성)에 의해 제시된다.
CROUT = $fd2; CROUT는 문자 출력 루틴 CR = $0d; Carage Return에 대한 PETSCII 코드; hello: ldx #0; 다음 x 색인 레지스터에 0을 로드하여 문자 0으로 시작: lda message,x; 주소 메시지+x에서 바이트 로딩berq done; 만약 축전지가 0을 유지한다면, 우리는 끝났고 루프 jsr CROUT에서 분기하기를 원한다; CROUT를 호출하여 현재 출력 장치로 char를 출력한다(기본값에서 화면까지), increment x를 호출하여 다음 문자 bne으로 이동한다; 마지막 문자가 no인 동안 루프백t 0(최대 문자열 길이 255바이트) 완료: rts; 서브루틴에서 반환; 메시지: .byte "Hello, world!" .byte CR, 0; Carage Return 및 문자열의 0 표시 끝
이 코드 스텁은CHROUT일상, 주소가 주소에서 발견되는 사람$FFD2(65490), 기본 출력 장치(예: 디스플레이 화면)로 텍스트 문자열을 전송하려면
이름
KERNAL은 PET 시절부터 코모도어 내부의 커널로[6] 알려져 있었으나 1980년 로버트 러셀은 그의 노트에 케널이라는 단어의 철자를 잘못 썼다.코모도어 기술작가 닐 해리스와 앤디 핑클이 러셀의 노트를 모아 VIC-20 프로그래머 매뉴얼의 기초로 삼았을 때, 오자가 따라붙어 붙었다.[7]
작가 겸 프로그래머 짐 버터필드가 보도한 초기 코모도어 신화에 따르면, KERNAL이라는 단어는 키보드 입력 읽기, 네트워크 및 링크의 약자어(또는 아마도 더 가능성이 높은 역자어)로, 사실상 그 역할을 고려할 때 이치에 맞는 말이다.버클리 소프트웍스는 나중에 8비트 가정용 컴퓨터용 GUI OS의 핵심 루틴인 GEOS KERNAL을 명명할 때 이 루틴을 사용했다.
디바이스에 독립적인 I/O에서
놀랍게도, KERNAL은 공개적으로 알려진 한 아무도 실제로 이용하지 않는 Unix나 Plan-9의 그것과 완전히 다르지 않은 장치 독립적인 I/O API를 구현했다.후자의 시스템에서는 "모든 것이 파일"이라고 합리적으로 주장할 수 있는 반면, 다른 시스템에서는 "모든 것이 GPIB 장치"라고 쉽게 주장할 수 있다.
당시 6502 아키텍처의 한계로 인해 I/O 채널을 개방하려면 세 번의 시스템 호출이 필요하다.첫째는 일반적으로 다음을 통해 논리 파일 이름을 설정한다.SETNAM시스템 호출두 번째 전화는,SETLFS는 통신할 GPIB/IEEE-488 "장치" 주소를 설정한다.마침내OPEN실제 거래를 수행하기 위해 호출된다.응용 프로그램이 사용됨CHKIN그리고CHKOUT각각 애플리케이션의 전류 입력 및 출력 채널을 설정하기 위한 시스템 호출.애플리케이션에는 동시에 열 수 있는 파일 수가 있을 수 있다(예를 들어 C64는 한 번에 열 개의 파일을 열 수 있도록 허용한다).그 후,CHRIN그리고CHROUT각각 입력과 출력을 실제로 수행하는 데 유용함을 입증한다. CLOSE그런 다음 채널을 닫는다.
정상적인 상황에서 장치를 동적으로 생성하거나 파괴할 수 없기 때문에 I/O 채널을 "만들기" 위한 시스템 호출이 존재하지 않는지 확인하십시오.마찬가지로, 유닉스에서 ioctl()와 같은 "I/O 제어" 기능을 수행하기 위한 수단도 존재하지 않는다.실제로, KERNAL은 응용 프로그램이 지정된 장치에 "메타" 또는 "대역 외" 트랜잭션을 수행하기 위해 특별한 "명령" 채널을 여는 여기서 Plan-9 철학과 훨씬 더 가깝다는 것을 증명한다.예를 들어 디스크에서 파일을 삭제("scratch")하기 위해 사용자는 일반적으로 호출된 리소스를 "open"한다.S0:THE-FILE-TO-RMV8번 또는 9번 장치, 채널 15번.코모도어 8비트 세계에서 확립된 관례에 따라 채널 15는 예외적인 경우를 포함하여 명령과 결과를 모두 전달하기 위한 메시지 전달 기법에 의존하여 주변 장치를 위한 "명령 채널"을 나타낸다.예를 들어, Commodore BASIC에서는 다음과 다르지 않은 소프트웨어를 찾을 수 있다.
70 ... 80 REM 회전 로그가 현재 논리 채널 #1에서 열려 있음. 90 가까운. 1 100 오픈 15,8,15,"R0:ERROR.1=0:ERROR.0":REM 파일 이름 바꾸기 오류.0에서 오류.1로 110 입력# 15,A,B$,C,D:REM 읽기 오류 채널 120 가까운. 15 130 IF A=0 그럼 에 가다 200 140 프린트 "오류 이름 변경 로그 파일:" 150 프린트 "코드: "+A 160 프린트 " MSG : "+B$ 170 끝 200 렘 여기서 계속 처리 중, 진행 중인 새 로그 파일 작성 중... 210 오픈 1,8,1,"0:ERROR.0,S,W" 220 ... 확립된 문서에 따라 기기 번호는 [0,16] 범위로 제한된다.그러나 이러한 제한은 IEEE-488 프로토콜의 특정 적응에서 비롯되었으며, 사실상 외부 주변 장치에만 적용된다.모든 관련 KERNAL 시스템 호출이 제어된 상태에서 프로그래머는 [32,256] 범위의 주소를 가진 가상 장치를 구현하기 위한 시스템 호출을 가로챌 수 있다.기기 드라이버 바이너리를 메모리에 로드하고 KERNAL I/O 벡터를 패치할 수 있으며, 그 순간부터 새로운 (가상) 장치를 처리할 수 있다.지금까지 이 기능은 공개적으로 이용된 것으로 알려진 적이 없으며, 추정컨대 (1) KERNAL은 장치 ID를 동적으로 할당하기 위한 수단을 제공하지 않으며, (2) KERNAL은 다시 연결 가능한 이진 이미지를 로드하기 위한 수단을 제공하지 않는다.따라서 I/O 공간과 메모리 공간 모두에서 충돌에 대한 부담은 사용자에게, 광범위한 기계에 걸친 플랫폼 호환성은 소프트웨어 작성자에게로 떨어진다.그럼에도 불구하고, 이러한 기능에 대한 지원 소프트웨어는 원할 경우 쉽게 구현될 수 있다.
논리 파일 이름 형식은 지정된 특정 장치에 따라 달라지는 경향이 있다.물론 가장 많이 사용되는 기기는 플로피 디스크 시스템인데, 플로피 디스크 시스템에서는 이와 비슷한 형식을 사용한다.MD:NAME,ATTRS여기서 M은 (디렉토리 목록을 위한 플래그, 파일이 이미 있는 경우 덮어쓰기를 원하는 경우 @), D는 물리적 디스크 단위 번호(듀얼 드라이브 시스템의 경우 0: 또는 1:만, 1541과 같은 싱글 디스크 장치의 경우 0: 기본값이 지정되지 않은 경우 0:로 지정됨),NAME최대 16자까지의 리소스 이름(특정 문자를 제외하고 대부분의 문자 사용 가능) 및ATTRS속성 또는 플래그의 쉼표로 구분된 선택적 목록이다.예를 들어 사용자가 프로그램 파일을 덮어쓰려는 경우PRGFILE, 그들은 다음과 같은 파일 이름을 볼 수 있다.@0:PRGFILE,P장치 8 또는 9와 함께 사용됨.한편, RS-232 드라이버(장치 2)의 파일 이름은 이진 형식으로 인코딩된 4개의 문자로 구성된다.[8]
키보드(기기 0), 카세트(기기 1) 디스플레이 인터페이스(기기 3) 및 프린터(기기 4와 5)와 같은 기타 장치는 파일 이름을 요구하지 않고, 합리적인 기본값을 가정하거나 전혀 필요하지 않다.
메모들
- ^ Commodore 64 프로그래머 참조 가이드.Commodore Business Machines, Inc., 1982, 페이지 268
- ^ KERNAL의 모든 서브루틴에 액세스하는 데 사용되는 KERNAL 점프 테이블은 실제 서브루틴으로 이어지는 JMP(점프) 지침의 배열이다.이 기능은 KERNAL ROM 내의 코드를 이후 개정으로 재배치할 필요가 있는 경우 사용자가 작성한 소프트웨어와의 호환성을 보장한다.
- ^ "Exploring the VIC-20".
- ^ Kevelson, Morton (January 1986). "Speech Synthesizers for the Commodore Computers / Part II". Ahoy!. p. 32. Retrieved 17 July 2014.
{{cite news}}: CS1 maint : url-status (링크) - ^ 많은 KERNAL 서브루틴(예: OPEN 및 CLOSE)이 RAM의 3페이지를 통해 벡터링되어 프로그래머가 관련 KERNAL 호출을 가로채고 원래의 기능에 추가하거나 교체할 수 있게 되었다.
- ^ 커널은 프로그램의 가장 근본적인 부분, 즉 일반적으로 운영체제로, 항상 메모리에 상주하며 기본적인 서비스를 제공하는 부분이다.그것은 기계와 가장 가까운 운영체제의 부분이며 하드웨어를 구동하는 다른 소프트웨어 계층에 직접 또는 인터페이스를 활성화할 수 있다.
- ^ 가장자리: 코모도르의 눈부신 흥망성쇠, 202페이지.
- ^ Commodore 128 프로그래머 참조 가이드, Commodore Business Machines, Inc., 1986, 페이지 382