0. MBR/GPT
1. FAT/FAT32/exFAT
2. NTFS
3. EXT2/EXT3/EXT4
4. UFS
0. MBR/GPT
1. FAT/FAT32/exFAT
2. NTFS
3. EXT2/EXT3/EXT4
4. UFS
직업 : 학생
IT 관심 분야 : Kernel, Digital Forensics, Reversing, Malware
그외 관심 분야 : 클래식, 뮤지컬, 수영
취미 : 바이올린 연주, 노트에 끄적이기
특기 : 멍때리기, 엉뚱한데 집착하기, 의식의 흐름
좋아하는 음반 :
조성진 - 쇼팽: 피아노 협주곡 1번, 4개의 발라드 (Chopin: Piano Concerto No.1, Ballades)
1. Windows 객체 윈도우
윈도우는 Windows가 관리하는 객체 중 하나이며, 사용자가 보고 있는 창은 윈도우 객체가 출력된 형태이다.
윈도우의 속성은 구조체로 관리되며 CreateWindow API의 인자와 대응된다.
HWND CreateWindow( // 반환값: 생성된 윈도우 핸들 LPCTSTR lpClassName, // 윈도우 클래스명 LPCTSTR lpWindowName, // 윈도우 이름 DWORD dwStyle, // 윈도우 스타일 int x, // 좌측상단의 x좌표 int y, // 좌측상단의 y좌표 int nWidth, // 수평 방향 크기 int nHeight, // 수직 방향 크기 HWND hWndParent, // 부모 윈도우/소유 윈도우 핸들 HMENU hMenu, // 메뉴 핸들/컨트롤 ID HINSTANCE hInstance, // 인스턴스 핸들 LPVOID lpParam // WM_CREATE 메시지에 넘길 전달 인자 ); |
윈도우의 크기는 픽셀 좌표계로 4~7번째 인자에 지정되며, 윈도우의 위치와 크기를 고정하고 싶을 경우가 아니라면 신경쓰지 않아도 된다.
2. 윈도우 스타일
윈도우 스타일은 윈도우의 외관이나 종류를 정하기 위한 32비트 정수 값이다. 제목표시줄의 유무, 크기 변경 가능 여부 등을 결정할 수 있다.
비트 필드로 정의되어 있으므로, WS_ 상수를 논리 OR 명령어로 조합해서 지정할 수 있다.
스타일 |
해당 윈도우의 구성요소 |
WS_CAPTION |
제목표시줄 |
WS_BORDER |
가는(크기 변경 불가능) 윈도우 프레임 |
WS_DLGFRAME |
대화상자에서 사용하는 윈도우 프레임 |
WS_THCKFRAME |
굵은(크기 변경 가능) 윈도우 프레임 |
WS_HSCROLL |
수평 스크롤바 |
WS_VSCROLL |
수직 스크롤바 |
WS_SYSMENU |
시스템 메뉴, WS_CAPTION과 함께 지정 |
WS_MAXIMIZEBOX |
최대화 버튼,WS_SYSMENU와 함께 지정 |
WS_MINIMIZEBOX |
최소화 버튼, WS_SYSMENU와 함께 지정 |
3. 윈도우 종류
(1) 오버랩 윈도우
애플리케이션의 메인 윈도우로 사용하는 형식
제목 표시줄과 윈도우 프레임이 필수 이며, 최대화/최소화 버튼과 메뉴 표시줄을 가지고 있음
(2) 팝업 윈도우
메인 윈도우 보다 임시 윈도우로 사용되는 경우가 많음
제목 표시줄과 윈도우 프레임이 필수가 아니라는 것을 제외하면 오버랩 윈도우와 동일
(3) 자식 윈도우
메인윈도우가 될 수 없다.
부모 윈도우가 필요하다.
스타일 |
해당 윈도우의 종류 |
WS_OVERLAPPED |
오버랩 윈도우, 제목표시줄과 프레임이 있다 |
WS_POPUP |
팝업 윈도우 |
WS_CHILD |
자식 윈도우, 메뉴 표시줄을 사용하지 못한다 |
WS_OVERLAPPEDWINDOW |
WS_OVERLAPPED 에 WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MAXIMIZEBOX, WS_MINIMIZEBOX를 조합한 윈도우 |
WS_POPUPWINDOW |
WS_POPUP에 WS_BORDER와 WS_SYSMENU를 조합한 윈도우로, WS_CAPTION을 조합했을 경우에만 메뉴가 나옴 |
WS_CHILDWINDOW |
WS_CHILD와 같음 |
4. 부모 윈도우 자식윈도우
CreateWindow API에 hWndParent의 부모 윈도우 핸들을 지정하면 자식 윈도우가 생성
부모 윈도우의 클라이언트 영역의 바깥쪽에 출력하거나 이동 불가능
자식 윈도우는 부모 윈도우의 클라이언트 영역을 여러 개로 분할 하여 다른 기능으로 사용가능
5. 소유/피소유 의존관계
부모/자식 관계와 공통점 : 닫거나 최소화 하면 자동으로 닫히거나 최소화
부모/자식 관계와 차이점 : 표시 영역이 소유 측 윈도우의 내부로 한정(소유 윈도우를 캔버스로 비유할 수 있음)
소유관계 설정
CreateWindow API에 윈도우 스타일에 WS_CHILD를 설정하지 않으면서 hWndParent에 소유 윈도우 핸들 지정
자식 윈도우면서 피소유 윈도우가 될 수 없음
소유 윈도우 생성 후 소유관계 수정 불가(부모/자식 관계에서는 부모 윈도우 변경 가능)
#include<windows.h>
#define MYWNDCLSNAME L"MyWindowClass"
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg){ case WM_DESTROY : PostQuitMessage(0); return 0; }
return DefWindowProc(hWnd, uMsg, wParam, lParam); }
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wndcls; HWND hWnd, hWndOwned, hWndChild; MSG msg;
// 윈도우 클래스 등록 ZeroMemory(&wndcls, sizeof(wndcls)); wndcls.lpfnWndProc = WndProc; wndcls.hInstance = hInst; wndcls.hIcon = LoadIcon(0, IDI_APPLICATION); wndcls.hCursor = LoadCursor(0, IDC_ARROW); wndcls.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wndcls.lpszClassName = MYWNDCLSNAME; if (RegisterClass(&wndcls) == 0) return -1;
// 메인 윈도우 생성 hWnd = CreateWindow(MYWNDCLSNAME, L"Main Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, 0, 0, hInst, NULL); if (hWnd == 0) return -2;
// 자식 윈도우 생성 hWndChild = CreateWindow(MYWNDCLSNAME, L"Child Window", WS_CHILDWINDOW | WS_CAPTION | WS_VISIBLE, 0, 0, 200, 100, hWnd, 0, hInst, NULL); if (hWndChild == 0) return -2;
//피소유 윈도우 생성 hWndOwned = CreateWindow(MYWNDCLSNAME, L"Ownd Window", WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE, 0, 0, 200, 100, hWnd, 0, hInst, NULL); if (hWndOwned == 0) return -2;
ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
// 메시지 루프 while (GetMessage(&msg, 0, 0, 0)){ DispatchMessage(&msg); }
return msg.wParam; } |
위 소스를 실행 하였을 때, 다음과 같이 Child Window의 경우 Main Window안에서 이동할 수 있으며, Owned Window 같은 경우, Main Window 밖으로 이동이 되는 것을 볼 수 있다.
1. 컨트롤 ID와 자식 윈도우
hMenu 인자는 자식 윈도우의 상태에 따라 의미가 달라지며 컨트롤 ID 역할을 수행한다.
hMenu인자는 자식 윈도우가 아닐 경우에는 원래 윈도우 클래스에서 지정한 것과 다른 메뉴를 설정할 때 사용되며, 윈도우 클래스에서 지정한 값과 같을 때는 0을 가진다.
컨트롤 아이디
자식 윈도우를 식별하는 32비트 정수 값으로, 대화 상자에 배치된 컨트롤을 식별할 때 쓰일 수 있다.
CreateWindow API의 결과로 받은 윈도우 핸들은 프로그래머가 무슨 값이 될 지 예상하기 힘들지만 컨트롤 아이디는 프로그래머가 원하는 값을 할당할 수 있다.
GetDlgItem API를 사용하여 컨트롤 ID에 대응하는 핸들을 얻어올 수 있어, 윈도우 핸들을 보존하지 않아도 된다.
프로그래머는 컨트롤 ID의 유일성이 지켜지도록 컨트롤 ID를 부여하여야 한다.
2. SetWindowsPos
SwhoWindow API
윈도우의 출력 상태 설정을 하며, 윈도우 생성 직후 외에 실행중에도 출력상태를 변경하기 위해 호출 할 수 있다.
BOOL Showwindow( // 반환값 : 성공이면 TRUE HWND hWnd, // 대상 윈도우 핸들 int nCmdShow // 설정할 출력 상태 ); |
상수 |
의미 |
SW_HIDE |
윈도우를 숨기고, 다른 윈도우를 활성 상태로 전환 |
SW_MAXIMIZE |
윈도우를 최대화 |
SW_MINIMIZE |
윈도우를 최소화하고 다른 윈도우를 활성 |
SW_RESOTRE |
최대/최소화를 원래 상태로 복원 |
SW_SHOW |
윈도우를 나타내고 활성 상태로 만듬 |
SW_SHOWNA |
윈도우를 나타내고 활성 상태로 하지 않음 |
SW_SHOWDEFAULT |
윈도우를 처음 프로그램 시작할 때 지정된 값으로 변경 |
SW_SHOWNORMAL |
윈도우를 나타내고 활성 상태로 전환 최대화/최소화 경우에 복원 |
SW_SHOWACTIVATE |
윈도우를 활성 상태로 하지 않는 것을 하고 SW_SHOWNORAML과 같음 |
윈도우 Z의 순서
ShowWindow는 윈도우를 보여주는 방법에서 여러 윈도우가 있을 때 깊이 방향 위치의 요소를 포함한다.
(여러 윈도우가 겹쳐 있을 때 어느 윈도우 내용이 표시되는지에 대함)
Windows에서 각 윈도우를 생성할 때나 마우스로 윈도우를 선택할 때 윈도우 z 순서를 설정
- 마우스로 윈도우 클릭했을 때
활성 윈도우는 윈도우z의 순서가 맨 위인 것이다.
Z순서의 명시적 설정 – SetWindowPosAPI 사용
윈도우의 크기, 위치, 크기, Z순서를 한꺼번에 설정할 수 있으며, uflags에 플래그를 설정하는 방법으로 위치나 z 순서만 설정할 수도 있다.
BOOL SetWindowPos ( // 반환값: 성공이면 TRUE HWND hWnd, // 대상 윈도우 핸들 HWND hWndInsertAfter, // z순서상 바로 위에 있는 윈도우 핸들 int x, // 윈도우 좌측상단의 x좌표 int y, // 윈도우 좌측상단의 y좌표 int cx, // 윈도우 폭 int cy, // 윈도우 높이 UINT uFlags // 설정할 상태의 종류 ); |
플래그 |
의미 |
SWP_HIDEWINDOW |
윈도우를 숨긴다 |
SWP_NOACTIVATE |
윈도우를 활성화하지 않는다 |
SWP_NOMOVE |
윈도우를 이동하지 않는다 |
SWP_NOOWNERZORDER |
소유 윈도우의 Z 순서를 변경하지 않는다 |
SWP_NOREDRAW |
윈도우를 다시 그리지 않는다 |
SWP_NOSIZE |
윈도우의 크기를 변경하지 않는다 |
SWP_NOZORDER |
윈도우 Z의 순서를 변경하지 않는다 |
SWP_SHOWNDOW |
윈도우를 나타낸다 |
윈도우 어플리케이션의 구조 (1) | 2015.04.21 |
---|---|
API로 배우는 커널 - 1.운영체제 구조 (0) | 2015.04.12 |
개발이 너무 너무 약한거 같아서 ㅋㅋㅋ 개발 공부하려고 책을 질렀다
보안도 제대로 못하면서 개발이라니 ㅋ
아니 사실은 개발을 제대로 못하니깐 보안도 못하는 거겠지 ㅋㅋㅋㅋㅋㅋ
거기다 C++ 이라니ㅋㅋㅋ
차라리 C#을 하는게 더 이득인거 같기도 하고 ㅋ
뭔가 망테크 진입하는 기분이다 ㅋㅋㅋㅋㅋㅋ
이 기회에 프로그래밍 확실히 잡아야지
책상 사진은 책상 좀 효율적으로 써보겠답시고 독서대를 산 김에 정리정돈한 기념으로 ㅋㅋㅋㅋ
나무 향기가 은은해서 기분도 좋아짐 ㅋㅋ
여튼 ㅋㅋ
나님 화이팅 !!
백수 25일 차 - ㅜㅜ 죽을맛이다 (2) | 2015.03.26 |
---|---|
백수 10일차 - 이게 바로 도구 낭비 (0) | 2015.03.13 |
백수8일차 - 스펙이라는 거 말야 (2) | 2015.03.10 |
백수 1일차 - 여긴 어디 난 누구 (0) | 2015.03.04 |
1. 이벤트 반응형
콘솔에서 동작하는 프로그램은 순차적으로 실행을 하지만, GUI 프로그램은 메뉴 선택, 클릭 등의 사용자에 의해 생긴 이벤트에 따라 코드가 실행된다
이벤트 반응형
사용자 조작으로 이벤트가 발생하고 대응되는 처리를 하는 프로그램 형식
이벤트의 발생
하드웨어의 장치 드라이버에서 마우스나 키보드 등의 이벤트를 감시하여 이벤트를 이벤트 처리 대기 행렬(시스템 행렬)에 추가하여 Window에 통지
Windows에서 필요에 따라 애플리케이션에 알림
큐에서 꺼낸 이벤트 정보와 그 시점의 애플리케이션의 상태를 이용하여 이벤트가 통지될 애플리케이션 결정
2. 메시지
애플리케이션 윈도우에 이벤트 통지하기 위한 데이터 구조체
typedef struct tagMSG { HWND hwnd; // 윈도우 핸들 UNIT message; // 메시지 ID WPARAM wParam; // 메시지 전달인자 1 LPARAM lParam; // 메시지 전달인자 2 DWORD time; // 이벤트 발생 시각 POINT pt; //이벤트 발생 시 커서 위치 } MSG, *PMSG; |
1) 윈도우 핸들
메시지의 행선지가 될 윈도우를 식별하는 정수 값
윈도우 핸들 값을 조사하여 조작 대상 윈도우 구별
2)
메시지 ID
메시지의
종류를 나타내는 아이디
일반적으로 ‘WM_’으로 시작되는 ID 수백 개 정의
발생한 이벤트의 종류 알아낼 수 있음
3) 메시지 전달 인자 1 & 메시지 전달 인자 2
메시지의 전달 인자
메시지의 종류에 따라 의미 상이
4) 이벤트 발생 시각
5) 이벤트 발생 시 커서 위치
메시지 큐에서 메시지를 꺼내 처리하는 것을 반복한다 (메시지 루프)
3. 윈도우 프로시저
메시지의 행선지인 윈도우의 윈도우에 관련된 특별함수(윈도우 프로시저)에서 메시지 처리
윈도우 프로시저가 Windows가 직접 호출함으로, 정해진 규약이 있음 -> CALLBACK
- 인자 4개
- MSG 구조체 멤버와 대응
LRESULT CALLBACK WindowProc ( HWND hwnd, // 윈도우 핸들 UINT uMSG, // 메시지 ID WPARAM wParam, // 메시지 전달 인자1 LPARAM lParam // 메시지 전달 인자2 ); |
윈도우 클래스
동일한 기능을 하는 윈도우가 여러 개 존재 할 경우, 윈도우 클래스로 그룹화하여 윈도우 프로시저로 여러 윈도우 처리
윈도우 클래스와 윈도우의관계는 클래스와 인스턴스의 관계
같은 윈도우 프로시저 공유
윈도우 클래스 등록
애플리케이션의 메인 윈도우로 사용할 수 있는 윈도우 클래스는 미리 제공되지 않아, 직접 생성하는 윈도우 클래스는 직접 등록
4. WinMain
#include <Windows.h> //(1)
#define MYWNDCLSNAME L"MyWindowsClass"
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParma);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) //(2) { WNDCLASS wndcls; HWND hWnd; MSG msg;
//윈도우 클래스 등록 (3) ZeroMemory(&wndcls, sizeof(wndcls)); wndcls.lpfnWndProc = WndProc; wndcls.hInstance = hInst; wndcls.hIcon = LoadIcon(0, IDI_APPLICATION); wndcls.hCursor = LoadCursor(0, IDC_ARROW); wndcls.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wndcls.lpszClassName = MYWNDCLSNAME; if (RegisterClass(&wndcls) == 0) return -1;
// 메인 윈도우 생성 (4) hWnd = CreateWindow(MYWNDCLSNAME, L"My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInst, NULL); if (hWnd == 0) return -2; //(5)
// 윈도우 초기 출력 상태 지정 ShowWindow(hWnd, nCmdShow); //(6) UpdateWindow(hWnd); //(7)
//메시지 루프(8) while(GetMessage(&msg, 0, 0, 0)){ DispatchMessage(&msg); }
//WM_QUIT 메시지의 wParam을 종료 코드로 한다. return msg.wParam; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //(9) { switch (uMsg){ case WM_DESTROY : PostQuitMessage(0); return 0; } // 직접 처리하지 않은 메시지는 Windows에 맡긴다 return DefWindowProc(hWnd, uMsg, wParam, lParam); } |
(1) Windows.h
Win32 API를 C언어 함수에서 호출할 때 필요한 프로토타입 선언이 들어 있음
(2) WinMain
Windows GUI 애플리케이션이 실행될 때 제일 먼저 실행되는 함수
hInst
실행중인 애플리케이션을 식별하는 정수값(인스턴스 핸들)
Win32에서는 이 값으로 애플리케이션 식별 불가능
애플리케이션 자체를 참조하기 위해 인자로 사용하는 경우 등 필요한 경우가 있어 전역 변수로 보존
hPrevInst
16비트 Windows에서 동일한 애플리케이션이 이미 실행중일 대 먼저 실행된 애플리케이션의 인스턴스 핸들이 저장됨
Win32에서는 항상 0
호환성을 위해 유지
lpCmdLine
명령행 문자열의 포인터로, main argv와 달리 스스로 문자열 해석해야함
nCmdShow
메인 윈도우의 최초 출력 상태를 지정
(3) 윈도우 클래스
(4) 윈도우 클래스 등록
RegisterClass API로 윈도우 클래스를 등록
등록하려는 윈도우 클래스 정보를 WNDCLASS 구조체에 저장하여 RegisterClass에 WNDCLASS 주소를 인자로 넘김
typedef struct _WNDCLASS{ UINT style; // 윈도우 클래스 스타일 WNDPROC lpfnWndProc; // 윈도우 프로시저의 주소 int cbClsExtra; // 윈도우 클래스의 추가 데이터 크기 int cbWndExtra; // 윈도우의 추가 데이터 크기 HINSTANCE hInstance; // 윈도우 프로시저를 소유한 프로그램의 // 인스턴스 핸들(대부분 자기자신) HICON hIcon; // 애플리케이션 아이콘 HCURSOR hCursor; // 마우스 커서 HBRUSH hbrBackground; // 윈도우 배경색 LPCTSTR lpszMenuName; // 메뉴 리소스명 LPCTSTR lpszClassName; // 이 윈도우의 클래스 등록명 } WNDCLASS, *PWNDCLASS; |
(5) 윈도우 생성
CreateWindow API에 윈도우 클래스의 이름, 윈도우의 이름, 윈도우 속성을 인자로 넘김
WS_OVERLAPPEDWINDOW - 메인 윈도우에서 주로 사용되는 윈도우 속성의 상수
CW_USEDEFAULT
윈도우를 출력하는 위치와 윈도우 크기를 Windows에 맡김
부모윈도우와 메뉴핸들은 0을 넘김
CreateWindow
윈도우 생성에 성공하면 윈도우 핸들 반환
반환값이 0일 경우 윈도우 생성이 실패했음을 의미하므로 애플리케이션 종료
ShowWindow
생성한 윈도우의 출력 상태를 설정하는 API
UpdateWindow
실제로 윈도우를 그리는 API
(6) 메시지 루프
GetMessage
메시지 큐에서 메시지를 꺼냄
MSG 구조체의 주소에 꺼내온 메시지 정보를 저장
BOOL 형태의 반환값을 가지며, 애플리케이션 종료를 의미하는 WM_QUIT 메시지를 꺼냈을 때만 FALSE 메시지 반환
DispatchMessage
MSG의 hWnd 멤버를 참조하여 윈도우 프로시저를 윈도우에 호출 요청
(7) DefWindowProc
메시지의 종류가 매우 많으므로 애플리케이션 고유의 처리를 원하는 메시지를 제외하고 DefWindowProc API에서 기본 처리
PostQuitMessage
WM_DESTROY 메시지를 DefWindowProc을 호출하여 처리할 경우, 윈도우만 종료되고 애플리케이션을 종료하지 않기 때문에 따로 처리
WM_QUIT 메시지를 메시지큐에 추가하는 API
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg){ case WM_LBUTTONDOWN: MessageBox(hWnd, L"Hello, World", L"Message", MB_OK | MB_ICONINFORMATION); case WM_DESTROY : PostQuitMessage(0); return 0; } // 직접 처리하지 않은 메시지는 Windows에 맡긴다 return DefWindowProc(hWnd, uMsg, wParam, lParam); } |
윈도우 (0) | 2015.04.23 |
---|---|
API로 배우는 커널 - 1.운영체제 구조 (0) | 2015.04.12 |
운영체제는 어플리케이션의 입장에서 보면 여러 어플리케이션이 공통으로 사용되는 기능을 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 명령어로 복귀
(2) 소프트웨어 인터럽트
IDT를 준비하여, 코드의 셀렉터값, 오프셋, 속성을 설정
INT 명령어를 사용하여 인터럽트 실행
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
윈도우 (0) | 2015.04.23 |
---|---|
윈도우 어플리케이션의 구조 (1) | 2015.04.21 |
오늘 점심에... 점심이 늦어져서 서둘렀다
김치 고등어 조림을 하려고 했는데 재로 준비 다했더니
육수를 준비안했다 ㅋ 육수 끓여서 넣고
그럭저럭 다 된거 같아서 밥 푸려고 보니깐 밥솥에 밥이 없다 ㅋ
어떻게 해서 상 내갔더니 고등어가 덜 익었다 ㅋ
밥 먹고 뒷정리 하고 나오니깐 3시.. 오 ㅋ 정신 없어 ㅋ
그래서 자소서 어떻게 할건데...!!!!!!!!!!!!
자소서 3시간째 붙잡고 있는데 단어 하나 못썼다
아 망했네 ㅋㅋㅋ 진짜
어쩌려고 ㅋㅋㅋㅋ
이번주 토요일이 토익 스피킹 시험날인데
공부 안하고 어쩔꺼냐고 ㅋㅋㅋㅋㅋ
백수 53일차 (0) | 2015.04.22 |
---|---|
백수 10일차 - 이게 바로 도구 낭비 (0) | 2015.03.13 |
백수8일차 - 스펙이라는 거 말야 (2) | 2015.03.10 |
백수 1일차 - 여긴 어디 난 누구 (0) | 2015.03.04 |
백수 53일차 (0) | 2015.04.22 |
---|---|
백수 25일 차 - ㅜㅜ 죽을맛이다 (2) | 2015.03.26 |
백수8일차 - 스펙이라는 거 말야 (2) | 2015.03.10 |
백수 1일차 - 여긴 어디 난 누구 (0) | 2015.03.04 |
소위 취업을 위해 스펙이라고 하는 것들
어학연수, 봉사활동,어학점수, 자격증, 공모전, 학벌, 학점
등등등
굳이 스펙이 연연해 하지 않는다
왜냐면 요즘 난 무념무상 이라 욕심이 없어서 ㅋ
해탈했기 때문이다!!
근데 뭘 대학원이든 회사든 지원을 하려고 하니깐 자격 요건에 어학 점수 때문에 걸려서 지원 못하는 일이 자꾸 발생하네
높지는 않지만 토익점수는 있다 근데 요즘 대새는 스피킹이란다 ㅋㅋㅋㅋㅋ
스피킹 없다고 안받아 주는데 엄청 많아 ㅜㅜ
그래서 어제 토익 스피킹 인강을 신청해서 듣고 있다.
보통 시험 공부를 시작하기 전에 청소를 하듯이...
청소를 하고 환경(?)을 체크하다 보니
4년 만에 집에 왔더니 있는게 없다 ㅋ
공유기가 죽어있어서
공유기를 사서 설치하고 ㅋ
AP가 3개가 되서 신난다 ㅋㅋㅋ 골라 잡는 재미가 있겠네
인강을 듣기 위해서 헤드폰을 사고 ㅋ
정작 그 헤드폰 안쓰고 스피커 빵빵하게 틀어놓고 인강듣는다 ㅋㅋㅋㅋㅋ
OCU나 어학 인강이나 강의자료를 프린트하려고 보니
집 프린터에 잉크가 없길래 잉크를 샀더니
이번엔 인쇄 용지가 없다 ㅋ
이래저래 인터넷 쇼핑을 하루가 멀다하고 하다보니 택배 기사아저씨를 참 자주 뵌다.
중심가에서 학교 생활 하다가 다시 시골로 와서 그런지 아저씨들이 네비에 안찍힌다고 위치가 어디냐고 물어보신다.
사실 4년동안 동네가 너무 많이 바뀌어서 나도 잘 모른다 ㅋ 묻지마세요 ㅋㅋㅋㅋ 저도 몰라요
근데 그래서 그 어학점수라는거, 기왕 공부하는거면 열심히해서 좋은 점수 따는게 좋잖아
그래서 나도 모르게 지금 점수에 연연해 하고 있다.
흠 난 실속이 있고 싶은데 어째 보이는거에 집착하다 보니깐 실속이 되려 없어지는거 같아 ㅋㅋㅋ
ㅋㅋ ㅋ그러니깐 전공능력을 어필해서 그걸 알아주는 회사든 대학원이든 취업하거나 진학하거나 하고 싶은데
내 스스로 남들과 맞추면서 개성을 죽이는거 같단말이지 .. ㅋ..
근래 어학에 돈 쓴거만 한 50만원 되는데.. ㅡㅡ 과연 이게 실속있는 소비(?)를 한건지 의구심이 드네 ㅋㅋㅋ
백수 53일차 (0) | 2015.04.22 |
---|---|
백수 25일 차 - ㅜㅜ 죽을맛이다 (2) | 2015.03.26 |
백수 10일차 - 이게 바로 도구 낭비 (0) | 2015.03.13 |
백수 1일차 - 여긴 어디 난 누구 (0) | 2015.03.04 |
난 내가 솔찍히 집에 오면 공부 엄청 해서 단기간에 빠른 성취(?)를 하리라 헛된 희망품고 있었다
근데 그게 진짜 헛된 희망임을... 오늘 알아버렸다 ㅎㅎㅎㅎㅎㅎㅎㅎ
할일 짱 많은데 ㅋㅋㅋ
왤케 의욕이 뚝뚝 떨어지는지 ㅋㅋㅋ
집에만 오면 그냥 저냥 시간 보내다가 간다.
세상이랑 동떨어져서 시간이 흘러가는거 같다. 실제로 주변에 아무것도 없기도 하고 ㅋ...
내일은 아침잠을 줄이고 토익 인강을 듣고.. 해야지 .. 화이팅...
OCU는 진짜 듣기 싫은데 중간 기말 어떻게 하지 ㅎㅎㅎ..
영어 스피킹 점수도 없고...
진짜 망했네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
마지막으로 자러 가기전에 공채 뜬거나 봐야겠다.. 또르르...
백수 53일차 (0) | 2015.04.22 |
---|---|
백수 25일 차 - ㅜㅜ 죽을맛이다 (2) | 2015.03.26 |
백수 10일차 - 이게 바로 도구 낭비 (0) | 2015.03.13 |
백수8일차 - 스펙이라는 거 말야 (2) | 2015.03.10 |