반응형

*시스템이 초기화 되기 시작하면 시스템은 커널을 메모리에 적재시키고 가용 메모리 영역을 확인하게 된다.

 

시스템은 운영에 필요한 기본적인 명령어를 '커널'에서 찾기 때문에 커널 영역은 반드시 저 위치에 있어야 한다.

(스택의 가장 낮은 부분) 운영체제는 하나의 프로세스를 실행시키면, 이 프로세스를 segment 라는 단위로 묶어서 가용 메모리 영역에 저장 시킨다.

 ~> 세그먼트는 하나의 프로세스를 묶은 것으로 실행 시점에 실제 메모리의 어느 위치에 저장될 지가 결정된다. 

 

cs (code segment), ds(data segment), ss(stack segment) Code segment     

 

시스템이 알아들을 수 있는 명령어. 즉, instruction 들이 들어있다. 이것은 기계어 코드로서, 컴파일러가 만들어낸 코드이다.

 

instruction들은 명령을 수행하면서 많은 분기 과정과 점프, 시스템 호출등을 수행하게 되는데 분기와 점프의 경우 메모리 상의 특정 위치에 있는 명령을 지정 해 주어야 한다. 

하지만 segment는 자신이 현재 메모리 상에 어느 위치에 저장될지 컴파일 과정에서는 알 수 없기 때문에 정확한 주소를 지정할 수 없다. 따라서 segment에서는 logical address 를 사용한다. Logical address는 실제 메모리 상의 주소와 mapping되어 있다. 즉, 세그먼트는 segment selector에 의해서 

자신의 시작 위치(offset)를 찾을 수 있고 자신의 시작 위치로 부터의 위치에 있는 명령어를 수행할 지를 결정하게 되는 것이다. 

Physical address = offset(시작위치) + logical address Data segment     

 

프로그램이 실행시에 사용되는 데이터가 들어간다. 여기서 말하는 데이터는 전역 변수들. 

 

프로그램 내에서 전역변수를 선언하면 그 변수가 data segment에 자리잡게 된다. data segment는 다시 네개의 data segment로 나뉘는데 각각 현재 모듈의 data structure, 상위 레벨로 부터 받아들이는 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유 데이터 부분이다. 

 

Stack segment     현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역으로 우리가 사용하는 버퍼가 바로 이 stack segment에 자리잡게 된다. 또한 프로그램이 사용하는 multiple스택을 생성할 수 있고 각 스택들간의 switch가 가능하다. 지역 변수들이 자리 잡는 공간이다. 

 

~> 스택은 처음 생성될 때 그 필요한 크기만큼 만들어지고 프로세스의 명령에 의해 데이터를 저장해 나가는 과정을 거치게 되는데, 이것은 stack pointer(SP)라고 하는 레지스터가 스택의 맨 꼭대기를 가리키고 있다. 

스택에 데이터를 저장하고 읽어 들이는 과정은 push 와 pop 명령어에 의해 수행된다. 레지스터 : CPU가 재빨리 읽고 쓰기를 해야하는 데이터들이므로 CPU 내부에 존재하는 메모리를 사용한다. 이러한 저장 공간을 '레지스터'라 한다. 

 

범용 레지스터 : 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터

→프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터, 4개의 32bit 변수(EAX,EBX,ECX,EDX)

→EAX : 피연산자와 연산 결과의 저장소

→EBX : DS(Data Segment)안의 데이터를 가리키는 포인터

→ECX : 문자열 처리나 루프를 위한 카운터

→EDX : I/O 포인터

→ESI : DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터

→EDI : ES 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는 포인터

→ESP : SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터

→EBP : SS 레지스터가 가리키는 스택상의 한 데이터를 가리키는 포인터

 

세그먼트 레지스터: code segment, data segment, stack segment를 가리키는 주소가 들어있는 레지스터

플래그 레지스터 : 현재 상태나 조건등을 검사하는데 사용되는 플래그

인스트럭션 포인터 : 다음 수행해야 하는 명령이 있는 메모리 상의 주소가 들어가 있는 레지스터

 

 *우리는 세그먼트 레지스터가 가리키는 위치를 바탕으로 우리가 원하는 segment안의 특정 데이터, 명령어들을 정확하게 끄집어 낼수가 있다

 

플래그 레지스터 : 시스템이 리셋되어 초기화 되면 0x00000002 값을 가진다.

c.f 컨트롤 플래그 레지스터 : 상태 플래그, 컨트롤 플래그, 시스템 플래그들의 집합

carry & borrow : 덧셈 연산시 bit bound를 넘어가거나 뺄셈을 하는데 빌려오는 경우

Instruction Pointer

다음 실행할 명령어가 있는 현재 code segment의 offset(시작위치) 값을 가진다. 이것은 하나의 명령어 범위에서 선형 명령 집합의 다음 위치를 가리킬 수 있다. 

→EIP 레지스터를 읽을 수 있는 방법 : CALL instruction을 수행하고 나서 프로시저 스택으로부터 리턴하는 instruction의 address를 읽는다.

 

반응형
,