2016-07-21 11 views
1

지난 몇 주 동안 어셈블리로 부트 로더와 커널을 작성해 보았습니다. (x86/x86_64)보다 복잡한 솔루션을 시도해 보았습니다. 어떤 코드를 시험해보기 위해서 신성화 된here으로 게시되었습니다. 내 부트 로더 코드는 다음과 같습니다가상 머신에서 부트 전용 부트 로더/커널 만 부팅

;set print-registers 
MOV AH, 0x0E ;function nr 
MOV BH, 0x00 ;page 
MOV BL, 0x07 ;color 

MOV SI, msg ;move msg to SI-pointer 
CALL PrintString ;call function to print SI (msg) 

JMP $ ;hang 

PrintString: 
.next_char: 
MOV AL, [SI] ;current character 
OR AL, AL 
JZ .print_done ;if current char is zero, go to end 
INT 0x10 ;print character 
INC SI ;increase pointer to msg (next character) 
JMP .next_char 
.exit_char 
RET 

msg db 'Hello world from the kernel!', 13, 10, 0 

TIMES 512 - ($ - $$) db 0 ;fill the rest 

내가 다 잘 조립 얻을 수 있고, 플로피 컨트롤러에 연결된 경우 하나의 바이너리 버추얼 박스 내부의 부츠를 만들어 :

[BITS 16] 
[ORG 0x7C00] 

MOV DL, 0x0 ;drive 0 = floppy 1 
MOV DH, 0x0 ;head (0=base) 
MOV CH, 0x0 ;track/cylinder 
MOV CL, 0x02 ;sector (1=bootloader, apparently sectors starts counting at 1 instead of 0) 
MOV BX, 0x1000 ;place in RAM for kernel - I suppose randomly chosen on examples 
MOV ES, BX ;place BX in pointer ES 
MOV BX, 0x0 ;back to zero - also has something to do with RAM position 

ReadFloppy: 
MOV AH, 0x02 
MOV AL, 0x01 
INT 0x13 
JC ReadFloppy ;if it went wrong, try again 

;pointers to RAM position (0x1000) 
MOV AX, 0x1000 
MOV DS, AX 
MOV ES, AX 
MOV FS, AX 
MOV GS, AX 
MOV SS, AX 

JMP 0x1000:0x0 

;assuming we get never back here again, so no further coding needed (kernel handles everything now) 

TIMES 510 - ($ - $$) db 0 ;fill resting bytes with zero 
DW 0xAA55 ;end of bootloader (2 bytes) 

내 커널 파일입니다. 이것은 나 자신의 로더와 커널에서 작업 할 수있는 확신을 주지만, 베어 메탈로 부팅하는 것에 만족하고 싶습니다.

나는 USB 드라이브를 사용하지 않고 이미지를 부팅하려고 시도했으며, USB 스틱을 올바르게 이미징하고 있음을 확신합니다. 나는 여기서 정말로 분명한 것을 놓치고 있다는 느낌을 받기 시작했다. 나는 실제로 USB에서 원시 바이너리를 읽으려고하는 "플로피"에서 13h를 읽는 것과 관련이 있다고 생각합니다. 이 경우인가요? 그렇다면 플로피 대신 비 특정 디스크에서 읽도록 부트 로더를 다시 쓰려면 어떻게해야합니까?

+1

링크를 클릭해야하므로 코드를 보지 않았습니다 ... 그러나 코드에서 BIOS 매개 변수 블록을 제공하지 않으면 실제 하드웨어를 본 것으로 말할 수 있습니다 가상 머신보다 훨씬 까다 롭습니다. 올바른 형식의 BPB가 있는지 확인하고 도움이되는지 확인하십시오. –

+0

이미 BIOS 매개 변수 블록을 추가하려고 시도했지만 실제로 변경되지 않았습니다. – Lobstre

+1

해당 코드를 [MCVE] –

답변

1

나는이 코드에 적용되는 General Bootloader tips을 작성했습니다. 특히 나는이 끝이 :

  1. BIOS가 코드는 CS, DS, ES, SS, SP에 의존 할 수 없습니다로 이동 가진 유효한 또는 기대 값을 등록합니다. 부트 로더가 시작될 때 적절하게 설정되어야합니다. 부트 로더가 물리적 주소 0x00007c00에서로드되고 실행되며 부팅 드라이브 번호가 인 DL 레지스터로로드된다는 보장 만 할 수 있습니다.

첫번째 플로피 디스크의 부팅 드라이브는 플로피 디스크 이미지를 가상 드라이브 A로 마운트 부팅 때문에 0이 너무 가상 머신 가능성이 근무 일반적이다. 문제의 원인이되는 코드는 ReadFloppy 코드에 있습니다. 특히이 행은 다음과 같습니다.

MOV DL, 0x0 ;drive 0 = floppy 1 

BIOS에서 전달한 값을 사용해야하는 곳에 하드 코드 0이 지정됩니다. 플로피 드라이브 A 이외의 다른 것으로 부팅 한 시스템에서는 실패 할 수 있습니다. 문제를 해결하려면 위의 줄을 제거하십시오.

제공된 링크에서 제공 한 다른 부트 로더 팁을 검토하는 것이 좋습니다.