인텔 8086
[image]
1. 개요
인텔의 16비트 CPU이자 장대한 x86 아키텍처 역사의 시작. 1978년에 발표되었다. 자사의 기존 히트작이었던 8080 아키텍처를 16비트로 확장하고 곱셈/나눗셈 등의 연산 명령을 추가하였다.[1] 8080과의 바이너리 레벨에서의 호환성은 없지만 어셈블리어 수준에서는 호환되므로 다시 어셈블하면 정상적으로 작동했다. 그 덕에 아키텍처가 깔끔하지 못한 부분도 있다는 비판도 있는 모양. 당시 8086의 프로그래밍 모델은 프로그래머들에게 매우 까였다(...)고 한다. IBM PC의 성공으로 인해 잘나갔던 CPU임에도 불구하고 아케이드 기판이나 게임기 쪽의 CPU에는 거의 채용되지 못하고[2] 경쟁모델인 모토로라 68000에게 완패한데는 그만한 이유가 있었던 것.
8086은 20비트의 메모리 주소 버스를 가지고 있어 총 1MB(220 Byte)의 물리 메모리를 다룰 수 있다. 그러나 8086은 '세그먼테이션'이라는 방식을 통해 메모리에 접근하도록 되어있다. 16비트 레지스터 2개로 메모리 접근을 지원했는데, 메모리를 16비트 레지스터로 접근할 수 있을 만큼인 64KB의 분량씩을 '세그먼트'라는 단위로 나누고, 또 다른 16비트 레지스터로 해당 세그먼트 내부에서의 위치를 1 word 단위로 '오프셋'으로 지정한 것이다. 이 레지스터를 세그먼트 레지스터와 오프셋 레지스터라 불렀다. 그래서 어셈블리어에서 '''세그먼트:오프셋'''으로 표기해 메모리 주소에 접근할 수 있었다. 실제 물리 메모리 주소는 세그먼트 주소×16+오프셋으로 얻을 수 있다. 세그먼트 주소를 4비트 왼쪽으로 시프트하고 오프셋을 더하는 것. 그 덕분에 당시에는 C 프로그래밍을 할때 near 포인터와 far 포인터라는 개념이 있었다. 같은 세그먼트 안에서의 오프셋 주소와 다른 세그먼트의 오프셋 주소를 구분해야 할 필요가 있었기 때문이다. 32비트 이상의 운영체제와 컴파일러에서는 near far 구분이 없어졌다.
이 세그먼테이션 구조는 원래 처음 설계할 때는 메모리 접근 상한이 64KB였던 8080과 호환성이 있는 환경을 만들려고 설계한 것이었다. 당시 64KB 정도면 응용 프로그램 하나 돌리는데 충분한 큰 메모리였기 때문에[3] 메모리를 64KB 단위로 분할하여 여러 개의 응용 프로그램을 메모리에 올리기 위한 구조였다고. 그러나 8086이 오랜 기간 잘나간 덕에 64KB의 크기는 택도 없는 사이즈가 되었고 결국 프로그래밍이 복잡하게 되었다는 슬픈 사연이 있다. 구체적인 메모리 맵은 이 문서를 참조.
IBM은 IBM PC XT까지는 1MB 중에서 기본 메모리 640KB를 제외하고 남은 384KB를 바이오스가 사용하도록 했다. 그러나 이 세그먼테이션 구조에는 문제가 있었는데, 예를 들어 F001:FFF0(세그먼트:오프셋)의 주소로 접근하려고 하면 세그먼테이션 구조 상 메모리 주소는 F001×16(0x10, 10h)+FFF0이었던 관계로 물리 메모리 주소로는 0x100000이라는 1MB가 넘어가는 영역의 주소로 접근할 수 밖에 없었던 것이다. IBM은 회로를 통해 보완했는데, 이런 경우 다시 0x00000부터 접근하도록 만들었다. 이후 24비트 메모리 주소를 지원했던 80286에서는 다른 문제를 야기했는데, 80286부터 1MB에서 대략 64KB(정확히는 65,520바이트) 정도의 영역을 고위 메모리 영역이라(HMA, High Memory Area)라 불렀다. 상세한 내용은 80286 문서와 RAM/주소할당 문제 항목을 참조.
이 세그먼테이션 기법은 80386 이후 32비트 보호 모드가 등장하면서 선형 메모리 모델(Flat Memory Model)을 지원했음에도 불구하고 하위 호환을 위해 오랫동안 지원하였다. 지금도 CS, SS, DS, ES 등의 세그먼트 레지스터들로 흔적이 남아 있으나 현대 x86-64 프로세서들의 롱 모드(64비트)에서는 더 이상 쓰이지 않으며 선형 메모리 모델만 쓰인다.
부동 소수점 연산 기능은 내장하고 있지 않았기 때문에 원하는 사람에 한해 별도의 부동 소수점 보조 프로세서였던 8087을 함께 사용하도록 했다. 당시만 해도 CPU에 부동 소수점 연산 기능을 넣기에는 미숙했던 반도체 공정 기술 문제로 너무 비쌌을 뿐더러, 당시엔 과학 기술 같은 전문 분야에서만 사용하고 있어 중요하게 여겨지지 않았기 때문이다. 그 이전 세대의 8080 등에도 부동 소수점 연산 명령은 CPU에 내장되어 있지 않았다. 반드시 필요한 사용자만 보조 프로세서를 구입하고 그 이외의 경우에는 소프트웨어로 벌충해 처리하는 방식이었다. 이는 컴퓨터를 저렴한 가격으로 구성하려는 것이 목적이었다. 이 구조는 80386까지 이어지다가 80486에 가서야 부동 소수점 연산 장치를 CPU 안에 내장하게 되었다.
8086은 '''원조''' x86이기 때문에 이후에 나온 모든 인텔의 x86(x86-64를 포함해서) CPU와 그 호환 CPU(AMD, VIA 등의)는 8086과 하위 호환성을 유지하고 있다. 80286에서는 8086처럼 동작하는 '실제 모드'(real mode)와 80286의 모든 성능을 낼 수 있는 '보호 모드'(protected mode)로 CPU의 모드를 나누고 있고 80386에서는 여러 개의 8086 응용 프로그램을 동시에 구동하기 위한 '가상 8086 모드'(Virtual 8086 Mode)을 추가하였는데 이 설계는 오늘날까지도 그대로 이어져 내려오고 있다. 다만 오늘날의 x86-64에서는 64비트 모드인 '롱 모드'(long mode)로 동작할 때는 가상 8086 모드를 사용할 수 없다. 어쨌거나 8086의 설계는 40년이 넘은 지금까지도 영향을 미치고 있다.
2. 토막상식
- 8086은 '원조' x86이지만 원조 IBM PC에 쓰인것은 이 8086이 아닌 8088이었다. 따라서 IBM PC 호환기종들도 대부분 8088을 사용했다. 다만 호환기 중에 컴팩 Deskpro, Tandy-1000의 일부 모델 등에 8086이 사용된 적이 있고 한참 나중에 나온 PS/2 Model 25 시리즈에는 8086이 탑재되긴 했으니 IBM PC에 8086이 아주 사용되지 않은 것은 아닌 셈. 우리가 알고 있는 일반적인 기종이 아니긴 하지만 한국, 일본, 대만 등에 판매했던 PC 5550에도 8086이 쓰이긴 했다. 한자 문화권임을 고려해 디스플레이가 PC 5150과 비교하면 넘사벽이였지만 덩달아 가격 또한 넘사벽이라 문제였을 뿐. 1985년 당시 천만원 정도의 가격이였다...
- 인텔은 8086은 당시 개발중인 차세대 32비트 CPU인 iAPX432가 나올때까지 모토로라와 경쟁에서 버텨줄 과도기적인 CPU로 설계했기 때문에 8080에서의 연계성만 고려하고 차후의 확장성을 그다지 고려하지 않았다고 한다. 하지만 현실은 iAPX432는 32비트라는게 무색할 정도로 구린 성능(이듬해에 나온 16비트 80286의 4분의 1에 불과한 성능이었다.)을 자랑하면서 시원하게 망했고 8086이 대박을 터뜨리는 아이러니한 상황이 되어버렸다.
- 1980~90년대 일본의 국민 컴퓨터였던 PC-9801에 탑재한 CPU NEC V30은 인텔의 8086 라이선스를 받아 NEC 고유의 명령어 세트를 추가한 CPU이다. 8080과 Z80의 관계랑 비슷하다고 보면 된다. 운영 체제로 MS-DOS를 이식해 썼다. 후에 DOS/V가 나오면서 IBM PC 호환기종으로 수많은 게임들이 이식된 데엔 비슷한 CPU와 같은 운영 체제를 사용하기 때문에 이식이 쉬웠기 때문이었다. 이 V30은 최초의 스마트폰으로 알려진 IBM 사이먼이나 휴대용 게임기인 원더스완에도 들어간 적이 있고, 아이렘과 세이부 개발의 몇몇 오락실 게임 기판에 쓰였으며, 8088 호환 CPU NEC V20도 국내에 유통되었던 일부 IBM PC XT 호환 기종에 탑재되기도 했으며, MS-DOS 랩톱 HP 95LX에도 들어갔다. 당시 V20 CPU가 탑재된 IBM PC XT 호환 기종을 사용했던 이들의 말을 빌리자면 원판인 8088보다는 성능이 좋았던 나름대로 가성비 좋은 제품이었다고...
- 1980년대 소련도 자체 생산한 옐브루스 프로세서는 당시엔 군사 & 우주용 CPU로 사용했기 때문에 인텔의 8086을 무단으로 복제해서 KP1810BM86 같은 x86 CPU를 생산했다.
- 인텔은 2018년 6월, 8086 출시 40주년을 기념하여 코어 i7-8086K를 발매했다. 한정판으로 5만 개만 출시된다고 하며, i7-8700K중 고수율 제품을 선별해서 만든 제품으로 클럭이 기본 4.0GHz, 터보 5.0GHz라는 상징성 있는 숫자로 세팅되어 있다.
3. 후속작
3.1. 인텔 8088
8086이 나온 이듬해인 1979년에 발표되었다. 8086과 거의 비슷하지만 외부 데이터 버스를 16비트에서 8비트로 줄인 염가형 프로세서였다. 또한 당시에 시장에 나와있던 8비트 주변 기기들을 그대로 사용하기 위해서 이런 구조가 되었다고 한다.
1981년 IBM PC의 CPU로 채용됨으로써 장대한 x86 아키텍처의 막을 연 모델이기도 하다. 일부 8086이나 8086/8088 호환칩을 사용한 호환 기종도 있었지만 IBM PC XT까지의 대부분의 IBM PC 호환기종은 8088을 사용했다고 보면 된다. 오리지널 IBM PC와 IBM PC XT는 4.77MHz 모델을 채용했지만 1980년대 중반 이후에 나온 호환 기종들은 8MHz나 10MHz의 고속 버전을 사용한 모델이 대부분이었다.
메모리 주소 버스는 8086과 동일한 20비트이므로 다룰 수 있는 메모리 양도 마찬가지로 1MB. "그런데 왜 XT는 640KB가 한계였다고 하지?" 라는 의문이 든다면 기본 메모리 문제 항목을 참조.
3.2. 인텔 80186/80188
마이크로컨트롤러(MCU). 1982년에 발표되었다. 80186/80188은 분명히 8086/8088의 마이크로컨트롤러로 설계했으나 서술 내용이 적어 별도의 문서로 분리하지 않고 함께 서술한다.
80186/80188은 마이크로컨트롤러로서 설계했기 때문에, 주변 IC(클럭 제네레이터, 인터럽트 컨트롤러, 타이머 등)를 포함시키고 10여가지 명령어를 추가했다. 또한 빠른 주소 버스 연산을 위해, 곱셈, 나눗셈, 비트 시프트 연산도 더 빨랐다. 동클럭이라면 평균적으로 30% 정도 빨랐다고 한다. 8086/8088과 마찬가지로 80186/80188은 똑같은 성능에 외부 데이터 버스가 16비트/8비트라는 차이가 있다.
마이크로컨트롤러였지만 PC에 사용된 예가 있기는 있었는데, 초창기 IBM PC 호환기종의 끝판왕으로 유명했던 Tandy 2000이나 MS-DOS 기반 랩톱 PC인 HP 100/200LX 정도만 알려져 있다.
마이크로컨트롤러가 많이 쓰이는 임베디드 분야에서는 2000년 대 초반까지도 그럭저럭 쓰였고 퀄컴 MSM2300의 CPU 코어로 채택되면서 1990년대 후반 까지 휴대폰의 CPU로 활약하기도 하였다. 인텔에서는 2007년까지 생산하였다. 현재는 AVR과 PIC, ARM 등에 자리를 내주었지만 몇몇 서드 파티에서 호환 칩이 나오고 있다.
[1] 8080이나 그 상위 호환 버전인 Z80의 사칙 연산 명령은 내부적으로는 덧셈(ADD)과 뺄셈(SUB) 밖에 없다. 곱셈과 나눗셈은 덧셈과 뺄셈, 시프트 명령 등을 이용해서 수행하게 되어있다.[2] 그래도 아예 채용되지 않은 것은 아니고 1980년대에 8086 CPU를 사용한 아케이드 기판이 일부 존재했기도 하고, 8086 호환 클론 CPU인 V30을 사용한 라이덴도 있었고 아이렘의 모든 16비트 CPU기반(나중에는 V33, V35등의 개량형도 채용) 기판이나 반다이의 휴대용 게임기인 원더스완도 V30을 사용하였다.[3] 애플 II를 위시한 당시의 8비트 PC들은 대부분 64KB가 메모리의 한계였을 정도다. 참고로 MS-DOS용 실행파일 중에 확장자가 .com인것과 .exe인 것이 있는데 .com인 것이 바로 이 세그먼트 하나(64KB)에 들어가도록 만들어질 것을 고려한 구조의 실행파일이다.