본문 바로가기

Programming

[Security] Register

728x90
반응형

Register?

레지스터는 CPU 내부에 존재하는 다목적 저장공간이다. CPU가 연산하기 위한 데이터를 저장하며 흔히 메인 메모리라고 하는 램(RAM)과는 달리 CPU와 한 몸으로 있기 때문에 고속 연산이 가능하다. 


IA-32(Intel Architecture 32 bit)의 레지스터


IA-32은 많은 종류의 레지스터가 있다. 


Basic program execution register

- General Purpose Register(32bit - 8개)

- Segment Register(16bit - 6개)

- Program Status and Control Register(32bit - 1개)

- Instruction Pointer(32bit - 1개)


1) General Purpose Register(범용 레지스터)는 이름처럼 범용(막 사용 되는) 레지스터이다. 보통은 상수/주소 등을 저장할 떄 주로 사용되며, 어셈블리 명령어를 사용하여 특정 레지스터를 사용할 수 있다.


 각 레지스터는 몇개의 구역으로 나뉩니다. 이는 레지스터를 효율적으로 사용할 수 있게 해준다. 예를들어 4byte가 필요하다면 EAX를 사용하고 2byte가 필요하면 AX를 사용하면 된다.


각 레지스터의 이름은 다음과 같다.

EAX : Accumulator for operands and results data

EBX : Pointer to data in the DS segment

ECX : Cpunter for string and loop operations

EDX : I/O pointer


위의 레지스터는 주로 산술 연산 명령어(ADD, SUB, XOR, OR 등)에서 상수/변수 값의 저장 용도로 많이 사용한다. 추가적으로 ECX는 반복문 명령어(Loop)에서 반복 카운터로 사용된다. EAX는 일반적으로 함수 리턴값에 사용된다.


EBP : Pointer to data on the stack(in the SS segment)

ESI : source pointer for string operations

EDI : destination pointer for string operations 

ESP : Stack pointer (in the SS segment)


위의 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다. ESP는 스택 메모리 주소를 가리킨다.  EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다.


2) Segment register (세그먼트 레지스터)

세그먼트는 IA-32 보호 모드에서 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법으로 페이징(paging) 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용된다. 세그먼트 메모리는 Segment Descriptor Table(SDT)라고 하는곳에 기술 되어 있는데 세그먼트는 이 SDT의 index를 가지고 있다.



각 세그먼트 레지스터의 이름

CS : Code Segment

SS : Stack Segment

DS : Data Segment 

ES : Extra(Data) Segment

FS : Data Segment

GS : Data Segment


CS는 프로그램의 코드 세그먼트를 나타내며, SS는 스택 세그먼트, DS는 데이터 세그먼트 남어지는 추가지거인 데이터 세그먼트이다. 


3) Program Status and Control Register (프로그램 상태와 컨트롤 레지스터)

플래그(Flag) 레지스터의 이름은 EFLAGS이며 32bit 크기이다. EFLAGS 레지스터는 아래 그림과 같이 각 비트마다 의미를 가지고 있다. 일부 비트는 시스템이 직접 세팅하며, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅 된다.

EFLAGS 레지스터의 모튼 비트의 의미를 다 는 못하고 일단은 3가지 Flag(ZF, OF, CF)에 대해서만 하겠다.


Zero Flag (ZF) :

연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 셋팅 된다.

Overflow Flag (OF) :

부호 있는 수(signed integer)의 오버플로가 발생했을 때 1로 셋팅된다. 그리고 MBS(Most Significant Bit)가 변경 되었을때도 1로 세팅된다.

Carry Flag(CF) :

부호 없는 수(unsigned integer)의 오버플로가 발생했을때 1로 셋팅된다.


4) Instruction Pointer

Instruction Pointer는 CPU가 처리할 명령어의 주소를 나타내는 레지스터로 이름은 EIP 이다. CPU는 EIP에 저장된 메모리 주소의 명령어(instruction)을 하나씩 처리하고 난 후 자동으로 그 명령어 길이만큼 EIP를 증가시킨다. 또한 범용 레지스터와는 다르게 직접 변경할 수 없도록 되어 있어서 다른 명령어를 통해 간접적으로 변경시켜야 한다.

간단하게 말하면, 현재 프로세스가 읽고 있는 현재의 명령 위치이다.

반응형

'Programming' 카테고리의 다른 글

[OS] os architecture  (0) 2014.03.27
[OS] Multiprogramming  (0) 2014.03.16
[OS] OS의 의미와 역할  (0) 2014.03.06
[Algorithm] Lake Counting(POJ No.2386)  (0) 2014.02.18
[Android] Toast로 테스팅 간단히 하기  (0) 2014.02.13