개인공부

2017. 12. 11. 20:310x03 Reversing Theory

728x90

운영체제에는 2가지의 모드가 있다. 

1. 사용자모드

2. 커널모드 


그리고 모드 비트(mode bit)라는 것이 있는데 이 비트 값에 따라 현재 운영체제의 모드를 알 수가 있다. 

커널 모드일 경우는 0

사용자 모드일 경우는 1이다. 


이 모드 비트(mode bit)로 인해 운영체제를 위하여 실행되는 작업과 사용자를 위해 실행되는 작업을 구분할 수 있는 것이다.


운영체제는 트랩(trap)이라는게 존재한다.

CPU 자기 스스로 인터럽트를 거는 행동이다. 이 행동의 예시로는 유효하지 않은 메모리에 접근(REVERSING.KR 풀 때 인라인 어셈 작성 시 올바르지 않은 주소를 참조했었던 경험이 있다), 0으로 나누기(divide by zero)등이 있다. 

이러한 행동을 하면 CPU는 자기 자신을 인터럽트 시킨다.


그리고, 중요한 사실은 트랩이나 인터럽트가 발생할 때 하드웨어는 사용자모드 -> 커널모드로 전환되게 된다. (mode bit가 0이 된다는 것과 일치)


시스템은 사용자 프로그램으로 제어를 넘기기 전에 항상 사용자 모드(mode bit = 1)로 전환한다. 


mode bit가 존재하는 이유는 "잘못된 사용자로부터 운영체제를, 그리고 잘못된 사용자 서로를 보호하기 위해서이다" 

악영향을 끼칠 수 있는 명령에 "특권 명령(privileged instruction)을 지정" 하게 되면 권한이 없는 자는 행동을 수행할 수가 없어진다.


특권 명령은 "커널 모드"에서만 이루어 져야한다. 만약 사용자모드에서 버릇없이 커널 모드에서 일어나는 행동을 시도하면 트랩이라는 경찰을 소환하여 명령을 수행하지 못하게 저지하게 된다.


특권 명령의 예

커널 모드로 전환

입/출력 제어

타이머 관리

인터럽트 관리 


시스템 호출은 사용자 프로그램이 자신을 대신하여 운영체제가 수행하도록 예약되어 있는 작업들을 운영체제에게 요청할 수 있는 방법을 제공하게 된다. 

시스템 호출은 컴퓨터 시스템의 처리기가 지원하는 기능에 따라 다양한 방법으로 호출된다. 

어떠한 형태를 가지든 시스템 호출은 운영체제에 의해 수행 될 동작을 사용자 프로세스가 요청할 수 있게 한다. 

시스템 호출은 일반적으로 인터럽트 벡터의 특정 위치로 트랩을 거는 형태를 취한다. 

이 트랩은 보통 trap 명령어를 통해 수행되지만, 몇몇 시스템은 syscall이라는 명령어를 사용한다. 


프로그램과 프로세스는 엄연히 다르다.


프로그램 : 디스크에 저장된 파일의 내용과 같이 "수동적" 개체

프로세스 : 다음 수행할 명령을 지정하는 프로그램 카운터를 가진 "능동적" 개체 => "현재 실행 중인 것"


프로세스의 수행은 반드시 순차적이어야한다. CPU는 그 프로세스가 끝날 때 까지 그 프로세스의 명령들을 차례대로 수행한다. 따라서 두 개의 프로세스가 동일한 프로그램과 연관되어 있더라도, 그들은 두 개의 별도의 수행 순서로 간주된다.

따라서 두 개의 프로세스가 동일한 프로그램과 연관되어 있더라도, 그들은 두 개의 별도의 수행 순서로 간주된다. 다중 쓰레드 프로세스는 복수개의 프로그램 카운터를 가지고 있으며 이 카운터들은 각 쓰레드가 실행할 다음 명령어를 가리키게 된다.


운영체제의 "프로세스 관리"에 대한 책임 

사용자 프로세스와 시스템 프로세스의 생성과 제거

프로세스의 일시 중지와 재수행

프로세스 동기화를 위한 기법 제공

프로세스 통신을 위한 기법 제공

교착상태 처리를 위한 기법 제공


주 메모리(RAM)는 CPU가 직접 주소를 지정할 수 있고, 그리고 직접 접근할 수 있는 유일한 대량 메모리이다. 


프로그램이 수행되기 위해서는 절대주소로 MAPPING(매핑,사상)이 되어야 하고, 메모리에 적재되어야 한다. 

프로그램을 수행하면서, 이러한 절대 주소를 생성하여 메모리의 프로그램 명령어와 자료에 접근한다. 결국, 프로그램이 종료되고, 프로그램이 차지하던 메모리 공간은 가용으로 선언되고, 다음 프로그램이 적재되어 수행될 수 있다. 


캐싱(caching)

"빠른 장치"인 캐시는 은근 중요한 녀석이다.

만약 A라는 정보가 필요한데, 이 A라는 정보가 캐시안에 저장되어 있으면 바로 캐시에서 꺼내서 A정보를 얻을 수 있지만,

캐시에 저장되어 있지 않은 정보면 RAM까지 가서 그 정보를 가져와야 한다. 

캐시에 저장되어 있는 정보를 이용하게 되면 "시간소요가 줄어든다"

그리고, 한번 RAM에 갔다오면 이제 이 정보는 자주 쓰이겠구나 하고 판단되어 캐시에 저장하게 된다.