728x90

1. 컴퓨터 구조 개요

컴퓨터 구조

하드웨어

  • 특정한 외형을 가진 물리적 자원
  • 입력장치, 출력장치, 기억장치, 연산장치. 제어장치

소프트웨어

  • 특정한 외형 없이 컴퓨터의 작동과 기능
  • 프로그래밍 언어를 사용하여 하드웨어에 ㅍ효과적으로 명령을 수행하는 프로그램
  • 시스템 소프트웨어
    • 하드웨어와 소프트웨어의 기능을 효율적으로 관리 및 제어하는 프로그램
    • ex) OS, 펌웨어 등
  • 응용 소프트웨어
    • 사용자가 원하는 기능을 실행하는 프로그램
    • ex) Microsoft Office 프로그램, 게임 등

2. CPU 구조 및 기능

컴퓨터 하드웨어의 구성 요소

컴퓨터 하드웨어의 구성

메인 메모리 (Main Memory)

  • 램 (RAM)
  • 프로그램 코드가 올라가서 실행되는 영역

입출력 버스 (IMput / Output Bus)

  • 데이터가 이동하는 전송 경로
  • 주고 받는 데이터의 종류에 따라 3가지 요소로 구성
    • 데이터 버스
    • 어드레스 버스
    • 컨트롤 버스

폰 노이만 구조 (Von Neumann architecture)

  • 내장 메모리 순차 처리 방식으로 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조

폰 노이만 구조

명령어와 데이터는 같은 시스템 버스와 메모리를 사용

  • 장점
  • 프로그램 내장 방식을 적용했기 때문에 하드웨어를 재설정할 필요가 없이 소프트웨어만 교체하면 되므로 범용성이 크게 향상 된다
  • 단점시스템 버스가 하나이므로 순차적으로 정보를 처리하기 때문에 고속 병렬처리에 부적합
  • 한번에 하나의 명령어 처리로 CPU를 효율적으로 사용할 수 없다

폰 노이만 병목 현상
어떠한 특정 요소의 한계 때문에 전체가 제한 받는 상황을 비유한 말, 일부분에 의한 전체의 하향 평준화

CPU 구조 및 기능

CPU : 중앙 처리 장치 (Central Processing Unit)

  • ALU (Arithmetic Logic Unit)CPU로 입력 되었을 때, 명령어의 내용대로 연산하는 주 요소
  • CPU 내부에서 실제 연산을 담당하는 부분으로 산술 연산과 논리 연산을 수해
  • 컨트롤 유닛 (Control Unit)명령어를 분석해서 해야할 일을 결정하는 요소
  • CPU 내부로 들어온 명령어를 해석해서 ALU 에게 전달
  • 레지스터 (Register Set)
  • CPU 내부에서 임시적으로 데이터를 저장하기 위한 메모리 공간
  • 버스 인터페이스 (Bus Interface)
    • 버스의 통신 방식에 맞게 데이터 입/출 력을 돕는 인터페이스 장치는 컨트롤러 또는 어댑터
  • CPU 내에 I /O 버스의 통신 프로토콜(Protocol)을 이해하고 있는 장치

프로그램 실행

  1. 인출 (Fetch)
    • 메모리 상에 존재하는 명령어를 CPU로 가져오는 작업
    • 레지스터에 저장
  2. 해독 (Decode)
    • 가져온 명령어를 CPU가 해석
    • 무슨일을 하라는 명령어인지 분석
    • 컨트롤 유닛에서 수행
  3. 실행 (Execute)
    • 해석된 명령어 대로 CPU가 실행
    • ALU 에서 실행

3. 레지스터 구조와 기능

레지스터의 이해

  • IA-32 레지스터CPU 내부에 있는 8, 16, 32 bit 고속 저장소
  • 인텔386에서 시작하여 32비트 프로세스인 펜티엄4에 이르는 프로세스 '군' 을 의미
  • 레지스터는 CPU 안에 위치한 고속의 저장 장치로 메모리 보다 훨씬 빨리 read/write 수행
  • 보통은 CPU가 연산을 수행할 때 피 연산자를 레지스터에 저장세그먼트 레지스터 : 6개명령 포인터 : EIP
  • 프로세서의 상태를 나타내는 플래그 : EFLAGS
  • 범용 레지스터 : 8개

범용 레지스터

Register의 종류를 Size로 정리

  • eax의 하위 16 비트 ax
    ax 의 상위 8 비트 ah
    ax 의 하위 8 비트 al
    eax, ax, ah, al 이 각각 다른 공간을 의미하지는 않음
    eax 에 0000 0000 ..... 0000 0001 을 넣어도 ax 도 1 , al 도 1 이됨

EAX, EBX, ECX, EDX, ESI, EDI 레지스터는 우리 마음대로 쓸 수 있는 레지스터

  • EAX :
    계산을 위해 사용되며, 함수 호출의 리턴 값을 저장하고 더하기, 빼기, 비교 등과 같은 기본적인 연산
  • EBX :
    범용성은 없으며, 데이터를 저장하는데 사용
  • ECX :
  • 반복을 위해 사용되며, 아래쪽으로 카운트 (루프 카운터로 쓰임)
  • EDX :
    EAX 레지스터의 확장이며, 더 복잡한 계산 (곱하기, 나누기) 을 가능하게 함
  • ESI와 EDI :
    고속의 메모리 복사에 쓰이고 다량의 메모리를 옮기거나 비교 할 때의 주소 값을 가짐
    • S 는 source, D는 destination의 약자
    • ESI (source index) : 입력 데이터의 위치를 가지고 있음
    • EDI (destination index) : 데이터 연산 결과가 저장되는 위치를 가르킴
  • EBP :고급 언어에서 사용하는 함수 파라미터와 지역변수를 가리키는 데 쓰임
    • 파라미터는 EBP에 오프셋을 더한 값에 있고 지역변수는 EBP에 오프셋을 뺀 값에 있음
    • 일반적인 산술이나 데이터 전송에 쓰여서는 안됨
    • Stack Base 포인터로 쓰임
  • ESP :push , pop , ret , call 등에 사용
    • 스택의 탑을 가리키고 있음
    • Stack Pointer

메모리 구조

세그먼트 레지스터

→ 기본 프로그램 실행 레지스터

CPU가 사용하는 논리 주소를 4GB인 선형 주소로 변환하는데 사용

  • 선형 주소에서 물리 주소 사이의 매핑은 페이징이 담당
  • CPU 비트가 물리 메모리 크기보다 작아서 8086 시스템에 도입
  • 하지만 가상 메모리와 물리 메모리의 현재 모델은 80286부터 시작
  • 세그먼트 레지스터는 16비트로 설계되었다가 32비트 CPU의 시작과 함께 FS와 GS가 추가되어 32비트로 운영

64비트 CPU 부터 세그먼트 레지스터를 사용하지 않음

  • CPU의 아키텍처는 64비트로 증가했지만 메모리 주소 배정은 64비트로 증가하지 않음

세그먼트 레지스터 종류

  • 코드 세그먼트 (CS, Code Segment)인출 (fetch) 하는 모든 명령
  • 메모리 코드 영역의 시작 주소를 가지며, 실행할 명령을 가리키는 레지스터인 EIP가 이세그먼트를 참조
  • 데이터 세그먼트 (DS, Data segment)DS를 확장하기 위해 ES > FS > GS 순으로 세그먼트가 추가되어 사용
  • 데이터 집합의 시작 주소를 가지며, 데이터와 관련 있는 A, C, D, SI, DI가 이 세그먼트 참조
  • 스택 세그먼트 (SS, Stack Segment)
  • push 와 pop 하는 모든 스택
  • 스택의 시작 주소를 가지며, 스택과 관련 있는 SP와 BP가 이 세그먼트 참조

플래그 레지스터

Flag Register

  • 플래그 레지스터는 프로세서의 현재 상태를 표현
  • 다른 말로 상태 레지스터라고 부름
  • 플래그 레지스터는 16비트이며, E를 접두어로 사용하는 EFLAGS는 32비트, R을 접두어로 사용하는 RFLAGS는 64비트
  • 32비트로 충분히 사용 가능하며, 확장될 경우 사용하지 않는 비트는 0으로 설정
  • 1 , 3 , 5 비트는 고정 값을 사용
  • CF (Carry Flag) : 상태 플러그
  • 연산 결과가 저장 공간의 범위를 벗어날 때 1로 설정되는 플래그
  • PE (Parity Flag) : 상태 플러그$$26_(10) = 00011010_(2) > PF = 0\10_(10) = 00001010_(2) > PF = 1$$
  • 연산 결과의 최하위 바이트 (8비트) 에서 1로 설정된 비트 개수가 홀수면 0 짝수면 1로 설정, 검사를 위해 사용
  • AF ( Adjust Auxiliary) : 상태 플러그
    • 이진화 십진법은 니블로 10진수를 표현하는 방법 $1001_(2)$ 이상 넘어가지 않음
  • 특수 플래그로 최하위 4비트를 의미하는 니블(Nibble)에서 자리 올림이나 자리 내림이 발생할 때 1로 설정, 주로 이진화 십진법 (BCD, Binary-Coded Decimal) 산술을 지원하는데 사용
  • ZF (Zero Flag) : 상태 플러그
    • 분기와 같은 조건에서 많이 사용
  • 산술 결과가 0이면 1로 설정 그렇지 않으면 0으로 설정
  • SF (Sign Flag) : 상태 플러그
  • 부호 플래그로 값이 양수일 경우 0, 음수일 경우 1로 설정, 최상위 비트가 부호 비트로 사용될 경우 동일한 값을 가짐
  • OF (OverFlow) : 상태 플러그$$word\quad에서\quad127_(10)+127_(10) \quad연산 \ 0111 \ 1111_(2) = 1111 \ 1110_(2) = -2_(10)\0000 \ 0010_(2)의 1의 보수 = 1111 \ 1101_(2)\1111 \ 1101 의 2의 보수 = 1111 \ 1101_(2) + 1 = 1111 \ 1110_(2) = -2$$
  • 연산에 사용되는 비트 수 (ALU 에서 받아서 처리하는 폭) 를 넘어섰을 때 1로 설정

다시 말해서 254가 아닌 -2가 생성되므로 오버플로우 플래그를 설정함으로써 254와 -2 를 구분 (word 기준)

  • TF (Trap Flag) : 제어 플러그
  • 디버깅에서 사용되는 플래그로 1로 설정되면 실행 명령 하나하나 살펴볼 수 있음
  • IF (Interrupt Falg) : 제어 플러그
  • 마스크 가능한 이터럽트의 처리 여부를 결정하는 플래그
  • DF (Direction Flag) : 제어 플러그
  • 저장된 문자열을 왼쪽에서 처리할지 오른쪽에 처리하는지 결정하는 플래그로 0으로 설정되면 낮은 주소부터 높은 주소 바향으로, 1로 설정되면 높은 주소에서 낮은 주소로 처리

명령 포인터 레지스터

  • IP 앞에 32 비트로 확장한 E가 붙어 EIP로 불림
  • CPU는 EIP 레지스터에 정의된 메모리 섹션의 명령을 처리
  • EIP는 JMP 나 CALL 명령으로 수정할 수 있음
  • 공격자가 원하는 메모리 위치를 가리키도록 EIP를 제어할 수 있으며, 메모리에 공격자의 명령을 작성할 수 있다면 시스템을 장악할 수 있음
    • 덮어쓴 EIP 부분을 찾아 원하는 위치로 이동
    • 해당 위치에 공격자의 공격 코드를 삽입
  • 버퍼 오버플로우 공격으로 EIP를 덮어쓸 수 있음
  • EIP 레지스터는 특별한 구조 없이 다음에 실행시킬 명령의 주소를 가짐

4. 인텔 아키텍처의 이해

IA - 32 구조

  • 대부분은 인텔 CPU 기반으로 시스템을 운영
  • x86 , x64 CPU 가 존재
    • IA -64는 IA -32와 호환성을 가지지 않음
    • 호환성을 가지는 모델 개념은 AMD64로 시작
  • 각각 IA -32, IA -64로 표현

IA -32에서 중요한 두가지 요소

  • 주소 공간 (Address Space)최대 64GB 물리 주소 공간 (Physical Address Space) 을 쓸 수 있음
  • 프로그램당 최대 4GB 선형 주소 공간 (Linear Address Space)
  • 기본 프로그램 실행 레지스터 (Basic Program Execution Registers)Byte, Word, Double Word 크기의 기본 산술 연산을 지원
  • 프로그램 흐름 처리, 비트와 바이트 문자열 처리, 메모리 주소 지정 등 수행
  • 8개 범용 레지스터, 6개 세그먼트 레지스터, EFLAGS 레지스터, 명령 레지스터로 구성

5. 메모리 구조

메모리 구조 개요

메모리 정의

  • 프로그램 실행을 위한 데이터 및 코드가 들어 있는 영역
  • 메모리 구조 개요같은 프로그램일지라도 메모리 관리에 따라 성능 차이 발생
  • 메모리 관리가 되지 않은 경우 성능 저하 발생
  • 가장 효율성 있게 정보를 저장하고 검색할 수 있도록 데이터 저장소를 구현하는 방법

선형 주소 공간 (Linear Address Space) - 분할된 메모리 모델의 핵심

  • 주로 가상 메모리로 불리며, 디버깅 할 때 볼 수 있는 주소
  • 최대 4GB로 구성
  • 32비트 CPU 에서만 선형 주소 공간을 쓰기 때문
  • 낮은 주소부터 높은 주소로 표현
  • 하나의 프로그램의 커널, 힙, 스택, 텍스트 등 영역들로 분할
  • 커널과 사용자 영역의 크기는 일정한 규칙을 가짐(4GT 모드) 커널 : 사용자 = 1GB : 3GB
    • 4GT 는 4-Gigabyte-Turning 의 약자로 응용프로그램 메모리 터닝 또는 /3GB 스위치로 불림
    • 무조건 좋다고 할 수 없음 - 운영체제 운영에 메모리가 부족할 수 있음
    • 운영체제에 따라 CPU 아키텍처에 따라 설정 (PAE)에 따라 커널과 유저의 크기는 달라질 수 있음
  • (일반 모드) 커널 : 사용자 = 2GB : 2GB

Linux , Windows 98/Me 메모리 구조

Windows 2000 계열 메모리 구조

텍스트 (Text) == 코드 (Code) 영역 :
실핼할 프로그램의 코드가 저장되는 영역

데이터 (Data) 영역 :
전역변수, 정적(Static) 변수 등이 저장되는 영역
초기화 된 데이터 영역 과
초기화 되지 않은 데이터 영역 (BSS) 구분

힙 (Heap) 영역 :
메모리 동적 할당 시 데이터가 저장되는 영역
높은 주소 방향으로 데이터 증가

스택 (Stack) 영역 :
지역변수, 매개변수 등의 임시 데이터가 저장되는 영역
후입선출 (LIFO)
낮은 주소 방향으로 데이터 증가

메모리 상에서 힙 영역, 스택 영역

  • 힙과 스택 영역이 서로 반대로 데이터를 채워 나가기 때문에 서로의 영역을 침범할 수 있음
         1) Stack Overflow : 스택이 힙 영역을 침범함
         2) Hip Overflow : 힙이 스택 영역을 침범함 왜 스택은 높은 주소에서 낮은 주소로 채워질까?
  • 함수가 호출될 때 필요한 스택 메모리를 할당받는데, 이것은 함수 반환 후에 사용했던 해당 스택 메모리를 반환하여  전체적인 스택 메모리 상의 변경이 없어야 하기 때문이다.

                    -> 결과적으로 제일 중요한 커널 영역을 침범하지 않으면서 전체적인 영역을 일정하게 차지하기 위해.

'System > basics' 카테고리의 다른 글

운영체제 해킹  (0) 2021.08.12
가상화 기술의 이해  (0) 2021.07.16
시스템의 기초  (0) 2021.07.08

+ Recent posts