Transcript 운체발표
안드로이드 스터디
• 당시목표 : 참신한 아이디어가 담긴 어플리케이션을 하나
만들자!
=> 언어만 잘 알면 어플리케
이션을 만들 수 있을 것이다!
과정
JAV
A
+
xml
과정
Database ,
FTP 서버
과정
웹 프로그래밍 언어 => php, asp
과정
Eclipse
운영체제 만들기의 목표
만드는 것 자체에 목적을 두는 것 보다는,
이 과정을 통해서 얻어갈 수 있는 실전지식
을 최대한 쌓아가자!
=> 여러가지 툴 사용법을 익히고, 언어와 컴퓨터
구조 등을 제대로! 이해하는 것
운영체제 만들기에 앞서
▶ 준비물
• NASM – 어셈블러(어셈블리어
-> 기계
•
어)
• Visual Studio 2010 Express
• QEMU – 가상머신
• EditPlus – 어셈블리어 작성을 위한 툴
* 학습 방법 : 책과 블로그 참조
컴퓨터의 부팅과정
① 컴퓨터의 전원버튼을 누른다.
② BIOS가 실행된다.
③ BIOS는 가장 먼저 어떤 하드웨어가 꼽혀있는지를
검사한다. => POST(Power On Self Test)
④ POST가 무사히 끝나면 부팅이 시작된다.
- 순서대로 각 이동장치에서 첫 번째 섹터를 뒤진다.
- 부트로더가 발견이 되면 BIOS는 이 부트로더를 메모
리
0x7C00번지에 로드한다. 그리고 0x7C00 번지로 점프
부트로더의 조건
첫 번째 섹터에 있는 내용물이 부트로더인지 어떻게 구분
할까?
① 크기가 512byte 여야 한다.
② 511번째 바이트에는 55,
512번째 바이트에는 AA 문자가 저장 돼 있다.
부트로더 만들기
다른 가능한 방법도 있겠지만,
어셈블리어로 도전!
• boot.asm
부트로더 만들기
• nasm 으로 컴파일하여 가상 이미지 파일로 만들었다.
=> * 컴파일 : 어셈블리어 -> 기계어
부트로더 만들기
• 가상 이미지를 qemu로 실행
• 실행 결과
-L . => 바이오스 파일을 불러오는 명
-hda=> 뒤에 경로를 0번 하드디스크로
사용하겠다는 의미
부트로더 만들기
• 수정하고 실행해 볼 때마다 일일이 명령어를 치기 불편
하므로 배치파일(make.bat)을 생성.
부트로더에서 글자 출력
글자를 출력하려면
비디오 메모리라는 것을 사
용
세그먼트-오프셋 방식
• 16비트 CPU시절 메모리 주소 방식
16비트는 16진수 네 자리 이므
로,
0x0000~0xFFFF 까지 사용
=> 메모리 총 64kb(2의 16승)
까
지 사용 가능 (직접 접근 방
식)
세그먼트-오프셋 방식
• 인텔은 새로운 CPU를 1MB까지 인식 가능하도록 설
계함
- 1메가 바이트면 주소를 표현
하는데 20비트를 사용한다는
것
- 16비트 레지스터 두 개를 사
용함
세그먼트-오프셋 방식
• 16비트 레지스터 두 개를 사용하는 방식
: 세그먼트 – 오프셋 방식
• 0x2000 : 0x0111
0x20000(세그먼트) => 한자리 수 올려서 더함
+ 0x0111(오프셋)
-------------0x20111
비디오 메모리인 0xB800:0000 은 결국
0xB8000
글자출력 - 레지스터?
• es, ax, ah, al, ax?
레지스터?
레지스터?
레지스터?
레지스터?
글자출력
커널
• 커널의 필요성
부트섹터에는 512바이
트 밖에 기록하지 못함
=> 이 작은 공간에 운
영체제의 여러 기능을 추
가할 수 없음.
=> 결국 다른 영역에
커널을 작성하여 이것을
부트섹터에서 불러오는
커널
• 시스템의 자원을 관리한다.
• 모든 시스템이 원활하게 작동할 수 있도록
제어하는 소프트웨어다.
• 운영체제를 구성하고 있는 핵심으로써
DRAM에 상주하여 시스템 구동에 필요한 환
경설정과 수행되는 프로그램을 스케줄링하는
소프트웨어다.
• 커널의 기능에는 프로세서 관리, 메모리 관
리, 파일시스템 관리, 네트워크 관리, 디바이스
커널로 넘어가기
① 바이오스는 부트섹터를
읽어와서 메모리에 올려놓
는다.
② 부트섹터에 존재하는
부트 코드는 커널을 로드
한다.
커널로 넘어가기 - 하드디스크
읽기
• 부트 프로그램이 디스크의 일정부분(커널)을
메모리에 올리기 위해서는 디스크를 읽어야 한
다.
• 읽는 과정은 OS또는 BIOS에 의해 제공되는
인터럽트 바이오스 콜 13 이용 가능.
• 결국 부트 로더에서는 간단히 이미지를 디스
크에서 메모리로 로딩하는 역할만 한다.
커널로 넘어가기 – 하드디스크
읽기
커널로 넘어가기 – 하드디스크
읽기
• 인터럽트 바이오스 콜 13 중 읽기 명령인 2번
명령
커널로 넘어가기 – 하드디스크
읽기
• 커널소스
커널로 넘어가기 – 하드디스크
읽기
• 실행 : [부드로더 + 커널] => OS.img
CHS 방식 -> LBA 방식
• 섹터에 접근하기 위해서 필요한 정
보
- 실린더, 헤드, 섹터 번호
• 9번 섹터의 데이터를 읽으려 할 때
=> 섹터 번호 부분에 ‘9’라는 값을 넣어준다? =>
X
헤드의 값을 1 증가,
섹터의 값으로 1을 줌.
실린더 6개
헤드 10개
섹터 8개
CHS 방식 -> LBA 방식
• LBA 방식
( Logical Block Addressing)
- 528MB밖에 인식하지 못하는
CHS 방식의 단점을 극복하고자
등장
- 1차원 배열처럼 섹터에 접근하
는 방식
16비트 리얼모드 -> 32비트 보호
모드
• 16비트 리얼모드
80286 이후의 x86 호환 CPU의 운영 방식이다
컴퓨터를 처음 켜면 16비트 ‘리얼모드’로
부팅
32비트 보호모드로 변경시키는 것은 OS의
16비트 리얼모드 -> 32비트 보호
모드
• 16비트 리얼모드의 단점
① Segment:Offset 주소 방식은 20비트이기 때문에
1MB 이상의 메모리영역에 접근할 수 없다.
② 메모리 접근에 대한 보호를 할 수 없다.
16비트 코드는 물리 메모리 주소에 직접 엑세스 한다.
이게 문제가 되는 이유는 응용프로그램이 실행될 때
메모리의 어딘가에 로드되는데, 실행 중 커널이 로드
된 메모리를 갈아 엎을
위험이 있다. 따라서 커널이 죽을 수가 있다.
16비트 리얼모드 -> 32비트 보호
모드
• 32비트 보호모드의 장점
① 4GB 메모리영역까지 접근이 가능하다. ( 2^32 =
4GB )
② 메모리 접근에 대한 보호가 가능해진다. CPU에
의해 제공된다. 응용프로그램이 커널이 로드된 메모
리를 갈아 엎으려 하면 CPU가 에러를 뿜어낸다. 커
널이 그 에러를 적당히 처리해준다. (응용 프로그램
을 끄는 등)
16비트 리얼모드 -> 32비트 보호
모드
• 32비트 보호모드의 장점
③ 보호 모드는 시스템 소프트웨어가 다중작업, 가상
메모리, 페이징, 그리고 응용 소프트웨어를 넘는 운
영 체제 제어 능력을 높이기 위해 고안된 운영 체제
의 다른 기능들을 이용할 수 있게 도와준다.
16비트 리얼모드 -> 32비트 보호
모드
• GDT 란
- 여러 개의 세그먼트 디스크립터로 구성
16비트 리얼모드 -> 32비트 보호
모드
• GDT 란
- GDT는 말 그대로 테이블. C언어의 구조체
와 비슷.
- GDT도 구조체와 마찬가지로 CPU에서 필요
로하
는 정보를 그 규칙에 따라 적어주기만 하면 된
다.
16비트 리얼모드 -> 32비트 보호
모드
• GDT 작성
1. GDT를 작성한다.
2. GDT를 등록한다.
3. 32비트 모드 스위치를 켠
다.
CPU에서 필요로 하는 정보를 그 규칙에 따라 적어
주기만 하면 된다.
스위치를 켜줌
커널 내에서 비디오 디스크립터를 사용해서 문자
출력
C언어로 운영체제 만들기
동일한 컴퓨터라 할지라도 윈도우가 설
치되어 있는 컴퓨터와 리눅스가 설치되
어 있는 컴퓨터는 같은 애플리케이션이
라도 컴파일된 결과물은 다르다.
리눅스 : 010100000010001000100…
printf(“감사합니다. “);
윈도우 : 010100111010001010101…
Thanks, See You