2010-07-19 6 views
4

맞춤 운영 체제를 만들고 있습니다. 나는 두 NASM 파일이 :OS의 부트 로더가 작동하지 않습니다.

boot.asm :

[BITS 16] ;tell the assembler that its a 16 bit code 
[ORG 0x7C00] ;Origin, tell the assembler that where the code will 
;be in memory after it is been loaded 

INT 0x13 

JMP $  ;infinite loop 

TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0 
DW 0xAA55   ; add boot signature 

start.asm :

nasm boot.asm -f bin -o boot.bin 
nasm start.asm -f bin -o start.bin 

: 나는이 명령을 사용하여 .BIN 파일로 컴파일

[BITS 16] 
MOV AL, 72 
CALL PrintCharacter 
MOV AL, 101 
CALL PrintCharacter 
MOV AL, 108 
CALL PrintCharacter 
MOV AL, 108 
CALL PrintCharacter 
MOV AL, 111 
CALL PrintCharacter 
MOV AL, 44 
CALL PrintCharacter 
MOV AL, 32 
CALL PrintCharacter 

MOV AL, 87 
CALL PrintCharacter 
MOV AL, 111 
CALL PrintCharacter 
MOV AL, 114 
CALL PrintCharacter 
MOV AL, 108 
CALL PrintCharacter 
MOV AL, 100 
CALL PrintCharacter 
MOV AL, 33 
CALL PrintCharacter 

PrintCharacter: 
MOV AH, 0x0E 
MOV BH, 0x00 
MOV BL, 0x07 
INT 0x10 
RET 

TIMES 512 - ($ - $$) db 0 

그런 다음 다음 명령을 사용하여 플로피 이미지에 추가하십시오 :

dd if=boot.bin bs=512 of=MyOS.img count=1 
dd if=start.bin bs=512 of=MyOS.img count=2 

VirtualBox의 플로피 이미지에서 부팅 할 때 느낌표가 2 개 표시되고 QEmu (Q.app)로 부팅되지 않습니다. 나는 OS 개발에 익숙하지 않아 누군가가 내게 잘못한 것을 말해주고 내 OS를보다 잘 설정하는 방법에 대한 조언을 해주면 좋을 것이다.

답변

5

물론 두 개의 느낌표가 인쇄됩니다. 이제 코드를 살펴 보자 :

... 
MOV AL, 33 
CALL PrintCharacter ; |1 
         ; |  ^ |4 
PrintCharacter:  ; v |2 |  | 
MOV AH, 0x0E   ;  |  |  | 
MOV BH, 0x00   ;  |  |  | 
MOV BL, 0x07   ;  |  |  | 
INT 0x10    ;  |  |  |  5 
RET     ;  v  |3 v  ----> off to la-la land 

참고 : 나는 어떻게 프로그램 실행 진행을 보여 일부 화살표를 추가했다. 이미 출력 Hello, World했습니다 후

처음 두 줄은 최종 !을 인쇄 할 책임이 있습니다. 이는 PrintCharacter 서브 프로 시저에 대한 호출을 통해 이루어집니다. (화살표 12). PrintCharacter이 반환되면 (화살표 3) 프로그램이 곧바로 계속 진행되고 (화살표 4) 코드의 다음 줄이 PrintCharacter의 시작 부분이됩니다. AL 레지스터에는 여전히 33 (즉, !의 ANSI 코드)이 있으므로 다른 느낌표가 인쇄됩니다. ... 어떤 정의되지 않은 장소를

그런 다음, 실행이 다시 한 번 RET에 도달하지만, 당신이 한 이후가 반환되도록이 시간이, 실제로 CALLPrintCharacter,로 복귀 할 정의 된 곳이 없으며, 대부분의 아마 (화살표 5). OS가 부팅 프로세스를 중단하는 순간이 바로 그 순간이라고 생각합니다.

결론 : 코드 인쇄 Hello, World!, 그것은 다른 뭔가를해야한다 (이것은해야 적어도 정지) 당신이 정의되지 않은 동작 또는 중단 업을 얻을 때, 그렇지 않으면 ...

놀라지 마세요
+0

감사합니다. 나는 무한 루프를 시작했다. 이제는 작동한다. 하지만 여전히 QEmu로 부팅 할 수는 없습니다. – None

+0

QEMU에 대해 모르겠다. 나는 단지 추측 할 수 있습니다 : 아마도 여러분의 첫 번째 지시 (INT 0x13h)가 범인 일 것입니다. QEMU가 시작시 다르게 설정된 레지스터를 가질 수 있으며 인터럽트 호출이 원하는 것을 수행하지 않을 수 있습니다. 명시 적으로 레지스터를 설정해보십시오 ('AH = 02, AL = 01, ...'). 또는 QEMU가 플로피 드라이브를 에뮬레이션하지 않아 부팅 프로그램을로드 할 수 없습니다. - 나는'boot.asm'에서 정확히 무엇을하는지 이해하지 못한다. 'start.asm'을 메모리에로드하고 그곳으로 점프 *해서는 안되나요? – stakx

+0

start.asm의 주요 내용을 boot.asm에 넣으면 제대로 작동합니다. – None

1

VirtualBox의 코드 부팅 방법을 모르겠지만 디스크 이미지의 바이너리를 잘못 설정했기 때문에 qemu가 아니라고 확신합니다. 디스크 이미지에 'DD'를 사용하고있는 경우는 디스크를 자르지 않도록, 당신은, 그것을 옵션을 전달하기 위해이 같은 필요

dd if=boot.bin of=MyOS.img bs=512 count=1 conv=notrunc status=noxfer 
dd if=start.bin of=MyOS.img bs=512 count=1 conv=notrunc seek=1 status=noxfer 

전환 = notrunc은 'DD'을 이야기를하는 디스크를 자르거나, 삭제하고, 바이너리로 덮어 쓰면 안됩니다. status = noxfer는 덜 자세하게 만들고 seek = 1은 start.bin을 디스크의 두 번째 섹터 (0부터 시작 함)에 기록합니다.

내가 무슨 말을하고 있는지 확인하려면 1MB의 디스크 이미지를 만들고 사용중인 명령 (예 : dd)을 사용하면 디스크 이미지가 바이너리 복사본으로 축소되었음을 알 수 있습니다.

결국, start.bin을 디스크 이미지로 사용하여 qemu를 호출합니다 (MyOS.img는 마지막 'dd'명령 이후에 MyOS.img의 사본이됩니다). 그리고 부팅 서명을 사용하지 않았으므로 start.bin의 끝 부분에서 qemu BIOS가 디스크가 부팅 가능하다고 생각하지 않습니다.

관련 문제