SlideShare uma empresa Scribd logo
1 de 73
Baixar para ler offline
부팅쿠재아이
김재경
OS를 알고 싶다
• 작년부터 OS에 대한 궁금증이 있었음 굉장한 오해를 일으킨 그림
OS를 알고 싶다
• 초기에는 OS의 대한 개념이 명확히 없었음(심지어 프로그램인지도 몰랐음)
• 하드웨어와 응용프로그램 중간에 위치하니까 HW도 아니고 SW도 아닌 무언가…?
• 굉장한 신비주의
• 생각해보니 처음부터 매력을 느낀 듯
OS를 알고 싶다
• 시간이 지나고 OS가 프로그램이란 것을 알았음
• 응용프로그램은 운영체제가 실행
• 그럼 운영체제는 누가 실행하지…?
• 운영체제를 실행하는 운영체제(???)가…
• 그걸 또 실행하는 운영체제가(??????)가…
• 뭔가 아닌거 같은데…
OS를 알고 싶다
• 2학년 2학기에 운영체제 수업이 있었음
• 궁금해하던 운영체제를 알 생각에 굉장히 들떴었다
• 그리고 2학기를 마친 후…
OS를 알고 싶다
• 뭐라 표현 못할 실망감
• 수박 겉핥기 한 기분
• 설명 못한 부분도 많음
• 왠지 등록금 아깝다
OS를 알고 싶다
• 차라리 따로 공부하는게 낫겠다
• 될 수 있으면 직접 만들고 싶다
OS를 알고 싶다
그래서 만들어 봤습니다 ^^
OS를 알고 싶다
• Create가 아니고 Copy and Paste
• 직접 만드는 걸 설명하는 책이 있었다!
• 올해 3월 초 ~ 5월 말까지 진행
• 시간 지나니까 다 까먹음
왜 부팅인가?
• 사실 부팅말고 OS에 대한 전반적인 내용을 발표하려고 했습니다
I. 부팅
II. 인터럽트
III. 프로세스, 스레드, 스케줄링
IV. 동적 메모리 할당
V. 이벤트
VI. 시스템 콜
VII. 로더
왜 부팅인가?
• 근데 부팅만 봤더니 양이…
• 결국 부팅 하나만 하기로 결정
• 절대 귀차니즘 때문이 아닙니다
운영 모드
• 인텔 64비트 호환 프로세서(x86-64 프로세서)에는 크게 5가지 운영모드가 존재
• 여기서는 필수인 3가지만 구현
운영 모드 – 리얼 모드
• 프로세서의 초기 상태로서 16비트 모드로 동작하며 8086 프로세서와 호환되는 모드
• 최대 1MB(220
)의 주소 공간을 지원
• BIOS(Basic Input Output System)의 여러 기능을 사용 가능
운영 모드 – 보호 모드
• 32비트 모드로 동작하며 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 제공
• 4GB(232
)의 주소 공간을 지원
• IA-32e 모드로 전환하려면 반드시 거쳐야 함
• 32비트 윈도우나 리눅스가 동작하는 기본 모드
운영 모드 – IA-32e 모드
• 32비트 호환 모드와 64비트 모드의 두 가지 서브 모드로 구성
• 16EB(264
)의 주소 공간을 지원
• 32비트 호환 모드일 때는 보호 모드에 있는 것처럼 동작(32비트 코드를 그대로 실행)
• 64비트 OS에서 32비트 보호 모드 코드를 별다른 처리 없이 그대로 실행할 수 있는 이유
• AMD에서는 Long Mode로 표기
운영 모드 사이의 관계
리얼 모드
(16Bit)
전원
IA-32e 모드
(32 or 64Bit)
보호 모드
(32Bit)
CR0 레지스터의
PE 비트를 1로 설정
CR0 레지스터의
PG 비트를 1로 설정
CR4 레지스터의
PAE 비트를 1로 설정
IA32_EFER MSR 레지스터의
LME 비트를 1로 설정
리얼 모드
BIOS(Basic Input Output System)
• 메인보드에 포함된 펌웨어의 일종
• 보통 PC 메인보드에 롬(ROM)이나 플래시 메모리로 존재
• 전원이 켜짐과 동시에 프로세서가 가장 먼저 실행하는 코드
• BIOS에서 수행하는 각종 테스트나 초기화를 POST(Power On Self Test)라고 부름
• POST가 완료된 후 앞부분에 부트 로더가 있는지 확인
• 부트 로더가 존재하면 코드를 0x7C00 주소에 복사한 후 프로세서가 0x7C00 주소부터 실행하도록 함
BIOS(Basic Input Output System)
• 기능을 특별한 방법으로 외부에 제공
• 함수의 어드레스를 인터럽트 벡터 테이블(Interrupt Vector Table)에 넣어 두고
• 소프트웨어 인터럽트(SWI, Software Interrupt)를 호출하는 방법을 사용
인터럽트 벡터 테이블
• 메모리 어드레스 0에 있는 테이블
• 특정 번호의 인터럽트가 발생했을 때 인터럽트를 처리하는 함수(Interrupt Handler) 검색에 사용
• 테이블의 각 항목은 인덱스에 해당하는 인터럽트가 발생했을 때 처리하는 함수 주소가 저장되어 있음
테이블 인덱스 용도 설명
0x00 CPU Exception Divide by zero
0x01 CPU Exception Single step for debugging
… … …
0x13 BIOS Service Disk I/O service
… … …
플로피 디스크 내부 구조
헤드
• 디스크 표면을 의미
• 플로피 디스크는 디스크가 한 장으로 구성되므로 앞, 뒤로 2개
• 번호는 0 ~ 1
트랙
• 파란색 영역
• 플로피 디스크는 80개
• 번호는 0 ~ 79
섹터
• 빨간색 영역
• 디스크를 구성하는 가장 작은 단위
• 트랙을 다시 여러 조각으로 자른 것
• 한 트랙당 18개
• 하나당 512Bytes로 구성
• 번호는 1 ~ 18
부트 로더
• 부트스트랩(Bootstrap) 코드라고도 불림
• BIOS에서 처음으로 제어를 넘겨받는 부분
• 플로피 디스크나 하드 디스크 등 저장 매체의 가장 앞부분에 존재
• 마지막 2바이트가 0x55, 0xAA로 이루어짐
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
0x07C0CS
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0 0x07C0CS 0x07C0AX
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
0x07C0CS 0x07C0AX
0x07C0DS
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
0x07C0CS 0xB800AX
0x07C0DS
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
0x07C0CS 0xB800AX
0x07C0DS
0xB800ES
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
mov ax, 0x0000
0x07C0CS 0x0000AX
0x07C0DS
0xB800ES
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
mov ax, 0x0000
mov ss, ax
0x07C0CS 0x0000AX
0x07C0DS
0xB800ES
0x0000SS
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFE
0x07C0CS 0x0000AX
0x07C0DS
0xB800ES
0x0000SS
0xFFFESP
부트 로더 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동
START:
mov ax, 0x07C0
mov ds, ax
mov ax, 0xB800
mov es, ax
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFE
mov bp, 0xFFFE
0x07C0CS 0x0000AX
0x07C0DS
0xB800ES
0x0000SS
0xFFFESP
0xFFFEBP
메모리 구조
0x07C0CS
0x07C0DS
0xB800ES
0x0000SS
0xFFFESP
0xFFFEBP
0x00000
0x07C00
0xFFFFF (1MB)
0x0FFFE
0xB8000
이후 코드 전개
① 화면을 지움
② 화면 상단에 부트 로더 시작 메시지 출력
③ OS 이미지를 로딩한다는 메시지 출력
④ int 0x13 코드를 이용해 BIOS가 디스크를 읽어서 코드를 메모리 주소 0x10000 부터 올림
⑤ 읽기가 끝나면 완료 메시지 출력
⑥ 0x10000 으로 점프
실행 결과
보호 모드
세그먼트 디스크립터(Segment Descriptor)
• 32Bit로 넘어오면서 세그먼트의 정보가 복잡해짐
• 세그먼트의 정보를 나타내는 자료구조
• 기존의 세그먼트 레지스터는 세그먼트 셀렉터로 이름만 바뀜
• 셀렉터는 세그먼트 디스크립터의 인덱스를 저장
세그먼트 디스크립터(Segment Descriptor)
자세한 내용은 세그먼테이션과 페이징 참고(http://www.slideshare.net/QooJuice/ss-59584695)
GDT(Global Descriptor Table)
• 연속된 디스크립터의 집합
• 널 디스크립터(NULL Descriptor)를 가장 앞부분에 추가해야 함
• 널 디스크립터는 일반적으로 참조되지 않음
GDTR(Global Descriptor Table Register)
• GDT의 위치와 크기를 저장하는 레지스터
Segmentation 구조
CS
DS
GS
FS
Segment Descriptor
Segment Descriptor
Segment Descriptor
Segment Descriptor
NULL Descriptor
GDT 선형 주소
GDTR
0
8
16
24
32
디스크립터 코드
GDTR:
dw GDTEND - GDT – 1 ; Limit
dd ( GDT - $$ + 0x10000 ) ; Base addr
GDT:
NULLDescriptor:
dw 0x0000
dw 0x0000
db 0x00
db 0x00
db 0x00
db 0x00
CODEDESCRIPTOR:
dw 0xFFFF ; Limit [15:0]
dw 0x0000 ; Base [15:0]
db 0x00 ; Base [23:16]
db 0x9A ; P=1, DPL=0, Code Segment, Execute/Read
db 0xCF ; G=1, D=1, L=0, Limit[19:16]
db 0x00 ; Base [31:24]
DATADESCRIPTOR:
dw 0xFFFF ; Limit [15:0]
dw 0x0000 ; Base [15:0]
db 0x00 ; Base [23:16]
db 0x92 ; P=1, DPL=0, Data Segment, Read/Write
db 0xCF ; G=1, D=1, L=0, Limit[19:16]
db 0x00 ; Base [31:24]
GDTEND:
디스크립터 코드
CODEDESCRIPTOR:
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
보호 모드 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
START:
mov ax, 0x1000 ; ax 레지스터에 0x1000 저장
mov ds, ax ; DS 세그먼트 레지스터 설정
mov es, ax ; ES 세그먼트 레지스터 설정
cli ; 인터럽트가 발생하지 못하도록 설정
lgdt [ GDTR ] ; GDTR 자료구조를 프로세서에 설정하여 GDT 테이블을 로드
mov eax, 0x4000003B ; PG=0, CD=1, NW=0, AM=0, WP=0, NE=1, ET=1, TS=1, EM=0, MP=1, PE=1
mov cr0, eax ; CR0 컨트롤 레지스터에 위에서 저장한 플래그를 설정하여 보호 모드로 전환
jmp dword 0x08: ( PROTECTEDMODE - $$ + 0x10000 ) ; 코드 세그먼트를 교체하고 EIP의 값을 재설정
PROTECTEDMODE:
…
보호 모드 코드
[ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정
[BITS 16] ; 이하의 코드는 16비트 코드로 설정
SECTION .text ; text 섹션(세그먼트)을 정의
START:
mov ax, 0x1000
mov ds, ax
mov es, ax
cli
lgdt [ GDTR ]
mov eax, 0x4000003B
mov cr0, eax
jmp dword 0x08: ( PROTECTEDMODE - $$ + 0x10000 )
PROTECTEDMODE:
…
GDT - $$ + 0x10000GDTR
0x08CS
GDTEND - GDT - 1
Base address Limit
Descriptor Index
0x1000DS
0x1000ES
보호 모드 코드
[BITS 32] ; 이하의 코드는 32비트 코드로 설정
PROTECTEDMODE:
mov ax, 0x10 ; 보호 모드 커널용 데이터 세그먼트 디스크립터를 AX 레지스터에 저장
mov ds, ax ; DS 세그먼트 셀렉터에 설정
mov es, ax ; ES 세그먼트 셀렉터에 설정
mov fs, ax ; FS 세그먼트 셀렉터에 설정
mov gs, ax ; GS 세그먼트 셀렉터에 설정
; 스택을 0x00000000~0x0000FFFF 영역에 64KB 크기로 생성
mov ss, ax ; SS 세그먼트 셀렉터에 설정
mov esp, 0xFFFE ; ESP 레지스터의 어드레스를 0xFFFE로 설정
mov ebp, 0xFFFE ; EBP 레지스터의 어드레스를 0xFFFE로 설정
; 화면에 보호 모드로 전환되었다는 메시지를 찍는다.
jmp dword 0x08: 0x10200 ; C 언어 커널이 존재하는 0x10200 어드레스로 이동하여 C 언어 커널 수행
보호 모드 코드
[BITS 32] ; 이하의 코드는 32비트 코드로 설정
PROTECTEDMODE:
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; 스택을 0x00000000~0x0000FFFF 영역에 64KB 크기로 생성
mov ss, ax
mov esp, 0xFFFE
mov ebp, 0xFFFE
; 화면에 보호 모드로 전환되었다는 메시지를 찍는다.
jmp dword 0x08: 0x10200
0x10DS
0x10ES
0x10FS
0x10GS
0x10SS
0xFFFEESP
0xFFFEEBP
C 커널 작성
C 언어 코드 생성 조건
• C 라이브러리를 사용하지 않게 빌드해야 함
• 0x10200 위치에서 실행하게끔 빌드해야 함
• 코드나 데이터 외에 기타 정보를 포함하지 않은 순수한 바이너리 파일 형태여야 함
• 위의 3가지 조건은 GCC 옵션과 링커 스크립트, 기타 유틸리티 프로그램으로 해결
• 설명하기 복잡하고 이해도 잘 안돼서 패스
보호모드 커널 C언어 코드
#include "Types.h"
void kPrintString( int iX, int iY, const char* pcString );
void Main( void )
{
kPrintString( 0, 3, "C Language Kernel Started~!!!" );
while( 1 ) ;
}
보호모드 커널 C언어 코드
#pragma pack( push, 1 )
typedef struct kCharactorStruct
{
char bCharactor;
char bAttribute;
} CHARACTER;
#pragma pack( pop )
보호모드 커널 C언어 코드
void kPrintString( int iX, int iY, const char* pcString )
{
CHARACTER* pstScreen = ( CHARACTER* ) 0xB8000;
int i;
pstScreen += ( iY * 80 ) + iX;
for( i = 0 ; pcString[ i ] != 0 ; i++ )
{
pstScreen[ i ].bCharactor = pcString[ i ];
}
}
실행 결과
A20 게이트
A20 게이트
• XT PC가 주로 사용되던 시절에는 오버플로우를 이용한 프로그램이 있었음
• Ex) 0xFFFF:FFFF -> 0x10FFEF -> 0xFFEF
• 16MB 어드레스까지 접근할 수 있는 AT PC가 탄생하면서 문제가 생김
• 이러한 호환성의 문제를 해결하려고 도입된 것이 A20 게이트
• 비활성화하면 20번째 비트를 항상 0으로 고정
A20 게이트
0x10FFEF
0001 0000 1111 1111 1110 1111
0000 0000 1111 1111 1110 1111
0x00FFEF
20번째 비트를 0으로 고정
A20 게이트
• BIOS 인터럽트를 통해 간단하게 처리
START:
mov ax, 0x1000
mov ds, ax
mov es, ax
mov ax, 0x2401 ; A20 게이트 활성화 서비스 설정
int 0x15 ; BIOS 인터럽트 서비스 호출
64비트 모드
활성화
64비트 모드 활성화
• 64비트용 세그먼트 디스크립터 추가
• 페이징 자료구조 추가 및 초기화
• 자세한 설명은 생략
64비트 모드 활성화
• 0x200000로 64비트 커널 복사
• 컨트롤 레지스터 설정, IA32-EFER 레지스터 설정(IA-32e 전환)
• 0x200000로 점프
• 64비트 커널 세그먼트 셀렉터, 스택 초기화
실행 결과
인터럽트
인터럽트란?
• CPU가 프로그램을 실행하고 있을 때
입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여
처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것
IDT(Interrupt Descriptor Table)
• IDT 게이트 디스크립터로 구성된 테이블
• 상위 32개는 프로세서가 예약 그 중 20개만 실제 사용
• 인터럽트가 발생되면 IDT를 탐색하고 핸들러 실행
IDT(Interrupt Descriptor Table)
인터럽트와 예외 목록
예외 처리 과정
1) 나누기 예외 발생
2) IDT 0번째(Vector) 디스크립터 탐색
3) 예외 핸들러 호출
예외 처리 과정
PIC(Programmable Interrupt Controller)
• 인터럽트 처리에 관련된 세부 기능을 프로그래밍 할 수 있는 컨트롤러
• PC 디바이스(키보드, 마우스, HDD 등)의 인터럽트를 관리
• 1개당 인터럽트 입력 8개 처리 가능
• 2개를 마스터-슬레이브 방식으로 연결하여 최대 15개 인터럽트 처리
PIC(Programmable Interrupt Controller)
PIC(Programmable Interrupt Controller)
인터럽트 처리 과정
1) 키보드 인터럽트 발생
2) PIC가 CPU에게 해당 IRQ에 설정된 인터럽트 벡터 전달
3) CPU는 인터럽트 요청이 정상적으로 수신되었음을 PIC에게 전달
4) 인터럽트 핸들러 실행
5) 처리가 끝나면 EOI 커맨드를 PIC에 전송
IST(Interrupt Stack Table)
TSS Base addr
IDT
TSS
Interrupt
Vector
TR
IST
Descriptor
IST Number
IST Addr
Q / A

Mais conteúdo relacionado

Mais procurados

Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Fermat Jade
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝Jay JH Park
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용noerror
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이GangSeok Lee
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
 
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)NAVER D2
 
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...GangSeok Lee
 
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이GangSeok Lee
 
파이썬 2와 유니코드
파이썬 2와 유니코드파이썬 2와 유니코드
파이썬 2와 유니코드성주 이
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?내훈 정
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안GangSeok Lee
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은jieun kim
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은jieun kim
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System상현 조
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel CaliforniaTheori
 

Mais procurados (20)

Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 
Unicode
UnicodeUnicode
Unicode
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
Christmas CTF 보안대회 수상팀 문제풀이서(팀명:구운순살치즈치킨)
 
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
 
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
 
파이썬 2와 유니코드
파이썬 2와 유니코드파이썬 2와 유니코드
파이썬 2와 유니코드
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
[2014 CodeEngn Conference 11] 박한범 - 가상화 기술과 보안
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
 
Network researching
Network researchingNetwork researching
Network researching
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
 
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing SystemGCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 

Semelhante a 부팅

Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제Kyungryul KIM
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 
백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나Daniel Shin
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
Java Class File Format
Java Class File FormatJava Class File Format
Java Class File FormatJongyoung Park
 
하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조Logpresso
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11민웅 이
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample상현 조
 
Main Variable Program
Main Variable ProgramMain Variable Program
Main Variable Program경섭 심
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
비트코인 소스 구조분석
비트코인 소스 구조분석비트코인 소스 구조분석
비트코인 소스 구조분석ryanhuh
 
Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen RecorderSooHwan Ok
 
Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법Sehan Lee
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 

Semelhante a 부팅 (20)

Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제
 
Unicode100
Unicode100Unicode100
Unicode100
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나백업을 위한 USB운영체제 완료세미나
백업을 위한 USB운영체제 완료세미나
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
Cpu basic
Cpu basicCpu basic
Cpu basic
 
Java Class File Format
Java Class File FormatJava Class File Format
Java Class File Format
 
하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
 
Main Variable Program
Main Variable ProgramMain Variable Program
Main Variable Program
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
System+os study 1
System+os study 1System+os study 1
System+os study 1
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
비트코인 소스 구조분석
비트코인 소스 구조분석비트코인 소스 구조분석
비트코인 소스 구조분석
 
Android Screen Recorder
Android Screen RecorderAndroid Screen Recorder
Android Screen Recorder
 
Avr lecture1
Avr lecture1Avr lecture1
Avr lecture1
 
Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법Packet tracer 설치 및 사용법
Packet tracer 설치 및 사용법
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 

Mais de QooJuice

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션QooJuice
 
캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션QooJuice
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusionQooJuice
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage CollectionQooJuice
 
Compute shader
Compute shaderCompute shader
Compute shaderQooJuice
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2QooJuice
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patternsQooJuice
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)QooJuice
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화QooJuice
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)QooJuice
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향QooJuice
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and PagingQooJuice
 
Move semantics
Move semanticsMove semantics
Move semanticsQooJuice
 

Mais de QooJuice (18)

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusion
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
 
Compute shader
Compute shaderCompute shader
Compute shader
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
 
Picking
PickingPicking
Picking
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
행렬
행렬행렬
행렬
 
벡터
벡터벡터
벡터
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and Paging
 
Move semantics
Move semanticsMove semantics
Move semantics
 

부팅

  • 2. OS를 알고 싶다 • 작년부터 OS에 대한 궁금증이 있었음 굉장한 오해를 일으킨 그림
  • 3. OS를 알고 싶다 • 초기에는 OS의 대한 개념이 명확히 없었음(심지어 프로그램인지도 몰랐음) • 하드웨어와 응용프로그램 중간에 위치하니까 HW도 아니고 SW도 아닌 무언가…? • 굉장한 신비주의 • 생각해보니 처음부터 매력을 느낀 듯
  • 4. OS를 알고 싶다 • 시간이 지나고 OS가 프로그램이란 것을 알았음 • 응용프로그램은 운영체제가 실행 • 그럼 운영체제는 누가 실행하지…? • 운영체제를 실행하는 운영체제(???)가… • 그걸 또 실행하는 운영체제가(??????)가… • 뭔가 아닌거 같은데…
  • 5. OS를 알고 싶다 • 2학년 2학기에 운영체제 수업이 있었음 • 궁금해하던 운영체제를 알 생각에 굉장히 들떴었다 • 그리고 2학기를 마친 후…
  • 6. OS를 알고 싶다 • 뭐라 표현 못할 실망감 • 수박 겉핥기 한 기분 • 설명 못한 부분도 많음 • 왠지 등록금 아깝다
  • 7. OS를 알고 싶다 • 차라리 따로 공부하는게 낫겠다 • 될 수 있으면 직접 만들고 싶다
  • 8. OS를 알고 싶다 그래서 만들어 봤습니다 ^^
  • 9. OS를 알고 싶다 • Create가 아니고 Copy and Paste • 직접 만드는 걸 설명하는 책이 있었다! • 올해 3월 초 ~ 5월 말까지 진행 • 시간 지나니까 다 까먹음
  • 10. 왜 부팅인가? • 사실 부팅말고 OS에 대한 전반적인 내용을 발표하려고 했습니다 I. 부팅 II. 인터럽트 III. 프로세스, 스레드, 스케줄링 IV. 동적 메모리 할당 V. 이벤트 VI. 시스템 콜 VII. 로더
  • 11. 왜 부팅인가? • 근데 부팅만 봤더니 양이… • 결국 부팅 하나만 하기로 결정 • 절대 귀차니즘 때문이 아닙니다
  • 12. 운영 모드 • 인텔 64비트 호환 프로세서(x86-64 프로세서)에는 크게 5가지 운영모드가 존재 • 여기서는 필수인 3가지만 구현
  • 13. 운영 모드 – 리얼 모드 • 프로세서의 초기 상태로서 16비트 모드로 동작하며 8086 프로세서와 호환되는 모드 • 최대 1MB(220 )의 주소 공간을 지원 • BIOS(Basic Input Output System)의 여러 기능을 사용 가능
  • 14. 운영 모드 – 보호 모드 • 32비트 모드로 동작하며 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 제공 • 4GB(232 )의 주소 공간을 지원 • IA-32e 모드로 전환하려면 반드시 거쳐야 함 • 32비트 윈도우나 리눅스가 동작하는 기본 모드
  • 15. 운영 모드 – IA-32e 모드 • 32비트 호환 모드와 64비트 모드의 두 가지 서브 모드로 구성 • 16EB(264 )의 주소 공간을 지원 • 32비트 호환 모드일 때는 보호 모드에 있는 것처럼 동작(32비트 코드를 그대로 실행) • 64비트 OS에서 32비트 보호 모드 코드를 별다른 처리 없이 그대로 실행할 수 있는 이유 • AMD에서는 Long Mode로 표기
  • 16. 운영 모드 사이의 관계 리얼 모드 (16Bit) 전원 IA-32e 모드 (32 or 64Bit) 보호 모드 (32Bit) CR0 레지스터의 PE 비트를 1로 설정 CR0 레지스터의 PG 비트를 1로 설정 CR4 레지스터의 PAE 비트를 1로 설정 IA32_EFER MSR 레지스터의 LME 비트를 1로 설정
  • 18. BIOS(Basic Input Output System) • 메인보드에 포함된 펌웨어의 일종 • 보통 PC 메인보드에 롬(ROM)이나 플래시 메모리로 존재 • 전원이 켜짐과 동시에 프로세서가 가장 먼저 실행하는 코드 • BIOS에서 수행하는 각종 테스트나 초기화를 POST(Power On Self Test)라고 부름 • POST가 완료된 후 앞부분에 부트 로더가 있는지 확인 • 부트 로더가 존재하면 코드를 0x7C00 주소에 복사한 후 프로세서가 0x7C00 주소부터 실행하도록 함
  • 19. BIOS(Basic Input Output System) • 기능을 특별한 방법으로 외부에 제공 • 함수의 어드레스를 인터럽트 벡터 테이블(Interrupt Vector Table)에 넣어 두고 • 소프트웨어 인터럽트(SWI, Software Interrupt)를 호출하는 방법을 사용
  • 20. 인터럽트 벡터 테이블 • 메모리 어드레스 0에 있는 테이블 • 특정 번호의 인터럽트가 발생했을 때 인터럽트를 처리하는 함수(Interrupt Handler) 검색에 사용 • 테이블의 각 항목은 인덱스에 해당하는 인터럽트가 발생했을 때 처리하는 함수 주소가 저장되어 있음 테이블 인덱스 용도 설명 0x00 CPU Exception Divide by zero 0x01 CPU Exception Single step for debugging … … … 0x13 BIOS Service Disk I/O service … … …
  • 21. 플로피 디스크 내부 구조 헤드 • 디스크 표면을 의미 • 플로피 디스크는 디스크가 한 장으로 구성되므로 앞, 뒤로 2개 • 번호는 0 ~ 1 트랙 • 파란색 영역 • 플로피 디스크는 80개 • 번호는 0 ~ 79 섹터 • 빨간색 영역 • 디스크를 구성하는 가장 작은 단위 • 트랙을 다시 여러 조각으로 자른 것 • 한 트랙당 18개 • 하나당 512Bytes로 구성 • 번호는 1 ~ 18
  • 22. 부트 로더 • 부트스트랩(Bootstrap) 코드라고도 불림 • BIOS에서 처음으로 제어를 넘겨받는 부분 • 플로피 디스크나 하드 디스크 등 저장 매체의 가장 앞부분에 존재 • 마지막 2바이트가 0x55, 0xAA로 이루어짐
  • 23. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 0x07C0CS
  • 24. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 0x07C0CS 0x07C0AX
  • 25. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax 0x07C0CS 0x07C0AX 0x07C0DS
  • 26. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 0x07C0CS 0xB800AX 0x07C0DS
  • 27. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 mov es, ax 0x07C0CS 0xB800AX 0x07C0DS 0xB800ES
  • 28. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 mov es, ax mov ax, 0x0000 0x07C0CS 0x0000AX 0x07C0DS 0xB800ES
  • 29. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 mov es, ax mov ax, 0x0000 mov ss, ax 0x07C0CS 0x0000AX 0x07C0DS 0xB800ES 0x0000SS
  • 30. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 mov es, ax mov ax, 0x0000 mov ss, ax mov sp, 0xFFFE 0x07C0CS 0x0000AX 0x07C0DS 0xB800ES 0x0000SS 0xFFFESP
  • 31. 부트 로더 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 jmp 0x07C0:START ; CS 세그먼트 레지스터에 0x07C0을 복사하면서, START 레이블로 이동 START: mov ax, 0x07C0 mov ds, ax mov ax, 0xB800 mov es, ax mov ax, 0x0000 mov ss, ax mov sp, 0xFFFE mov bp, 0xFFFE 0x07C0CS 0x0000AX 0x07C0DS 0xB800ES 0x0000SS 0xFFFESP 0xFFFEBP
  • 33. 이후 코드 전개 ① 화면을 지움 ② 화면 상단에 부트 로더 시작 메시지 출력 ③ OS 이미지를 로딩한다는 메시지 출력 ④ int 0x13 코드를 이용해 BIOS가 디스크를 읽어서 코드를 메모리 주소 0x10000 부터 올림 ⑤ 읽기가 끝나면 완료 메시지 출력 ⑥ 0x10000 으로 점프
  • 36. 세그먼트 디스크립터(Segment Descriptor) • 32Bit로 넘어오면서 세그먼트의 정보가 복잡해짐 • 세그먼트의 정보를 나타내는 자료구조 • 기존의 세그먼트 레지스터는 세그먼트 셀렉터로 이름만 바뀜 • 셀렉터는 세그먼트 디스크립터의 인덱스를 저장
  • 37. 세그먼트 디스크립터(Segment Descriptor) 자세한 내용은 세그먼테이션과 페이징 참고(http://www.slideshare.net/QooJuice/ss-59584695)
  • 38. GDT(Global Descriptor Table) • 연속된 디스크립터의 집합 • 널 디스크립터(NULL Descriptor)를 가장 앞부분에 추가해야 함 • 널 디스크립터는 일반적으로 참조되지 않음
  • 39. GDTR(Global Descriptor Table Register) • GDT의 위치와 크기를 저장하는 레지스터
  • 40. Segmentation 구조 CS DS GS FS Segment Descriptor Segment Descriptor Segment Descriptor Segment Descriptor NULL Descriptor GDT 선형 주소 GDTR 0 8 16 24 32
  • 41. 디스크립터 코드 GDTR: dw GDTEND - GDT – 1 ; Limit dd ( GDT - $$ + 0x10000 ) ; Base addr GDT: NULLDescriptor: dw 0x0000 dw 0x0000 db 0x00 db 0x00 db 0x00 db 0x00 CODEDESCRIPTOR: dw 0xFFFF ; Limit [15:0] dw 0x0000 ; Base [15:0] db 0x00 ; Base [23:16] db 0x9A ; P=1, DPL=0, Code Segment, Execute/Read db 0xCF ; G=1, D=1, L=0, Limit[19:16] db 0x00 ; Base [31:24] DATADESCRIPTOR: dw 0xFFFF ; Limit [15:0] dw 0x0000 ; Base [15:0] db 0x00 ; Base [23:16] db 0x92 ; P=1, DPL=0, Data Segment, Read/Write db 0xCF ; G=1, D=1, L=0, Limit[19:16] db 0x00 ; Base [31:24] GDTEND:
  • 42. 디스크립터 코드 CODEDESCRIPTOR: dw 0xFFFF dw 0x0000 db 0x00 db 0x9A db 0xCF db 0x00
  • 43. 보호 모드 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 START: mov ax, 0x1000 ; ax 레지스터에 0x1000 저장 mov ds, ax ; DS 세그먼트 레지스터 설정 mov es, ax ; ES 세그먼트 레지스터 설정 cli ; 인터럽트가 발생하지 못하도록 설정 lgdt [ GDTR ] ; GDTR 자료구조를 프로세서에 설정하여 GDT 테이블을 로드 mov eax, 0x4000003B ; PG=0, CD=1, NW=0, AM=0, WP=0, NE=1, ET=1, TS=1, EM=0, MP=1, PE=1 mov cr0, eax ; CR0 컨트롤 레지스터에 위에서 저장한 플래그를 설정하여 보호 모드로 전환 jmp dword 0x08: ( PROTECTEDMODE - $$ + 0x10000 ) ; 코드 세그먼트를 교체하고 EIP의 값을 재설정 PROTECTEDMODE: …
  • 44. 보호 모드 코드 [ORG 0x00] ; 코드의 시작 어드레스를 0x00으로 설정 [BITS 16] ; 이하의 코드는 16비트 코드로 설정 SECTION .text ; text 섹션(세그먼트)을 정의 START: mov ax, 0x1000 mov ds, ax mov es, ax cli lgdt [ GDTR ] mov eax, 0x4000003B mov cr0, eax jmp dword 0x08: ( PROTECTEDMODE - $$ + 0x10000 ) PROTECTEDMODE: … GDT - $$ + 0x10000GDTR 0x08CS GDTEND - GDT - 1 Base address Limit Descriptor Index 0x1000DS 0x1000ES
  • 45. 보호 모드 코드 [BITS 32] ; 이하의 코드는 32비트 코드로 설정 PROTECTEDMODE: mov ax, 0x10 ; 보호 모드 커널용 데이터 세그먼트 디스크립터를 AX 레지스터에 저장 mov ds, ax ; DS 세그먼트 셀렉터에 설정 mov es, ax ; ES 세그먼트 셀렉터에 설정 mov fs, ax ; FS 세그먼트 셀렉터에 설정 mov gs, ax ; GS 세그먼트 셀렉터에 설정 ; 스택을 0x00000000~0x0000FFFF 영역에 64KB 크기로 생성 mov ss, ax ; SS 세그먼트 셀렉터에 설정 mov esp, 0xFFFE ; ESP 레지스터의 어드레스를 0xFFFE로 설정 mov ebp, 0xFFFE ; EBP 레지스터의 어드레스를 0xFFFE로 설정 ; 화면에 보호 모드로 전환되었다는 메시지를 찍는다. jmp dword 0x08: 0x10200 ; C 언어 커널이 존재하는 0x10200 어드레스로 이동하여 C 언어 커널 수행
  • 46. 보호 모드 코드 [BITS 32] ; 이하의 코드는 32비트 코드로 설정 PROTECTEDMODE: mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax ; 스택을 0x00000000~0x0000FFFF 영역에 64KB 크기로 생성 mov ss, ax mov esp, 0xFFFE mov ebp, 0xFFFE ; 화면에 보호 모드로 전환되었다는 메시지를 찍는다. jmp dword 0x08: 0x10200 0x10DS 0x10ES 0x10FS 0x10GS 0x10SS 0xFFFEESP 0xFFFEEBP
  • 48. C 언어 코드 생성 조건 • C 라이브러리를 사용하지 않게 빌드해야 함 • 0x10200 위치에서 실행하게끔 빌드해야 함 • 코드나 데이터 외에 기타 정보를 포함하지 않은 순수한 바이너리 파일 형태여야 함 • 위의 3가지 조건은 GCC 옵션과 링커 스크립트, 기타 유틸리티 프로그램으로 해결 • 설명하기 복잡하고 이해도 잘 안돼서 패스
  • 49. 보호모드 커널 C언어 코드 #include "Types.h" void kPrintString( int iX, int iY, const char* pcString ); void Main( void ) { kPrintString( 0, 3, "C Language Kernel Started~!!!" ); while( 1 ) ; }
  • 50. 보호모드 커널 C언어 코드 #pragma pack( push, 1 ) typedef struct kCharactorStruct { char bCharactor; char bAttribute; } CHARACTER; #pragma pack( pop )
  • 51. 보호모드 커널 C언어 코드 void kPrintString( int iX, int iY, const char* pcString ) { CHARACTER* pstScreen = ( CHARACTER* ) 0xB8000; int i; pstScreen += ( iY * 80 ) + iX; for( i = 0 ; pcString[ i ] != 0 ; i++ ) { pstScreen[ i ].bCharactor = pcString[ i ]; } }
  • 54. A20 게이트 • XT PC가 주로 사용되던 시절에는 오버플로우를 이용한 프로그램이 있었음 • Ex) 0xFFFF:FFFF -> 0x10FFEF -> 0xFFEF • 16MB 어드레스까지 접근할 수 있는 AT PC가 탄생하면서 문제가 생김 • 이러한 호환성의 문제를 해결하려고 도입된 것이 A20 게이트 • 비활성화하면 20번째 비트를 항상 0으로 고정
  • 55. A20 게이트 0x10FFEF 0001 0000 1111 1111 1110 1111 0000 0000 1111 1111 1110 1111 0x00FFEF 20번째 비트를 0으로 고정
  • 56. A20 게이트 • BIOS 인터럽트를 통해 간단하게 처리 START: mov ax, 0x1000 mov ds, ax mov es, ax mov ax, 0x2401 ; A20 게이트 활성화 서비스 설정 int 0x15 ; BIOS 인터럽트 서비스 호출
  • 58. 64비트 모드 활성화 • 64비트용 세그먼트 디스크립터 추가 • 페이징 자료구조 추가 및 초기화 • 자세한 설명은 생략
  • 59. 64비트 모드 활성화 • 0x200000로 64비트 커널 복사 • 컨트롤 레지스터 설정, IA32-EFER 레지스터 설정(IA-32e 전환) • 0x200000로 점프 • 64비트 커널 세그먼트 셀렉터, 스택 초기화
  • 62. 인터럽트란? • CPU가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것
  • 63. IDT(Interrupt Descriptor Table) • IDT 게이트 디스크립터로 구성된 테이블 • 상위 32개는 프로세서가 예약 그 중 20개만 실제 사용 • 인터럽트가 발생되면 IDT를 탐색하고 핸들러 실행
  • 66. 예외 처리 과정 1) 나누기 예외 발생 2) IDT 0번째(Vector) 디스크립터 탐색 3) 예외 핸들러 호출
  • 68. PIC(Programmable Interrupt Controller) • 인터럽트 처리에 관련된 세부 기능을 프로그래밍 할 수 있는 컨트롤러 • PC 디바이스(키보드, 마우스, HDD 등)의 인터럽트를 관리 • 1개당 인터럽트 입력 8개 처리 가능 • 2개를 마스터-슬레이브 방식으로 연결하여 최대 15개 인터럽트 처리
  • 71. 인터럽트 처리 과정 1) 키보드 인터럽트 발생 2) PIC가 CPU에게 해당 IRQ에 설정된 인터럽트 벡터 전달 3) CPU는 인터럽트 요청이 정상적으로 수신되었음을 PIC에게 전달 4) 인터럽트 핸들러 실행 5) 처리가 끝나면 EOI 커맨드를 PIC에 전송
  • 72. IST(Interrupt Stack Table) TSS Base addr IDT TSS Interrupt Vector TR IST Descriptor IST Number IST Addr
  • 73. Q / A