Computer Security

#7 x86의 구조 (역사) 본문

컴퓨터구조&어셈블리어

#7 x86의 구조 (역사)

쿠리 Kuri 2022. 5. 19. 20:47

x86의 역사

 

8086 (1978)

-16비트 프로세서: 16비트 레지스터와 16비트 데이터 버스

-20비트 주소 버스 : 1MB 주소 지정 가능

-한번에 하나의 프로그램을 실행하는 실제 모드(real mode)로 동작한다.

 

8088(1979)

-8086과 달리 내부적으로 16비트 레지스터를 사용하지만, 외부 데이터 버스는 8비트

-8086과 버스 인터페이스 장치에서만 차이, 소프트웨어 호환

-IBM PC에 내장

 

80286 (1982)

-24비트 주소 버스: 16MB 메모리 주소 지정 가능

-보호모드 지원: 멀티태스킹과 가상 메모리

 

80386(1985)

-32비트 확장: 32비트 레지스터와 32비트 데이터 버스  2^32 byte = 4GB

-4GB 주소 지정 가능

 

80486(1989)

-캐시메모리와 수치연산 보조프로세서 내장

 

Pentium(1993)

-데이터와 메모리에 대해서 별도의 캐시를 가짐

-슈퍼스칼라 설계:클럭 사이클 당 여러 개의 명령어를 동시에 실행 가능

-5단계 파이프라인

 

 

 

8086의 구조

 

개요: 16비트 프로세서

 -16비트 레지스터

 -16비트 데이터 버스

 -20비트 주소 버스:1MB 주소지정 가능

 

실행장치와 버스 인터페이스 장치

 -8086 프로세서의 논리적 장치 구분: 실행장치(EU)와 버스 인터페이스 장치(BIU)

 

실행장치(EU, Execution Unit)  (명령어를 가져와서 실행하는 모듈)

 -ALU, 제어장치(CU), 각종 레지스터들 포함

 -명령의 실행을 수행

 

버스 인터페이스 장치(BIU, Bus Interface Unit) (물리적인장치들을 연결&조율)

 -버스 제어장치, 세그먼트 레지스터, 명령어 큐 관리

 -BIU는 EU, 메모리, 외부 입출력 장치로 데이터를 전송하는 버스를 제어하고, 세그먼트 레지스터는 메모리 주소지정을 제어한다.

 -메모리의 명령어에 접근하여 명령어 큐(Instruction Queue)로 가져온다.

 

 

메모리상의 데이터 주소지정

빅 엔디안(Big-Endian)과 리틀 엔디안(Little-Endian)

 -메모리에는 바이트 단위로 데이터가 저장되며, 1바이트보다 큰 데이터들이 저장될 때는 저장되는 순서에 따라 빅 엔디안 방식과 리틀 엔디안 방식으로 분류된다.

 -빅 엔디안 방식은 상위 바이트부터 하위 바이트 순서대로 메모리에 데이터를 저장한다.

 -리틀 엔디안 방식은 하위 바이트부터 상위 바이트 순서대로 메모리에 데이터를 저장한다.

 -프로세서 설계에 따라 바이트 순서는 달라진다. 8086은 리틀 엔디안 방식을 사용한다.

 

 

16진수 한자리 -> 이진수 4자리

ex) 0100 -> 0x4

1byte -> 8bit 

1바이트 -> 16진수 2자리씩 저장

 

ex) little-Endian

Data

0x123f ; 2바이트 데이터

Memory

3f 12

 

Data

0xabcdef45 ; 4바이트 데이터

Memory

45 ef cd ab

 

Data

0x56, 0x78, 0xab, 0xcd ; 바이트 배열 (바이트 크기 배열은 순서대로저장)

Memory

56 78 ab cd

 

Data

0x1234, 0x1020, 0x8086, 0x8088 ; 2바이트 데이터 배열 (워드 크기니 한번에 16비트씩 가져와 조립)

Memory

34 12 20 10 86 80 88 80

 

 

 

세그먼트와 오프셋

 

8086의 주소

  -20비트 절대 주소(absolute address): 메모리 특정 위치를 직접 참조(직접 주소 direct address)

  -세그먼트: 오프셋(segment:offset address): 세그먼트의 시작 주소와 오프셋 값을 결합한다.

 

세그먼트

 -8086은 20비트 절대 주소를 16비트 레지스터 하나로 표현할 수 없기 때문에 세그먼트 레지스터의 값과 세그먼트 내부의 오프셋 주소를 결합하여 표현한다.(16비트로 표현 가능한 주소 공간의 크기는 64KB이다. 세그먼트 내부의 오프셋이 16비트이므로  세그먼트 하나는 64KB를 가진다.)

 -세그먼트 주소는 패러그래프 경계, 즉 메모리 주소 0x10으로 나누어 떨어지는 영역에서 시작한다.

 -프로그램에 정의된 특정 영역. 즉, 프로그램의 논리적 분할, 코드, 데이터,  스택 등의 세그먼트가 존재한다.

 

 

세그먼트와 오프셋

-프로그램에서 한 세그먼트에 속한 모든 메모리 위치는 그 세그먼트의 시작 주소에 상대적이다. 세그먼트 주소로부터 그 세그먼트에 속한 다른 위치까지의 바이트 단위의 거리를 오프셋(offset) 또는 변위(displacement)라 한다.

2비트 선형 주소 = 세그먼트 주소 X 16 + 오프셋 주소

 

세그먼트주소 = 무슨타워인지

오프셋 = 타워에서 몇층에 있는지 정확히 나타내는 시스템

ex) DS: 0x038E X 16 =  0x038E0    (16을 곱한다는것은 16진수에서 0x10 하는것과 같다.)

    offset : 0x0032

= 0x03912가 된다.

 

'컴퓨터구조&어셈블리어' 카테고리의 다른 글

#9 x86구조 (주소지정방식)  (0) 2022.05.21
#8 x86 구조 (레지스터 구조)  (0) 2022.05.20
#6 컴퓨터구조와 명령어  (0) 2022.05.16
#5 컴퓨터 구조2  (0) 2022.05.15
#4 컴퓨터 구조1  (0) 2022.05.14
Comments