Welcome to My World (www.dgmayor.com)

2022/06/14 14

21. 부트 스트랩 정리

이전 포스팅에서는 환경설정에 대해서 다루었다면 지금 포스팅부터는 OS를 직접 만드는 것에 초첨을 마추고 글을 작성하도록 하겠다. 가장 처음 컴퓨터가 부팅되고 난 뒤에 POST(Power On Self Test)과정을 거쳐 특정 OS 파일에서 첫 512바이트트만큼을 가져온다. 여기서 가장 먼저 실행되는 코드라고 하는데 이를 만들고 알아보도록 하자. 부트과정 처음 컴퓨터에 전원이 들어와서 부팅과정을 거치는데 이를 부트스트랩이라고 한다. 부트스트랩은 장화(boot)의 끈(strap)을 묶고 일어나려는 사람을 가르키기도 하며 그 과정은 아래와 같다. 이 포스팅에서 직접 수정하고 테스트 할 부분은 Step 3 이후에 로드된 MBR(Master Boot Record)이다. 3.20 전산대란이 일어났을 때나 특정 악..

20. 하드디스크 드라이버 쓰기

https://github.com/SIMHANGSUB/HoGoS/tree/master/20 20강 소스코드입니다. -------------------------------------------------------------------------------- 안녕하세요 오늘은 하드디스크에 쓰는 함수를 구현해봅시다. 논리는 하드디스크를 읽었을 때와 똑같습니다. 다른 점은 하드디스크에 내릴 명령이 읽기(0x20) 이 아니라 쓰기(0x30)인 점, 그리고 쓸 때 명령어 "rep outsw " 를 사용할 것이라는 점입니다. 바로 코드를 봅시다. 19강에 짰던 코드와 거의 차이가 없음을 알 수 있을 겁니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23..

19. 하드디스크 드라이버 읽기

https://github.com/SIMHANGSUB/HoGoS/tree/master/19 19강 소스코드입니다. -------------------------------------------------------------------------------- 안녕하세요 Qemu 환경으로도 옮겼겠다 이제 하드디스크 드라이버를 구현하는 일밖에 없습니다. 미리 말했듯이 처음 보면 굉장히 난해합니다. 따라서 드라이버 구현을 몇 단계로 나누어 포스팅할 생각입니다. 17강에서 언급했던 흐름을 그대로 코드 구현할 겁니다. 일일이 주석을 달았으니 시간을 가지고 음미하시기 바랍니다(?) 먼저 오래전에 구현했던 Interrupt.c 코드에서 90 ~ 100 줄에 해당하는 소스를 다음과 같이 수정합시다. 1 2 3 4 5 ..

18. 하드디스크 드라이버 - Q Menu

안녕하세요 저번 강의에서 예고했듯이 Qemu라는 가상환경을 설치해보겠습니다. https://www.qemu.org/download/#windows 공식 링크로 들어가 최신 버전을 다운받읍시다. 자신의 윈도우 운영체제가 32비트 / 64비트에 따라 설치합니다. 설치를 완료하면 qemu 폴더를 찾아가봅시다. 그리고 다음과 같이 커맨드창을 띄워 입력합시다( ​Qemu 폴더 안에서 실행해야 합니다 !! ) "qemu-img create hdd.img 1M" ​말 그대로 1MB짜리 hdd.img 파일을 생성하는 명령어입니다. 이렇게 간단한 명령어 한 줄로 하드디스크를 만들었습니다. 이젠 이 하드디스크를 우리의 가상컴퓨터에 마운트(끼우는) 작업을 해야겠죠? 이는 가상컴퓨터를 실행하는 동시에 마운트도 같이 할 겁니다..

17. 하드디스크 드라이버

오늘은 대망의 파일시스템 그 첫 번째 챕터입니다. 파일시스템을 위해서는 하드디스크를 읽고 쓸 줄 알아야겠죠? 우린 이미 첫 강의때 Real Mode 상에서 지원하는 인터럽트 13으로 플로피디스크를 읽어본 경험이 있습니다. 그런데 슬프게도... 우리는 Real Mode 16비트 환경에서 Protected Mode 32비트 환경으로 넘어왔습니다. 이 32비트 환경에서 더 이상 인터럽트 13 으로 디스크를 읽지 못합니다. 대신 I/O 레지스터 프로그래밍을 통해 하드디스크에 직접 명령을 내리는 수 밖에 없습니다. 이번 포스트에서는 어떤 i/o 레지스터에 명령을 내려야 하드디스크를 읽고 쓸 수 있는지 분석해볼겁니다. 그리고 다음 포스트부터 본격적으로 이를 구현해볼 겁니다. https://wiki.osdev.org..

16. 기초적인 쉘

https://github.com/SIMHANGSUB/HoGoS/tree/master/16 16강 소스코드입니다. -------------------------------------------------------------------------------- 오늘은 Shell 을 만들어봅시다! Shell을 만드는 궁극적인 목적은 사용자로부터 명령어를 입력받아 처리하기 위함입니다. 키보드 드라이버를 저번 강의 때 구현했기 때문에, Shell은 이를 이용하기만 하면 됩니다. 따라서 어떤 방식으로 구현하던지 상관이 없겠죠? 아래의 코드를 참고로 자신만의 Shell을 만들어봅시다. 코드를 수정하기에 앞서 다음과 같이 shell.h와 shell.c 를 추가합시다. ( 새로 만들었으니 당연히 makefile 에 추..

15. 인터럽트 - 키보드 드라이버 2

https://github.com/SIMHANGSUB/HoGoS/tree/master/14 14 ~ 15 강 소스코드입니다. -------------------------------------------------------------------------------- 자 저번 강의에 이어서 ScanCode를 아스키코드로 바꾸는 작업을 진행해봅시다. interrupt.h에 다음과 같은 함수를 하나 선언해줍시다. ( ScanCode가 담긴 char 형을 받아 아스키값을 리턴해줄겁니다. ) unsigned char transScan(unsigned char); 그리고 이 함수를 interrupt.c 에 다음과 같이 구현해봅시다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18..

14. 인터럽트 - 키보드 드라이버 1

https://github.com/SIMHANGSUB/HoGoS/tree/master/14 14 ~ 15 강 소스코드입니다. -------------------------------------------------------------------------------- 자! 오늘은 키보드 드라이버를 구현해봅시다! 저번 강의를 통해 우리는 키보드 인터럽트를 받을 수 있게 되었습니다. 그렇다면 이제 어떤 키를 눌렀는지를 알아봐야겠죠? interrupt.c 에 들어가서 버퍼용 전역변수를 하나 선언합시다. 여기에 어떤 문자를 입력했는지 저장할 겁니다. unsigned char keybuf; 그리고, init_intdesc() 함수 끝에 다음과 같은 어셈블리 코드를 추가합시다. 이는 키보드 입력을 받겠다는 일종의..

13. 인터럽트 - ISR 구현

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10 ~ 13 강 소스코드입니다. -------------------------------------------------------------------------------- 대망의 마지막 인터럽트 구현입니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) ISR이라고 거창하게 적었지만 실상은 인터럽트 발생시 실행할 함수 구현하는 겁니다. 대표적으로 int_ignore() 함수를 작성해봅시다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25..

12. 인터럽트 IDT 구현

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10 ~ 13강 소스코드입니다. -------------------------------------------------------------------------------- 저번에 설명했듯이 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 저번에 IDT 선언에 이어 실제로 구현해보도록 하겠습니다. 당장 interrupt.c를 만들어 다음과 같이 작성해봅시다. 1 2 3 4 5 6 7 8 9 10 11 #include "interrup..

11. 인터럽트 - IDT 선언

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10~13강 소스코드입니다. -------------------------------------------------------------------------------- 저번에 설명했듯이 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 을 다뤄보도록 하죠. 구글링을 통한 여러 포스트를 살펴보면 IDT를 어셈블리로 구현하는 분들이 대부분입니다. 물론 그렇게 하면 나름 쉽게 셋팅이 가..

10. 인터럽트 - PLC 세팅

https://github.com/SIMHANGSUB/HoGoS/tree/master/10 10~13강 소스코드입니다. -------------------------------------------------------------------------------- 인터럽트를 이제 구현해봅시다! 이 파트는 굉장히 복잡하고 하드코어하기 때문에 포스트를 여러 번 나누어서 할 겁니다. 준비 단단히 하시기 바랍니다. 인터럽트를 구현하기 위해서는 크게 3단계를 구현해야 합니다. 1. PIC 셋팅 ( 하드웨어 셋팅 ) 2. IDT ( 전에 구현했던 GDT와 같은 종류 ) 3. ISR ( 실제 인터럽트 발생 시 실행되는 코드 ) 요번 포스트에서는 1. PIC 셋팅 을 다뤄보도록 하죠. ------------------..