2018의 게시물 표시

IA-32 Register

** 읽어주세요 ** 이 내용은 '리버싱 핵심 원리'책에서 대부분 참고했습니다. 이 글보다는 직접 책을 읽으시는 것을 추천드립니다.  책에 대한 자세한 정보를 얻고 싶으시다면 여기로 레지스터는 CPU 내부에 존재하는 다목적 저장 공간이다 . 우리가 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory) 와는 그 성격이 다르다 . CPU 가 RAM 에 있는 데이터를 액세스하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다 .   어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들이다 . 하지만 , 정작 레지스터를 모르면 명령어 자체도 이해하기 힘들다 .   IA-32 는 지원하는 기능도 무척 많고 , 그만큼 레지스터의 수도 많다 . 애플리케이션 디버깅의 초급 단계에서는 Basic program execution register 에 대해서 알아두어야 한다 . 디버깅을 할 때 가장 많이 보게 될 레지스터이기 때문이다 .   Basic program executeion registers 는 다시 4 개의 그룹으로 나눌 수 있다 . 범용 레지스터 (General Purpose Registers) (32bit – 8 개 ) 세그먼트 레지스터 (Segment Registers) (16bit – 6 개 ) 프로그램 상태와 컨트롤 레지스터 (Program Status and Control Register) (32bit – 1 개 ) Instruction Pointer (32 비트 – 1 개 )   먼저 범용 레지스터에 대해서 설명하겠다 . 범용 레지스터는 이름처럼 범용적으로 사용되는 레지스터들이다 . IA-32 에서 범용 레지스터들의 크기는 각각 32 비트 (4 바이트 ) 이다 . 특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 하고 , 또한 어떤 레지스터들은 특수한 용도로 사용되기...

공유 메모리란?

자료 조사한 곳 : https://www.joinc.co.kr/w/Site/system_programing/IPC/SharedMemory 공유 메모리란 무엇인가?   모든 프로세스들은 자신이 업무를 수행하기 위해 , 필요한 자료를 저장하기 위해 그에 맞는 메모리 공간 을 가지게 된다 . 그 메모리 공간 안에는 CPU 가 처리하는 명령어들 , 프로그램 시작시 정의되고 초기화된 데이터 , 프로그램 시작 시 정의는 되었지만 초기화 되지 않은 데이터 (BSS), 함수 호출에 필요한 정보 , 동적 할당이 이루어지는 데이터 등이 들어가게 된다 . 프로세스는 이러한 데이터를 저장하고 사용하기 위한 메모리 공간을 커널 ( 하드웨어의 자원을 자원이 필요한 프로세스에 나눠주고 , 프로세스 제어 (task maneger), 메모리 제어 , 프로그램이 운영체제 요구하는 시스템 콜 등을 수행함 ) 에 요구해서 할당받아 사용하게 되는데 . 이 메모리공간은 기본적으로 이 메모리를 요청한 프로세스만 접근 가능하도록 한다 . 하지만 여러 개의 프로세스가 특정 메모리 공간을 동시에 접근해야 할 필요성 을 가질 때가 있다 . 공유 메모리는 이러한 작업을 위한 효율적인 방법을 제공한다 .   * 공유메모리는 여러 IPC( 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로 ) 중에서 가장 빠른 수행속도 를 보여 준다고 한다 . 그 이유는 하나의 메모리를 공유해서 접근하게 되므로 , 데이터 복사 같은 불필요한 오버헤드가 발생하지 않기 때문에 빠른 데이터의 이용이 가능하다 . 하지만 하나의 프로세스가 메모리에 접근 중에 있을 때 , 다른 프로세스가 메모리에 접근하는 일이 발생할 경우에는 데이터가 훼손될 수 있으므로 , 한 번에 하나의 프로세스가 메모리에 접근하고 있다는 것을 보증해 줄 수 있어야 한다 . 이러한 작업을 위해 UNIX(:12) 에서는 Semaphore(:12) 라는 또 다른 공유자원을 제어할 ...