1. 컴퓨터 구조 (Computer Architecture)
: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법
ㅇ 컴퓨터의 기능 구조에 대한 설계
: 컴퓨터가 연산을 효율적으로 하기 위해 설계하는 분야
ex) 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조
ㅇ 명령어 집합구조 (Instruction Set Architecture)
: CPU가 처리해야하는 명령어를 설계하는 분야
ex) ARM, MIPS, AVR, 인텔의 x86및 x86-64
ㅇ마이크로 아키텍쳐 (Micro Architecture)
: 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야 (CPU의 하드웨어적 설계)
ex) 캐시 설계, 파이프라이닝 , 슈퍼 스칼라, 분기 예측, 비순차적 명령어 처리
ㅇ 하드웨어 및 컴퓨팅 방법론
ex) 직접 메모리 접근
폰 노이만 구조
: 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각
연산과 제어 -> 중앙처리장치(Central Processing Unit, CPU)
저장 -> 기억장치(memory)
데이터나 제어 신호 교환 -> 버스(Bus)
ㅁ 중앙처리장치 (CPU)
: 프로그램의 연산 처리, 시스템 관리 / 프로세스 코드 불러오고 실행하고 결과 저장
- 산술논리장치 (ALU)
- 제어장치 (Control Unit)
- 레지스터 (Register) : CPU에 필요한 데이터 저장
ㅁ 기억장치 (Memory)
- 주기억장치 : 데이터 임시로 저장
ex) RAM
- 보조기억장치 : 장기간 보관
ex) 하드 드라이브(Hard Disk Drive, HDD)
SSD(Solid State Drive)
ㅁ 버스 (Bus)
: 신호 전송하는 통로
- 데이터 버스(Data Bus) : 데이터 이동
- 주소 버스(Address Bus) : 주소 지정
- 제어 버스(Control Bus) : 읽기/쓰기 제어
... 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 불림
Q )기억장치가 있는데 CPU안에 레지스터가 왜 필요한가??
A ) CPU의 연산속도가 기억장치와의 데이터 교환속도보다 압도적으로 빠름 -> 병목현상
즉 CPU는 교환속도를 획기적으로 단축하기 위해 레지스터와 캐시라는 저장장치를 내부에 갖고 있음
명령어 집합 구조 (Instruction Set Archiecture, ISA)
: CPU가 해석하는 명령어의 집합
프로그램(기계어) -> 프로그램 실행시 CPU가 명령어들을 읽고 처리
ISA : IA-32, x86-64(x64), MIPS, AVR등 다양하게 존재 -> 다양한 수준의 연산 능력 요구, 컴퓨팅 환경 다양
x86-64 : CPU들은 많은 전력 소모, 발열 심함, 냉각 장치 필요 -> 임베디드에 부적합
x86-64 아키텍처
ㅇ n 비트 아키텍처
64는 CPU가 한번에 처리할 수 있는 데이터의 크기이다
WORD: CPU가 이해할 수 있는 데이터의 단위 -> CPU가 어떻게 설계됐느냐에 따라 달라짐 -
+) WORD가 크면 유리한 점
: 완전한 사용이 불가능할 정도로 큰 크기이기 때문에, 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없다거나 소프트웨어의 실행이 불가능한 상황은 거의 발생하지 않는다.
ㅇ x86-64의 여러 이름
Intel64, IA-32e, EM64T 또는 amd64
x86-64 아키텍처: 레지스터
레지스터: CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소, 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용
x64 아키텍처 : 1)범용 레지스터(General Register), 2)세그먼트 레지스터(Segment Register), 3)명령어 포인터 레지스터(Instruction Pointer Register, IP), 4)플래그 레지스터(Flag Register)가 존재
ㅇ 범용 레지스터
x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며 부호 없는 정수를 기준으로 264−1까지의 수를 나타낼 수 있음
이름 | 주용도 |
rax (accumulator register) | 함수의 반환 값 |
rbx (base register) | x64에서는 주된 용도 없음 |
rcx (counter register) | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
rdx (data register) | x64에서는 주된 용도 없음 |
rsi (source index) | 데이터를 옮길 때 원본을 가리키는 포인터 |
rdi (destination index) | 데이터를 옮길 때 목적지를 가리키는 포인터 |
rsp (stack pointer) | 사용중인 스택의 위치를 가리키는 포인터 |
rbp (stack base pointer) | 스택의 바닥을 가리키는 포인터 |
ㅇ 세그먼트 레지스터
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재
각 레지스터의 크기는 16비트이다.
세그먼트 레지스터는 x64로 아키텍처가 확장->용도에 큰 변화
현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용,
나머지 레지스터는범용적인 용도로 제작된 세그먼트 레지스터
ㅇ 명령어 포인터 레지스터
: CPU가 어느 부분의 코드를 실행할지 가리키는것
x64 아키텍처의 명령어 레지스터는 rip, 크기는 8바이트이다.
x86-64 아키텍처: 플래그 레지스터
: 프로세서의 현재 상태를 저장하고 있는 레지스터
RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 아래 그림의 20여개의 비트만 사용한다.
플래그 | 의미 |
CF(Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다. |
ZF(Zero Flag) | 연산의 결과가 0일 경우 설정 됩니다. |
SF(Sign Flag) | 연산의 결과가 음수일 경우 설정 됩니다. |
OF(Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다. |
x86-64 아키텍처: 레지스터 호환
앞에서 x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능하다고 했습니다. IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp였습니다. 호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능합니다.
앞서 소개드린 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킵니다. 예를 들어, eax는 rax의 하위 32비트를 의미합니다.
또한 마찬가지로 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx , ecx , edx, esi, edi, esp, ebp의 하위 16비트를 가리킵니다.
이들 중 몇몇은 다시 상위 8비트, 하위 8비트로 나뉘는데 이들 전체에 대한 내용은 하단의 그림에서 확인할 수 있습니다.
'Ping!_linux' 카테고리의 다른 글
Python 기초 문법 (2) (3) | 2024.03.16 |
---|---|
Python 기초 문법 (1) (1) | 2024.03.15 |
기본 명령어 및 vi 에디터 (0) | 2024.01.28 |
3. x86 Assembly (0) | 2024.01.28 |
2. 리눅스 메모리 구조 (Linux Memory Layout) (0) | 2024.01.28 |