https://www.acmicpc.net/problem/1238 [ 나의 해결법 ]이 문제는 다익스트라 알고리즘을 이용해서 풀면 된다. 그런데 그냥 다익스트라 알고리즘으로 풀면 시간초과가 난다. 시간복잡도를 계산하면 10억이 훌쩍 넘는다. 3중 for문을 돌기 때문이다.다른 사람들의 질문들을 보니 플로이드 와샬 알고리즘을 이용한 사람도 있다. 그런데 나는 우선순위 큐를 이용한 알고리즘을 사용할 것이다. 코드는 아래와 같다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#include #include #in..
Assembly로 작성된 EntryPoint.s에서 C로 작성된 kernel로 어떻게 넘어갈까? [ 그림1. C로 만들어진 kernel의 배치 ] Enty point의 코드는 0x10200 전까지만 채워져 있다. 그리고 Entry point의 마지막 명령어가 jmp $이기 때문에 무한 루프를 돌고 있다. C로 만들어진 kernel을 주소 0x10200에 올리고 Entry point의 마지막 명령어를 jmp dword 0x08: 0x10200으로 수정하면 kernel이 작동할 수 있을 것이다. 하지만 이러한 계획에는 3가지 제약조건이 있다.1) C라이브러리 호출 불가2) 0x10200 위치에 kernel코드 배치3) kernel 코드는 순수한 바이너리 파일 1)번의 제약조건은 컴파일할 때, gcc에 옵션으..
부트로더가 하는 일은 별거없다. OS 이미지를 1MB이하의 메모리로 복사하기만 하면된다.이러한 코드는 부팅디스크의 첫번째 섹터(512byte)에 기록된다. 이를 MBR(Master Boot Record)라고 부른다. 우선은 최소한의 역할을 하는 부트로더를 만들어보자. 하는 일은 1. BIOS에 의해 부트로더로 인식되서 메모리에 올라가고2. 무한 루프를 돈다.* 아직은 OS이미지 복사 기능이 없다 BIOS에 의해 부트로더로 인식되는 일은 아주 간단하다. 512바이트의 마지막 2바이트에 0x55, 0xAA를 써넣기만 하면된다.코드는 아래와 같다. 코드는 nasm 컴파일러를 사용했다. 1 [ORG 0x00]2 [BITS 16]34 SECTION .text56 jmp $78 ti..