CPU 레지스터

CPU 내부에 존재하는 다목적 저장 공간

레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터 처리 가능

 

IA-32 Register

Intel Architecure에서 제공하는 레지스터

basic program execution registers, control registers, memory management registers, debug register가  있음

아래 사진은 basic program execution register이고 4개의 그룹으로 나뉨

  • General-Purpose Register (32비트 8개)
  • Segment Register (16비트 - 6개)
  • Program Status and Control Register (32비트 1개)
  • Instruction Pointer (32비트 1개)

General-Purpose Register

범용적으로 사용되는 레지스터

상수/주소 등을 저장할 때 주로 사용

  • EAX : 연산 및 결과 데이터를 위한 누산기
  • EBX : DS 세그먼트 내 데이터 포인터
  • ECX : 문자열 및 루프 카운터
  • EDX : 입출력 포인터
  • EBP : 베이스 포인터
  • ESI : 소스 인덱스
  • EDI : 목적지 인덱스
  • ESP : 스택 포인터

EAX, EBX, ECX, EDX는 주로 산술연산 명령어에서 값의 저장 용도로 많이 사용

ECX는 반복문에서 반복 카운드로 사용됨

EAX는 일반적으로 함수 리턴 값에 사용됨

EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 돌려줌

 

세그먼트 레지스터

세그먼트는 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법

세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용됨

각 세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상 메모리가 조합되어 선형주소가 됨

페이징 기법에 의해서 선형 주소가 최종적으로 물리주소로 변환됨

  • CS : 코드 세그먼트
  • SS : 스택 세그먼트
  • DS : 데이터 세그먼트
  • ES : 추가 데이터 세그먼트
  • FS : 추가 데이터 세그먼트
  • GS : 추가 데이터 세그먼트

 

프로그램 상태와 컨트롤 레지스터

EFLAGS 레지스터는 각각의 비트마다 의미를 가지고 있음

각 비트는 1 또는 0의 값을 가지는데, 이는 On/Off 혹은 True/False를 의미

일부 비트는 시스템에서 직접 세팅하고, 일부는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅됨

  • Zero Flag(ZF) : 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅
  • Overflow Flag(OF) : 부호 있는 수의 오버플로우가 발생했을 때 1로 세팅, MSB(Most Significant Bit)가 변경되었을 떄 1로 세팅
  • Carry Flag(CF) : 부호 없는 수의 오버플로우가 발생했을 때 1로 세팅

 

Instruction Pointer

CPU가 처리할 명령어의 주소를 타나내는 레지스터

EIP의 저장된 메모리 주소의 명령어를 하나 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킴

EIP는 값을 직접적으로 변경할 수 없도록 되어 있어서 다른 명령어를 통해 간접적으로 변경해야 함

 

참고 사항

각 레지스터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어짐

EAX : 32비트

AX : EAX의 하위 16비트

AH : AX의 상위 8비트

AL : AX의 하위 8비트

'문제 풀이 > 하면서 공부했던 내용' 카테고리의 다른 글

리틀 엔디언 표기법  (0) 2024.08.06
file descriptor  (0) 2021.10.16

바이트 오더링

데이터를 저장하는 방식을 말함

빅 엔디언과 리틀 엔디언 방식이 있음

2바이트 이상의 크기를 가진 자료형을 저장할 때부터 차이가 나타남

빅 엔디언 방식은 사람이 보는 방식과 동일하게 앞에서부터 순차적으로 저장

리틀 엔디언 방식은 데이터를 저장할 때 역순으로 저장

 

BYTE	b	= 0x12;
WORD	w	= 0x1234;
DWORD	dw	= 0x12345678;
char 	str[]	="abcde";
TYPE Name SIZE 빅 엔디언 Style 리틀 엔디 Style
BYTE b 1 [12] [12]
WORD w 2 [12][34] [34][12]
DWORD dw 4 [12][34][56][78] [78][56][34][12]
char [] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00]

 

빅 엔디언(Big Endian)

사람과 보는 방식과 동일하게 앞에서부터 순차적으로 저장

사람이 보기에 직관적이라는 장점이 있음

대형 UNIX 서버에 사용되는 RISC 계열의 CPU에서 많이 사용

네트워크 프로토콜에 빅 엔디언이 사용됨

 

리틀 엔디언(Little Endian)

데이터를 저장할 때 역순으로 저장함

바이트 자체는 정상적인 순서로 저장되지만 멀티바이트인 경우 역순으로 저장됨

Intel x86 CPU에서 사용

산술 연산과 데이터의 타입이 확장/축소될 때 더 효율적임

 

'문제 풀이 > 하면서 공부했던 내용' 카테고리의 다른 글

IA-32 Register  (0) 2024.08.06
file descriptor  (0) 2021.10.16

파일 디스크립터

- 시스템으로부터 할당받은 파일을 대표하는 0이 아닌 정숫값

- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

 

 

유닉스 시스템에서는 일반적인 정규파일(Regular File), 디렉터리(Directory), 소켓(Socket), 파이프(PIPE), 블록 디바이스, 캐릭터 디바이스 등 모든 객체는 파일로서 관리된다. 유닉스 시스템에서 프로세스가 이 파일들에 접근할 때 파일 디스크립터라는 개념을 이용한다.

 

프로세스가 실행 중에 파일을 Open 하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않은 가장 작은 값을 할당해 준다. 그다음 프로세스가 열려 있는 파일에 시스템 호출을 이용해서 접근할 때, 파일 디스크립터 값을 이용해 파일을 지칭할 수 있다.

 

프로그램이 프로세스로 메모리에서 실행을 시작 할 때, 기본적으로 할당되는 파일 디스크립터들이 있다. 바로 표준 입력, 표준 출력, 표준 에러이다. 이 들에게 각각 0, 1, 2라는 정수가 할당된다. 0이 아닌 정수로 표현되는 파일 디스크립터는 0 ~ OPEN_MAX 까지의 값을 가질 수 있으며, OPEN_MAX의 값은 플랫폼에 따라 다르다.

 

파일 디스크립터 목적 POSIX 이름 stdio 스트림
0 표준 입력 STDIN_FILENO stdin
1 표준 출력 STDOUT_FILENO stdout
2 표준 에러 STDERR_FILENO stderr

프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다.

 

파일 디스크립터와 열려 있는 파일의 관계

각 프로세스별로 커널은 open file descriptor table을 갖고 있다. 테이블의 각 엔트리는 하나의 파일 디스크립터에 대한 동작 제어 플래그, 열린 파일을 가리키는 참조를 담고 있다.

open file description은 현재 파일의 offset, flag, 접근 모드, I/O 관련 설정, 파일의 i-node 객체를 가리키는 레퍼런스를 갖고 있다.

i-node는 파일 종류(일반 파일, 소켓, fifo)와 권한, lock 목록 포인터, 여러 파일 오퍼레이션과 다양한 파일 속성(크기, 타임스탬프 등)을 갖고 있다.

같은 open file description을 가리키는 2개의 fd는 offset값을 공유한다.

'문제 풀이 > 하면서 공부했던 내용' 카테고리의 다른 글

IA-32 Register  (0) 2024.08.06
리틀 엔디언 표기법  (0) 2024.08.06

+ Recent posts