Welcome to My World (www.dgmayor.com)

소프트웨어/C & 자료구조 & 커널 & DB 24

22. Grub 배경화면 바꾸기

Cent os Grub 배경화면을 바꾸는 방법에 대해서 작성한 글입니다. 터미널창만 나오는 '최소버전'이 아닌 window X가 뜨는 'GNOME 데스크톱'을 기반으로 설명한 글임을 미리 밝힙니다. 1번.이미지 다운받기 - Firefox 브라우저를 연 뒤 구글을 검색해서 들어간다. - 구글 입력창에 내가 원하는 이미지를 입력해서 검색한다. 연예인 사진을 grub배경화면으로 하고 싶다면 그 연예인의 이름을 입력해서 사진을 다운로드 받으면 된다. - 나는 검정색 배경화면을 하고 싶어서 검색창에 'dark image 640 480'이라고 입력했다. - 이미지를 다운받을 땐 640x480사이즈의 이미지를 다운받아야 한다. 그래야 나중에 머리쓰는 고생을 안한다. 640x480사이즈의 이미지를 다운받아야 하기 때문..

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 셋팅 을 다뤄보도록 하죠. ------------------..

9. C언어로 OS 만들기

이제 본격적으로 C언어로 OS를 개발해봅시다. 전산학을 공부한 사람이라면 어떤 언어로 프로그램을 만들던 결국 어셈블리어로 변환되고 그 후 기계어로 변해 동작한다는 것을 알 겁니다. 지금까지 짠 코드들은 모두 어셈블리어로 개발했습니다. 해당 코드와 합치기 위해선 C언어로 개발한 코드를 어셈블리어로 변환하고 궁극적으로 기계어로 변환해서 우리의 OS 이미지(image)에다 붙여넣을 것입니다. 우리의 목표는 C언어로 개발을 하되, 소스코드를 기계어로 만들어 통합하는 것입니다. C언어에서 기계어를 추출하는 방법은 여러 가지입니다. 저는 Linux 계열에서 제공하는 gcc 컴파일러를 사용할 예정입니다. 그런데 개발을 Windows 상에서 하고 있었으니... Linux를 vmware에 설치해야겠죠? 요약하면, 다음과..

8. 커널 프로그램 만들기

목차 커널이 뭔가요? 커널 프로그램 코드 설명 vmware 시뮬레이션 커널이 뭔가요? 사전적 정의를 먼저 살펴보겠습니다. 씨앗의 안쪽 부분. 생각이나 주제에 대한 중심의, 중요한 부분. - oxford 영어사전 컴퓨터에서의 커널이란, 다음 그림과 같습니다. 사진에 나와 있는 내용을 전부 다루지는 않습니다. 책에서 주로 다루는 내용은 프로세스 관리( Process Management )와 메모리 관리( Memory Management )입니다. 두 부분을 좀 더 중점적으로 공부할 수 있을 것으로 예상합니다. 커널 프로그램 아직 커널이라고 하기에는 많이 부족한 프로그램이지만, 커널을 만들어봅시다. kernel.asm 파일로 작성해주세요. kernel.asm 코드 설명 ( line 7 ) xor ax, ax ..

7. boot loader 작성하기

OS [32bit] 부트로더 작성하기 by 올리고당 2021. 7. 27. 목차 전체 코드 BIOS 인터럽트 코드 설명 실제 동작 전체 코드 이전 코드에서 삭제된 부분은 line 20 ~ 41입니다. 추가된 부분은 아래 사진에서 // 로 표시된 line 22 ~ 37 부분입니다. 추가된 코드의 모든 부분이 int 13h 명령어( line 33 )에 대해 준비하고, 그 결과에 대한 처리를 하는 과정입니다. BIOS 인터럽트 int 13h 명령어는 BIOS에서 제공하는 인터럽트 중 하나입니다. 인터럽트란, 특정 외부 입력이 들어오면 진행 중이던 절차( main program )를 잠시 멈추고, 외부 입력에 대응하는 절차( ISR : Interrupt Service Routine )를 수행한 후, 멈춘 부분(..

6. boot sector에서 프로그램 꺼내기 2

곧 부트로더가 될 프로그램 일단 해봅시다! boot1.asm 파일을 다음과 같이 작성해주세요. boot1.asm 코드 설명 Q1. mov ds, cs는 불가능 한가? : CPU 내부 구조적인 문제로, 세그먼트 레지스터의 값을 바꾸려면, 범용 레지스터를 거쳐야 합니다. - 인텔 매뉴얼 vol.1 6-16page 6.3.1.1 절 참고. Q2. 비디오 메모리 세그먼트 16비트 세그먼트:오프셋 방식으로 표현할 수 있는 주소는 0000:0000 ~ FFFF:FFFF입니다. 이 중 모두를 RAM이 사용하는 것이 아니라, 다른 주변장치에도 주소가 할당되어 있습니다. 어느 기기에 어느 주소가 할당되었는지에 대한 분포를 나타낸 것을 메모리 맵이라 합니다. 메모리 맵 ( 참고도서 36페이지 발췌 ) 실습 코드에서는 컬러..