일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 |
- libpcap
- BEST of the BEST
- Network
- 인터럽트
- command
- 오버워치 세이버메트릭스
- ftz
- vi
- #
- >
- FTZ 레벨2
- 오버워치
- linux
- #MINT64 #Sqix
- vim
- libtins
- C++11
- Overwatch League SaberMetrics
- KASAN
- #IntelManual
- #Qt Creator
- vi 외부 명령어
- Find
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- #Best of the Best #OS #MINT64 #Sqix
- Sqix
- Today
- Total
Sqix
64bit 멀티코어 OS 제작하기 [3] - 2 : 가장 기초적인 부트 로더 제작 본문
이번 글은 부트 로더에 대해 다룹니다.
이전에도 언급하였듯, 부트로더는 마지막 2바이트를 이용하여 검증합니다. 즉, 0x55, 0xAA를 적어 놓는다면 이를 부트로더로 인식하여 동작을 시킵니다. 하지만, 이전에도 언급하였듯 부트로더는 어셈블리 언어로 작성을 해야 합니다. 따라서 먼저 가장 기본적인 어셈블리 명령어들에 대해 간단히 알아봅시다.
ASM
● 사칙 연산
- add A, B A + B 연산을 진행하고, 결과를 A에 저장
- sub A, B A - B 연산을 진행하고, 결과를 A에 저장
- mul A AX의 레지스터 값과 A를 곱하고 AX 혹은 DX:AX에 저장
- inc A A에 1을 더해 A에 저장
- dec A A에 1을 빼 A에 저장
- div A AX 혹은 DX:AX를 A로 나누어 몫을 AL 혹은 AH에 저장하고 나머지를 AX 혹은 DX에 저장
● 논리 연산
- and A, B A와 B를 AND연산하여 A에 저장
- or A, B A와 B를 OR연산하여 A에 저장
- xor A, B A와 B를 XOR연산하여 A에 저장
- not A A에 NOT연산하여 A에 저장
● 대입 및 분기
- mov A, B A에 B의 값을 복사
- cmp A, B A에서 B를 빼서 A가 B보다 크면 Sign Flag 0, Zero Flag 0, 같다면 Sign Flag 0, Zero Flag 1, 작다면 Sign Flag 1, Zero Flag 0으로 Set
- jmp A Address A로 이동하여 A부터 코드를 수행
- 그 외 다양한 jmp 연산
● 함수 호출
- call A 스택에 Call 다음 명령어를 push하고 A 위치의 코드 실행.
- ret A 스택을 A만큼 줄이고(add) 기존에 삽입되었던 되돌아갈 주소를 꺼내 해당 주소의 코드 실행.
● 스택
- push A A를 스택에 Push
- pop A 스택 최상단의 값을 꺼내 A에 저장
● 인터럽트
- int A 인터럽트 테이블 중 A번째 인터럽트를 발생시킴
- cli 인터럽트를 발생하지 못하도록 지정
- sti 인터럽트를 발생할 수 있도록 지정
● I/O 제어
- in A, B I/O 포트 B에 입력된 값을 A에 저장
- out B, A A의 값을 I/O 포트 B에 출력
이제 어셈블리 언어에 대해 어느 정도 감을 잡았으니, 부트로더를 제작해 봅시다. 00.BootLoader에 BootLoader.asm 파일을 생성합니다.
정말 아무 역할을 수행하지 않고, 첫 섹션 부분의 1~510byte까지를 전부 0으로 채우고 511, 512번째 부분을 0x55, 0xAA로 채운 가장 간단한 부트로더를 만들었습니다.
그 후 QEMU를 통해 테스트합니다. 여기서 저는 우분투를 사용하기 때문에, 먼저 make를 통해 빌드하여 Disk.img를 생성하였습니다. 또한, 명령어 역시 조금 바꿨습니다. 책에 기재된 명령어를 통해 실행하면 잘 작동하지 않았기 때문에, http://linux.die.net/man/1/qemu-kvm 에서 옵션을 확인하고 수정할 필요가 있었습니다.
-L 명령어는 bios의 디렉토리를 지정하는 것인데, 여기서는 Disk.img에 포함이 되어 있기 때문에 굳이 필요가 없음을 알 수 있었습니다.
따라서 바뀐 명령어는 다음과 같습니다.
# qemu-system-x86_64 -m 64 -fda ./Disk.img -localtime -M pc
이제 부트 로더가 정상동작함을 확인했으니, 꾸며 보도록 합시다.
이 부분부터는 다음 글에서 작성하도록 하겠습니다.
'MINT64 OS ' 카테고리의 다른 글
64bit 멀티코어 OS 제작하기 [4] - 1 : OS 이미지 로딩을 위한 부트로더 기능 추가 (1) (0) | 2018.05.16 |
---|---|
64bit 멀티코어 OS 제작하기 [3] - 3 : 부트로더 화면 제어 (0) | 2018.05.14 |
64bit 멀티코어 OS 제작하기 [3] - 1 : 부트로더와 makefile (0) | 2018.05.14 |
64bit 멀티코어 OS 제작하기 [2] - 2 : 메모리 관리 기법 (0) | 2018.05.10 |
64bit 멀티코어 OS 제작하기 [2] - 1 : 운영 모드와 레지스터 (0) | 2018.05.08 |