Project/OStrial in AMAZON 9

#n+3 하드디스크 드라이버 - 읽기

지난번까지 QEMU 환경으로 변환했고, 하드디스크를 구현할 차례이다. #interrupt.c __asm__ __volatile__("mov eax, %0"::"r"(&idtr)); __asm__ __volatile__("lidt [eax]"); __asm__ __volatile__ ( "mov al, 0x00;" "out 0xA1, al;" "mov al, 0x00;" "out 0x21, al;" ); __asm__ __volatile__("sti"); return; } mov al,, 0x00 out 0xA1, al - 슬레이브 PIC의 모든 인터럽트를 열어둔다. mov al,, 0x00 out 0x21, al - 마스터 PIC의 모든 인터럽트를 열어둔다. 이렇게 모든 인터럽트를 해방하고 나서 하드디스..

#n+1 이제 키보드 입력을 통한 쉘을 만들어봅시다.

우리가 평소에 우분투나 윈도우에서 사용하는 쉘도, 결국 키보드 입력을 받아 그에 맞는 명령어를 실행시키는 것과 같다. 그럼 이 작은 운영체제에도 비슷한 방법으로 쉘을 구현할 수 있지 않을까? 큰 틀은 비슷하다. 이미 이전 포스트에서 소문자 알파벳을 입력받아 실행하도록 구현했으니, 이번에는 엔터를 구현하고 엔터를 누르는 순간 지금까지 입력했는 문자열에 맞는 명령어를 실행시키도록 한다. 먼저 기능 구현 전, 메인에서 사용할 수 있도록 버퍼와 쉘에서 사용할 현재 line과 col을 data.h에 구현해준다. unsigned char keyboard[videomaxcol]; unsigned short kindex; unsigned short curline; unsigned short curcol; keyboar..

#n 중간 건너뛰고 키보드 드라이버 처리

바로 앞 14강에서는 키보드의 입력을 받는 처리를 진행해주었다. 이번 파트에서는 입력은 되었지만 아스키코드로 변환이 되지 않는 부분을 고쳐줄 예정이다. 먼저, interrupt.h에 다음과 같이 함수 하나를 선언해준다. unsigned char transScan(unsigned char); interrupt.c에 다음과 같이 transScan 함수를 구현해준다. 일일이 잡작업하는 함수긴 하지만, 키보드의 스캔 코드에 따라 알맞은 알파벳으로 변경하는 함수이다. 스캔 코드는 키보드가 하드웨어에게 어떤 키를 눌렀는지에 대해 보내주는 데이터이다. 제일 처음 만들어진 스캔코드 세트는 1이고, 최신에 와서도 하위 호환성을 유지하기 위해 set1을 꾸준히 사용한다. 그래서 이 운영체제에서도 키보드 스캔 코드는 set..

#5 C언어로 개발하기!

본 포스트를 시작하기 전, VM과 윈도우 간의 공유폴더가 설정되어있다는 하에 진행합니다. * 전 안돼서 그냥 복붙머신 했어요 클립보드 공유 최고 우선 다음과 같은 C 코드를 짭니다. 해당 코드는 간단하게 비디오 세그먼트 부분에 HelloWorld를 쓰는 코드이다. 컴파일은 gcc를 이용하여 다음과 같이 진행한다. 첫번째 명령어는, gcc를 이용하여 main.c 코드를 obj 코드로 바꾸는 코드이다. 두번째 명령어를 이용하여 main.img를 얻는데, 해당 코드를 메모리의 0x10200에 올리겠다는 의미이다. 마지막 명령어는 main.img에서 필요한 부분만 추출하여 disk.img를 만들어 낸다. 여기까지 하면, disk.img를 읽기 위해 기존에 짰던 코드에 수정이 필요하다. 기존의 al은 1을 넣었는..

#4 어셈블리_함수

사실 어셈블리는 함수라는 것이 존재한다기보다는 레이블을 이용하여 함수를 구현해내는 것에 가깝다고 생각함. printf: push eax printf_loop: or al, al jz printf_end mov al, byte [esi] mov byte [es:edi], al inc edi mov byte [es:edi], 0x09 inc esi inc edi jmp printf_loop printf_end: pop eax ret 위 코드는 3번째 포스트에서 썼던, 문자열을 출력시키는 코드이다. 보통 함수라고 한다면, 저기 표시되어 있는 printf:, printf_loop: 등, 콜론이 달려 있는 부분이 함수 이름이고 함수를 호출하면 그 안에서 돌고 알아서 끝나지 않나 싶은데 아니다. 어셈블리에서 pri..

#3 Protected Mode

이전 포스트까지는 16비트로 돌아가는 리얼모드에서 구동했지만, 이제부터는 32비트의 보호모드에서 운영체제를 구동시켜보도록 한다. 리얼모드는 PC가 부팅할 때, 맨 처음에 동작하는 CPU의 모드로 16비트로 동작한다. 때문에 모든 레지스터가 16비트로 구동됨. 레지스터는 모두 16비트의 한 개의 WORD로 이루어짐, 즉 한번에 0xFFFF 까지밖에 저장이 불가. 1. 인텔 CPU에서는 세그먼트 오프셋 방식을 사용하여 주소에 접근하는데, 리얼모드에서는 두 레지스터를 사용해도 16비트씩밖에 사용을 못하기 때문에 오프셋이 정해진다면 해당 오프셋:0xFFFF 까지 밖에 접근을 못한다. -> 즉, 해당 오프셋 바깥의 주소에는 접근이 불가하며, 접근을 위해서는 FAR JMP를 실행해야 함. 2. 리얼모드에서 동작하는..

#2 이제 하드디스크를 읽어봅시다 (커널 로드)

1번 글에서 코드 설명을 하다 말긴 했는데... 남은 부분이 비디오 메모리 접근, 글자 색 설정하는 부분이라 천천히 입력하도록 하겠습니다. 앞에서 오프셋을 통해 MBR을 메모리에 올려, 비디오 메모리에 접근하여 글자를 출력할 수 있게 코드를 작성했습니다. 마지막에 매직 워드를 넣으므로써 BIOS 가 이 코드가 MBR임을 확인하게 하고. 프로그램을 마쳤습니다. 이번에 할 부분은 MBR을 통해 디스크의 나머지 부분을 메모리로 읽을 수 있도혹 한 후, 그 주소로 점프하도록 진행하려 합니다. 1. x86 CPU 메모리맵 a. Low Memory (< 1MiB) : 커널 단에서 접근 가능한 메모리 메모리 주소 묘사 0x00000 ~ 0x004FF 리얼모드 IVT, BDA(Bios Data Area) 0x00500..

#1 부트로더까지 어떻게 만들어봅시다

운영체제 수업을 들으면서 추가 공부를 위해 동기 네명 모아서 OS 개발 진행해보려고 함. 아마 개발이라고 해도 나와있는 코드 짜집기겠지만 기본적인 운영체제, 컴퓨터 구조에 대한 개념만 다시 잡을 수 있어도 좋은 경험일거라 생각했다. *주로 https://blog.naver.com/simhs93/221256938174 이 포스트 시리즈와 만들면서 배우는 OS 커널의 구조와 원리, 김범준 이 책을 참고하였습니다. 1. NASM 설치 https://www.nasm.us/pub/nasm/releasebuilds/2.14/win64/ Index of /pub/nasm/releasebuilds/2.14/win64 www.nasm.us 여기서 깔았음 installer 다운받으면 그냥 설치하는 프로그램 돌아가고 zip..