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