지난 몇 주 동안 어셈블리로 부트 로더와 커널을 작성해 보았습니다. (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를 읽는 것과 관련이 있다고 생각합니다. 이 경우인가요? 그렇다면 플로피 대신 비 특정 디스크에서 읽도록 부트 로더를 다시 쓰려면 어떻게해야합니까?
링크를 클릭해야하므로 코드를 보지 않았습니다 ... 그러나 코드에서 BIOS 매개 변수 블록을 제공하지 않으면 실제 하드웨어를 본 것으로 말할 수 있습니다 가상 머신보다 훨씬 까다 롭습니다. 올바른 형식의 BPB가 있는지 확인하고 도움이되는지 확인하십시오. –
이미 BIOS 매개 변수 블록을 추가하려고 시도했지만 실제로 변경되지 않았습니다. – Lobstre
해당 코드를 [MCVE] –