user: 모토로라 68000의 아키텍처에 대해 설명해 주세요.

gpt: ## 어드레스 버스
68000은 24비트의 외부 어드레스 버스를 가지고 있지만 A0 핀은 2가지 바이트 선택 신호로 대체할 수 있기 때문에 16 MB의 실제 메모리를 바이트 단위로 이용 가능하다. 어드레스의 저장과 계산은 32비트지만 핀 부족으로 상위 바이트는 무시된다. 또한 32비트의 플랫 메모리 공간을 사용하는 소프트웨어를 실행할 수 있는데 현대적인 정의로 이것은 68000이 32비트 마이크로프로세서라는 의미가 된다. 모토로라가 내부 32비트 어드레스를 채용한 의도는 소프트웨어 작성에서 상위 호환성을 염두에 둔 것이다.

하지만 이점은 프로그래머들이 호환성없는 프로그램을 제작하는 것을 예방하지는 못했다. 24비트 소프트웨어는 상위 어드레스 바이트를 무시하거나 어드레싱 용도외에 다른 용도로 사용되었기 때문에 32비트 68K에서는 실행할 수 없었다.

## 내부 레지스터
68000에는 32비트 범용 데이터 레지스터 8개와 어드레스 레지스터 8개가 있는데 마지막 A7 어드레스 레지스터는 스택 포인터로도 사용된다. 내장된 레지스터 수는 여러 가지로 적당한 숫자였는데 68000이 인터럽트에 재빨리 응답하기에 충분한 정도로 작고 대부분의 연산을 빠르게 실행하는데 충분한 만큼 컸다.

데이터와 어드레스 2종류의 레지스터는 당시에는 생소한 것이었지만 배우고 사용하는데 어렵지는 않았다. 들리는 바에 따르면 데이터와 어드레스를 나눔으로서 설계자들이 더 높은 수준으로 어드레스 레지스터 보조 실행 유닛의 병렬화를 설계하는데 기여했다고 한다. 또 68000 시리즈의 정수 표시는 빅엔디언 방식을 사용한다.

## 상태 레지스터
68000은 비교, 산술 연산과 논리 연산에서 그 결과를 상태 레지스터에 비트 플래그로 설정해 나중에 조건 분기에서 사용할 수 있다. 비트 플래그에는 e**X**tend, **N**egative, **Z**ero, o**V**erflow, **C**arry 가 있다. 이중 eXtend 플래그는 다정밀도의 산술 연산과 논리, 시프트 연산에서 특별한 비트로 사용된다.

## 명령어 셋
설계자들은 어셈블리어가 직교성을 가지도록 시도하였다. 명령어는 오퍼랜드와 어드레스 모드로 구별되며 대부분의 어드레스 모드는 모든 명령어를 사용할 수 있다. 비트 레벨에서 어셈블러로 작성된 명령어가 어떤 오프코드로 변환되는지 명확히 알 수 있는데 이것은 직교성 있는 머신으로의 편의성과 CPU 설계자들이 오프코드 표를 자유롭게 작성하는데 좋은 타협점이 되었다.

56개의 명령어만이 최소 크기의 명령어로 당시에는 거대한 16비트 크기였다. 더군다나 많은 명령어와 어드레스 모드에는 어드레스와 어드레스 모드 비트등을 담은 여분의 워드를 추가로 사용한다. 많은 설계자들은 MC68000 아키텍처가 비용에 걸맞은 컴팩트한 코드를 생성한다고 믿고 있었는데 이 컴팩트한 코드에 대한 믿음은 아키텍처가 널리 오랫동안 사용하게 되는데 도움이 되었다. 이러한 믿음 혹은 특징은 ARM 아키텍처의 썸 명령어 셋이 발표될 때까지 계속 이어졌다.

## 특권 레벨
이 CPU와 이후 모든 시리즈는 2종류의 특권 레벨을 가지는데 유저 레벨은 인터럽트 레벨의 컨트롤을 제외한 모든 액세스가 가능하며 슈퍼바이저 레벨은 모든 액세스가 가능하다. 인터럽트가 발생하면 슈퍼바이저 모드로 변경된다. 슈퍼바이저 비트는 상태 레지스터에 저장되며 유저 프로그램에서 볼 수 있다.

이 시스템의 장점으로 슈퍼바이저 레벨은 별도의 스택 포인터를 가진다는 점이다. 이것은 멀티태스킹 시스템에서 작업에 사용되는 스택의 크기를 줄일 수 있는데 설계자가 인터럽트의 최대 스택 프레임을 고려해 메모리를 할당할 필요가 없었다.

## 인터럽트
이 CPU에는 7단계의 인터럽트 레벨이 있는데 레벨 1에서 7까지 우선권이 있다. 높은 숫자의 인터럽트는 낮은 숫자의 인터럽트에 언제나 끼어들 수 있다. 상태 레지스터에서 특권 명령어로 인터럽트 레벨을 설정할 수 있으며 낮은 우선권을 가진 인터럽트는 차단할 수 있다. 인터럽트 레벨 7은 NMI로 끼어들거나 차단할 수 없다. 인터럽트 레벨은 상태 레지스터에 저장되며 유저 레벨의 프로그램으로 볼 수 있다.

하드웨어 인터럽트는 인터럽트 우선 순위에 따라 인코드되어 3개의 신호로 CPU에 전달된다.별도의 인터럽트 컨트롤러는 일반적으로 인터럽트 인코딩에 필요하지만 시스템에 3개이하의 하드웨어 인터럽트를 사용할 경우 직접 연결해 인터럽트 신호를 입력받을 수 있지만 소프트웨어의 복잡성이 증가한다. 인터럽트 컨트롤러는 간단한 74LS148 우선권 인코더부터 MC68901과 같이 UART와 타이머, 병렬 I/O 기능이 포함된 다기능 VLSI 주변 칩 등도 사용할 수 있다.

예외 테이블는 어드레스 0에서 1023까지로 고정되어 있으며 256개의 32비트 벡터로 표시된다. 첫 번째 벡터는 시동 스택 어드레스이며 두 번째는 시동 코드 어드레스이다. 벡터 3부터 15는 각종 에러 보고에 사용되는데 버스 에러나 어드레스 에러, 부정 명령어, 0으로 나눗셈, CHK과 CHK2 벡터, 특권 위반, 그리고 Line 1010 에뮬레이터, Line 1111 에뮬레이터와 하드웨어 정지지점같은 예약된 벡터가 포합된다. 벡터 24부터 실제 인터럽트가 시작되는데 하드웨어에서 인정되지 않는 가짜 인터럽트, 레벨 1에서 7까지의 벡터, 15개의 트랩 벡터, 몇가지의 예약된 벡터, 사용자 정의 벡터의 순서로 나열된다.

리셋시에는 최소한 시동 코드 어드레스 벡터에 유효한 어드레스가 있어야 하기 때문에 시스템에서는 일반적으로 0번지에 들어갈 벡터와 부트스트랩 코드를 저장한 비휘발성 메모리를 장착하고 있다. 하지만 일반적인 시스템에서는 실행중인 운영체제가 벡터를 변경할 수 있도록 하는 게 바람직하다. 이것을 실현하기 위해 ROM의 벡터가 RAM의 점프 테이블을 가리키거나 뱅크 스위칭으로 RAM을 ROM으로 대체하여 사용하기도 한다.

68000은 Popek과 Goldberg의 가상화 요구 조건과 일치하지 않는데 그 이유는 유저 모드 소프트웨어가 특권 상태를 읽어들일 수 있고 특권이 없는 "MOVE from SR" 명령어 하나 때문이었다.

68000은 가상 메모리 지원이 불가능했는데 이것은 메모리 액세스 실패시 트랩과 복구 기능이 필요했다. 68000은 트랩에 사용되는 버스 에러 예외를 준비해 놓았지만 운영체제에서 예외 사항을 처리하는 경우 잘못된 명령어를 다시 시작하기 위한 프로세서의 상태를 저장하지 않았다. 몇몇 회사는 2개의 68000칩을 사용해 가상 메모리가 작동하는 유닉스 워크스테이션을 제작하기도 하였다. "leading" 68000가 잘못된 메모리 액세스를 접하면 "main" 68000가 잘못된 메모리 액세스하는 것을 방지하기 위해 끼어들어 가상 메모리 기능을 처리하고 올바른 상태를 유지하게 되면 인터럽트를 반환해서 "main" 68000를 작동시켰다.

이런 문제점들은 MC68010에서 수정되었다. 버스 에러와 어드레스 에러가 발생할 경우 내부 상태를 슈퍼바이저 스택에 밀어 넣는 것으로 본래의 작업으로 복귀가 가능했다. “MOVE from SR” 명령어는 특권 명령어로 변경되었고 유저 모드 소프트웨어 용도로 특권없는 명령어 "MOVE from CCR"이 추가되어 운영체제에서 트랩과 유저모드에서 “MOVE from SR” 명령어를 에뮬레이터 할 수 있었다.