486

KANOTYPE WIKI
둘러보기로 이동 검색으로 이동

486(또는 80486)은 인텔이 개발한 x86 아키텍처의 32비트 CPU이다.

개요

80386의 아키텍처를 그대로 계승하여 성능을 큰 폭으로 향상시킨 CPU이다. 486에는 여러 종류가 있으며 그 원형은 486DX이다. 캐쉬 메모리, FPU(부동소수점 프로세서)를 내장하고 있으며 명령처리 속도도 고속화 되었다. 후에 FPU를 무효화 시킨 저가 버전 CPU인 486SX가 개발되었다.

특징

캐쉬 메모리

캐쉬 메모리는 메인 메모리와 CPU의 연산처리부분의 중간에 위치한 고속 메모리이다. 486은 클럭수가 높아져서 각 명령이 짧은 사이클로 실행 가능해졌으나 메모리의 속도가 CPU의 속도를 따라가지 못하여 CPU의 명령처리가 지연되는 것을 방지하기 위해 추가되었다. 메인 메모리로부터 데이터를 읽어들인후 캐쉬 메모리에 저장하여 같은 메모리를 다시 필요로 할 경우, 느린 메인 메모리가 아닌 빠른 캐쉬 메모리로부터 데이터를 읽어들인다. 486에는 8KB의 캐쉬 메모리가 내장되어있다.

구조

MMU

486은 CPU내부에 MMU (메모리 관리 유닛)을 내장하고 있어 이 MMU를 경유하여 메모리에 접근한다. CPU내부에서 이론 주소를 계산하여 MMU에 전달하면 MMU는 이론 주소를 물리주소로 변환하여 실제 메모리에 접근하게 된다. MMU가 이론 주소를 실제 주소로 변경하는 방법은 OS등의 시스템 소프트웨어에 의해 결정된다.

동작

리얼 모드와 보호 모드

CR0레지스터의 PE플래그(0비트)를 1로 설정하면 보호 모드, 0으로 설정하면 리얼 모드로 동작한다.

  • 리얼 모드: 처음 전원을 넣으면 리얼 모드로 동작하게 된다. 기존과의 호환성을 유지하는 동작모드로 일부를 제외하고 8086과 같은 동작을 하게 된다.
    • 물리 메모리 최대 크기 : 1MB
    • 세그먼트 최대 크기 : 64KB
  • 보호 모드: 80286이후에 도입된 모드로, CPU의 추가 기능을 이용할 수 있는 모드이다. 80286의 보호 모드와 비슷하지만 몇가지 면에서 더욱 발전되었다.
    • 물리 메모리 최대 크기 : 4GB (80286의 보호 모드는 16MB)
    • 세그먼트 최대 크기 : 4GB (80286의 보호 모드는 64KB)
    • 보호 기능, 태스크 기능, 32비트 지원, 페이징, 가상 8086 모드(보호 모드에서 기존의 리얼 모드용 프로그램을 실행할 수 있는 모드)

세그먼트

리얼 모드 세그먼트

각 세그먼트의 최대 크기는 64KB (FFFFh). 선형 주소는 20bit크기를 가지며 최대 1MB (FFFFFh)의 메모리를 사용할 수 있다. 세그먼트 레지스터에 값을 설정하는 것 만으로 사용할 수 있다.

  • 선형 주소 변환 공식 : (세그먼트 주소(16bit) << 4) + 오프셋 주소(16bit)

보호 모드 세그먼트

리얼 모드와는 달리, 보호 모드에서는 세그먼트를 사용하기위해 다음과 같은 준비가 필요하다.

  1. 메모리 분배를 결정
  2. 디스크립터 테이블 작성
  3. GDTR 레지스터에 디스크립터 테이블의 주소를 설정

리얼 모드에서는 세그먼트 레지스터에 설정하는 값을 그대로 주소 계산에 이용하므로 세그먼트 주소라고 부르지만, 보호 모드에서는 세그먼트 레지스터에 지정하는값이 디스크립터 번호가 되므로 선택값이라고 부른다.

실제 사용시에는 세그먼트 레지스터에 디스크립터 번호(선택값)를 지정하는데, 이 값은 8 단위로 지정이 가능하다(예: 00h, 08h, 10h, 18h, ...). 이것은 디스크립터가 8바이트의 크기를 가지고 순서대로 디스크립터 테이블에 보관되어 있기 때문이다. 각 디스크립터는 하나의 세그먼트에 대한 세그먼트 베이스, 최대 크기, 속성 등의 정보를 가지고 있다. 또한 선택값 0은 세그먼트 레지스터를 무효화 하는데 사용되므로 디스크립터 테이블의 0번째 디스크립터는 사용이 불가능하다.

디스크립터 테이블은 CPU가 가지고 있는게 아니라 메모리에 위치한다. 구체적으로는 디스크립터 테이블용 세그먼트를 작성하거나, OS가 사용하는 데이터 세그먼트의 일부에 배치한다. 디스크립터 테이블은 시스템 전체에 단 하나 존재하는 GDT(글로벌 디스크립터 테이블), 각 태스크마다 1개씩 존재하는 LDT(로컬 디스크립터 테이블), 인터럽트 설정에 사용되는 IDT(인터럽트 디스크립터 테이블)이 있으며 모든 디스크립터 테이블은 구조가 동일하다.

디스크립터 구조

80286의 디스크립터 구조 (8byte)

0 1 2 3 4 5 6 7
한계값 세그먼트 베이스 속성
  • 세그먼트 베이스: 세그먼트 선두 부분의 선형 주소. 3byte(24bit)이므로 최대 16MB(2의 24승)의 메모리공간내의 임의의 주소를 지정할 수 있다.
  • 한계값: 세그먼트의 크기 - 1. 80286은 한계값이 2byte(8bit)이므로 한개의 세그먼트는 최대 64KB까지 크기를 지정할 수 있다.
  • 속성: 세그먼트의 종류 등의 정보를 가지고있다.
  • 마지막 2바이트는 80286에서는 반드시 0이어야 한다. 0으로 설정하면 486에서도 호환성이 유지된다.
  • 세그먼트 베이스와 한계값은 낮은 바이트에서 높은 바이트 순서로 역순으로 보관되어있다. (x86 CPU의 메모리 접근 구조상)

486의 디스크립터 구조 (8byte)

0 1 6하 2 3 4 7 5 6상
한계값 세그먼트 베이스 속성
  • 세그먼트 베이스: 1바이트 늘어난 최대 4GB 크기의 메모리 내의 임의의 위치를 지정할 수 있다.
  • 한계값: 6번째 바이트의 하위 4비트가 추가되어 1MB의 크기를 가질수 있게 되었다. 추가로, 속성의 G비트를 사용하는것으로 4096배가 되어 최대 크기 역시 4GB가 되었다.
  • 속성: 이것 또한 6번째 바이트의 상위 4비트가 추가되었으며, 세그먼트를 32비트로 확장하는 등의 설정이 가능하다.

x86 관련 문서