일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- pwncollege
- 리눅스
- C언어
- 시스템 프로그래밍
- 커널
- 시그널
- 리버싱
- 어셈블리어
- 리눅스 커널
- 프로그래밍
- Leviathan
- radare2
- Bandit
- pwn.college
- px4
- 취약점
- Pwnable.kr
- C++
- css
- 워게임
- 시스템프로그래밍
- kernel
- 컴퓨터구조
- 리눅스커널
- 드론
- 알고리즘
- 시스템
- write up
- wargame
- 시스템해킹
- Today
- Total
Computer Security
#7 x86의 구조 (역사) 본문
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 |