운영체제는 어플리케이션의 입장에서 보면 여러 어플리케이션이 공통으로 사용되는 기능을 API와 시스템 호출로 제공하는 라이브러리와 같다.

 

멀티태스크 운영체제가 해야 할 일

프로세스 관리 - 어플리케이션에 CPU시간을 나누어 준다

메모리 관리 - 다른 어플리케이션에서 사용하는 메모리 영역에 간섭하지 못하도록 한다.

외부기억장치 관리 - 하드 디스크 같은 외부 기억장치에 대한 접근 관리

파일 관리 - 어플리케이션이 파일로 다루어지는 데이터를 마음대로 쓸 수 없게 한다

 

CPU가 운영체제를 위하여 제공하는 기능

1. 특권레벨

어떤 시점에서 CPU의 상태를 나타내는 것으로, CPU가 어떤 명령어를 실행할 수 있고 어떤 메모리 영역에 참조 할 수 있는지 권한을 나타내는 정도이다.

현재 동작중인 특권레벨을 CPL ( Current Privilege Level ) 이라고 하며, 숫자가 낮을수록 권한은 높아진다.

x86 프로세서에는 0에서 3까지의 특권레벨이 있으며, 0은 커널의 코드를 실행하는 특권레벨, 3은 애플리케이션의 코드를 실행하는 특권레벨이다.

 

명령어 중에 HLT CPU CPL 0일 때만 실행이 가능하다.

메모리 세그먼트의 DPL CPL과 일치할 때만 세그먼트에 접근 할 수 있다.

(CALL  JMP 명령어를 이용하여 CPL을 참조하고자 하는 메모리 세그먼트의 DPL로 바꿀수 있다.)

Windows Linux는 세그먼트에 의한 메모리 보호 기능을 일부만 사용하며, 페이징을 이용하여 메모리를 보호한다.

 

2. 세그먼트의 속성과 디스크립터 테이블

각 세그먼트의 정보를 기술한 것으로 ,세그먼트의 수 만큼 나열된다.

크기는 각 8바이트며, 메모리 영역의 선두 주소, 세그먼트 크기, 세그먼트 속성을 설정할 수 있다.

글로벌 디스크립터 테이블인 GDT와 로컬 디스크립터 테이블 LDT가 있다.

 

LDT

태스크 전환에 연동되어 전환이 가능한 테이블이며, 애플리케이션 고유한 세그먼트를 정의할 때 사용된다.

LDT의 위치를 나타내는 디스크립터를 GDT에 기술한 뒤 LDTR레지스터에 등록할 수 있다.

 GDT 참고 : OS 개발 / 3. Protected Mode 1 3. GDT (http://0x200.tistory.com/entry/3-Protected-Mode-1)

3. I/O 특권레벨

 

애플리케이션에 메모리 외의 I/O 포트에 접근하는 것을 제한한다.

WindowsNT/2000/XP LINUX와 같은 대부분의 운영체제는 I/O 포트에 대한 읽기와 쓰기가 금지되어 있다.

 

EPLAGS 레지스터에 IOPL 값을 설정하여 I/O 포트로 접근을 제한한다.

IOPL 값을 변경할 수 있을 때는 오직 특권레벨이 0일 때이다.

 

접근 금지된 어플리케이션이 I/O 포트에 접근하려고 하면 CPU에서 예외를 발생시켜 운영체제로 제어를 넘긴다.

 

4. 콜게이트와 소프트웨어 인터럽트

사용자 모드에서 커널모드로 전환하는 방법은 다음과 같으며, 진하게 표시된 첫번째 두번째 방법이 API 호출에 사용된다.

 - 콜게이트를 경유

 - 소프트웨어 인터럽트(트랩)

 - 태스크 전환

 - 하드웨어 인터럽트 사용

 

(1) 콜게이트

컴퓨터 시작시에 글로벌/로컬 디스크립터 테이블에 게이트 디스크립터를 만들어서 준비하여야 한다.

실행

세그먼트 셀렉터에 콜게이트 인덱스 설정

CALL 명령어 실행

 - 콜게이트에 지정된 셀렉터 값과 오프셋이 나타내는 주소가 실행

처리 완료시 RET 명령어로 복귀

 콜게이트 참조 : 7. 유저모드 Task Switching (1) – 유저모드와 콜게이트

 (2) 소프트웨어 인터럽트

IDT를 준비하여, 코드의 셀렉터값, 오프셋, 속성을 설정

INT 명령어를 사용하여 인터럽트 실행

 소프트웨어 인터럽트 참조 : 7. 유저 모드 Task Switching (2) – 여러 개의 유저 모드 태스크

 

5. Windows에서의 API 호출 처리 순서

윈도우의 주요 API - kernel32.dll, User32,dll, Gdi32.dll 의 세개의 DLL에 주로 공개

ex ) WriteFile API 사용 예시

 

 

Application

 

1) Win32 진입점, App의 가상주소공간매핑 (사용자 모드에서 동작)

호출

↓호출

 

Kernel32.dll1)

WriteFile API

User32.dll

Gdi32.dll API6)

6) WIN32 고유, 따라서 Kernel32.dll과 달리 Ntdll.dll을 호출하지 않음

 

 

 

2) NT/2000/Xp, WIN32, OS/2, POSIX 공통 처리 부분

Ntdll.dll2)

NtWriteFile3) 함수

 

3)실제로 작업을 처리하는 함수 사용자 모드에서 처리 가능한 작업 후 3), 4)실행  

INT 0x2e4)

 

4) 시스템 서비스의 입구

5) 서비스 번호

 

EAX = XX5)

 

사용자모드

 

 

 

커널모드

 

Ntoskrnl.exe의 디스패치7)

7) 디스패치 테이블을 참조하여 주소를 얻음

 

 

 

 

Ntoskrnl.exe

서비스 루틴

Win32k.sys

서비스 루틴

 

 

6. Windows 애플리케이션 시작

(1) 실행파일 열기

실행 파일을 연 뒤, 파일 매핑 객체를 생성한다.

 

파일 매핑[1]

파일 매핑은 프로세스의 가상 주소 공간의 일부에 파일의 내용을 결합하는 것이다.

결합하기 위해 시스템은 'File mapping Object(파일 매핑 객체)'를 물리 메모리에 생성한다.

즉 파일 매핑 객체는 CPU의 페이징 기능을 이용하여 파일 내용을 주소 공간에 매핑한다.

이 때 결합된 가상 메모리 공간의 일부를 FILE VIEW라고 한다. 프로세스는 file view를 포인터로 접근하여 파일 내용을 참조한다.

파일 매핑을 통해, 파일뷰를 사용하는 방법은 파일이 디스크에 존재하는 것과 달리 메모리에 상주하기 때문에 효율성이 증가된다.

 



내부에서 프로세스를 관리하는 메모리 영역(프로세스 객체)를 생성하여 초기화 하며, 프로세스 모안 정보 프라이머리 액세스 토큰을 생성한다.



프로세스 객체[2]

Process Performance Object는 실행중인 어플리케이션 프로그램과 시스템 프로세스를 모니터 하는 카운터로 구성된다.

Privileged Time, Processor Time, User Time, Page Faults/sec, Page File Bytes, Page File Bytes Peak, Priority Base, Private Bytes, Working Set, Creating Process ID, Elapsed Time, Handle Count, ID Process, IO Data Bytes/sec, IO Data Operations/sec, IO Other Bytes/sec

 

액세스 토큰[3]

프로세스 혹은 스레드의 보안 컨텍스트를 기술하는 객체

프로세스와 연관된 유저 계정의 권한 혹은 identity 포함

언제 생성?

유저가 로그온 할 때, 인가된 패스워드인 경우 생성

유저의 행위에 따라 프로세스가 생성될 때 access token을 복제

언제 사용?

스레드가 securable 객체와 상호작용하거나 권한이 필요한 시스템 태스크를 수행할 때 시스템이 사용

어떤 내용?

The security identifier (SID) for the user's account

SIDs for the groups of which the user is a member

A logon SID that identifies the current logon session

A list of the privileges held by either the user or the user's groups

An owner SID

The SID for the primary group

The default DACL that the system uses when the user creates a securable object without specifying a security descriptor

The source of the access token

Whether the token is a primary or impersonation token

An optional list of restricting SIDs

Current impersonation levels

Other statistics

 

(2) 프로세스의 주소공간 생성

프로세스 고유의 페이지 디렉토리와 페이지 테이블을 준비하여 프로세스의 주소 공간을 설정한다. 운영체제의 일부 영역과 모든 프로세스가 공유하는 페이지를 가지고 있는 페이지 테이블은 기존의 것을 매핑 하며, 새로 생성된 실행 파일의 파일 매핑 객체를 앞서 설정한 프로세스 공간에 매핑 한다.

프로세스가 이용하는 객체의 핸들을 관리하는 테이블을 초기화한다. 부모 프로세스의 핸들을 상속하는 경우, 부모 프로세스의 핸들 테이블을 복제한다.

(3) 메인스레드 생성

프로세스의 메인 스레드를 생성한다. 실행 파일에 설정된 크기에 따라 메인스레드용 스택을 생성한우, 스레드의 컨텍스트 정보를 보존할 영역을 초기화 한다.

스레드 전환 후 실행 시작 주소는 진입점이 아니고 스레드 초기화용 함수 주소로 설정된다. 이때 특권레벨은 커널모드로 설정된다.

(4) 스레드 실행 시작

 (5) 프로세스 초기화 처리

스레드로 제어가 넘어가면 이전에 설정한 스레드 초기화용 함수가 커널모드에서 스레드 로컬 스토리지와 크리티컬 섹션을 초기화 한다.

임포트 테이블을 참조하여 DLL을 로드하고 진입점을 호출하여 DLL 초기화를 한다.

(6) 진입점에서 실행 시작

커널 모드에서 사용자 모드로 특권레벨을 변경하고, 메모리 스택에 실행파일의 진입점 주소를 넣는다.

 

[1] : https://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx

[2] : https://msdn.microsoft.com/en-us/library/ms804621.aspx

[3] : https://msdn.microsoft.com/en-us/library/windows/desktop/aa374909(v=vs.85).aspx


'Operating Systems > Windows' 카테고리의 다른 글

윈도우  (0) 2015.04.23
윈도우 어플리케이션의 구조  (1) 2015.04.21

+ Recent posts