본문 바로가기

Security/Kernel & OS

[Operation System] 6. OS 만들기 - Kernel Load - 1 1. Pre.. 이번 시간에는 커널을 로드해 볼 겁니다. 2. Process - boot 프로그램 만들기 - kernel 프로그램 만들기 - 두개를 .img 파일로 합치기 : copy /b boot.bin + kernel.bin os.img - 플로피 디스크로 부팅 3. Code - boot.asm [org 0] jmp 07C0h:start start: mov ax, cs mov ds, ax mov es, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di,2 dec cx jnz paint read: mov ax, 0x1000 ; es:bx = 0x1000:1.. 더보기
[Operation System] 5. OS 만들기 - BootStrap - 4 1. 8086 - 1978년 인텔에서 제작된 CPU로서 처음으로 x86 아키텍처를 적용한 제품이다. - 내부적으로는 16 bit 레지스터를 사용한다. 하지만...... - 어드레스 버스가 20 bit 였으므로 1024 * 1024 = 1048576 (byte) = 1 MB 만큼의 메모리를 사용할 수 있다. - 바이오스에서 사용하는 영역인 384 KB 를 제외하면 640 KB 만을 실제로 사용할 수 있다. - 8086 에서 사용하는 1MB 의 Memory Map - 0x000 ~ 0x3FF 까지 0x400(1 KB)은 IVT로 사용, 0x400 ~ 0x4FF 까지 BDA로 사용한다. - 0x500 ~ 0x9FFFF 까지는 자유롭게 사용할수 있다고 나와 있다. 하지만.... - 0x7C00 ~ 0x7DFF .. 더보기
[Operation System] 4. OS 만들기 - BootStrap - 3 1. Pre.. 이번엔 아스키 아트 + 색깔을 넣어서 출력을 해 봅시다. - 플로피디스크에 프로그램을 담아 부팅시켜보자. 2. Process - 아스키 코드로 만든 그림 - 비디오 램에 접근해서 색깔 정하는 법 - 배경색 지정하는 법 3. Code [org 0] jmp 0x7c0:start ; cs = 0x7c0 start: mov ax, cs ; segment register 은 직접 복사가 안된다. mov ds, ax ; cs 와 ds 가 같은 값을 갖게 하기 위한 작업 mov ax, 0xb800 ; video ram ( color vga area ) mov es, ax ; es 하늘 색 ; 0xB800:0001 -> 하늘색이 들어감 cmp al, 0 ; 만약 끝나면 forever 로 가셈 je fo.. 더보기
[Operation System] 3. OS 만들기 - BootStrap - 2 1. Pre.. 이번엔 Hello World 를 출력하는 부트로더를 제작해 봅시다. - 플로피디스크에 프로그램을 담아 부팅시켜보자. 2. Process - 물리주소의 시작위치 정하기 - 'hello, world'의 메모리 공간 확보 - 비디오 서비스를 위한 BIOS 인터럽트를 걸어 화면에 출력 3. Code [org 0] ; 물리주소 계산법 : (cs 32 비트 정수 또는 실수 dq -> 64 비트 정수 또는 실수 dt -> 80 비트 10바이트 정의 % Start 가 0x5 로 바뀐 이유 어셈을 아시는 분은 아시겠지만, 저 줄의 총 바이트 수가 5바이트 이기 때문입니다. ( 컴파일러가 바이너리에는 반영이 안됨 ) 4. Run 5. Disassem 00000000 EA0500C007 jmp word 0x.. 더보기
[Operation System] 2. OS 만들기 - BootStrap - 1 1. Pre.. 이번엔 간단하게 아무것도 안하는 부트로더를 제작해 봅시다. - 플로피디스크에 프로그램을 담아 부팅시켜보자. - NASM 컴파일 : nasm -f bin -o boot.bin boot.asm ) - VMware 로 .BIN 파일을 플로피 디스크로 부팅시키기 2. Process - CPU가 BIOS 롬에 새겨진 프로그램 실행 - 현재 사용하는 마더보드 상태, 주변 접속장치등 체크 - 디스크의 첫 512바이트 (MBR 영역 0번 트랙 1번 섹터)를 램으로 읽어들여 ran : 0x7c00 번지에 로드 - 프로그램 실행 3. Code hang: jmp hang ; 중간에 510 byte 사용 가능 times 510 - ($-$$) db 0 ; $ 자신의 현재 위치 - $$ 시작위치 ; 나머진는 0.. 더보기