2016-11-28 12 views
3

이 질문은 이전에 물어 보았지만 다른 대답으로는 제 문제가 해결되지 않은 것 같습니다. 어쩌면 내가 놓친 것일까?부트 로더가 실제 컴퓨터에서 작동하지 않습니다.

QEMU에서 실행했기 때문에 .iso가 작동한다는 것을 알고 성공적으로 작동했습니다. 그래서 내가 뭘 잘못하고 있니?

bits 16 

xor ax, ax 

start: 
    cld    ; Set direction flag to forward 

    ; Set up registers 
    mov ax, 07c0h  ; Segment location which BIOS loads 
    add ax, 288  ; (4096 + 512)/16 bytes 
    mov ss, ax  ; Sets stack segment register 
    mov sp, 4096  ; Sets stack pointer register (offset of stack) 

    mov ax, 07c0h 
    mov ds, ax  ; Sets data segment to where we're loaded 

    mov si, text  ; Puts string into source index 
    call print_string ; Calls print string 

    jmp $    ; Infinite loop to prevent shutdown 

print_string: 
    mov ah, 0eh  ; System call for printing 
    xor bh, bh  ; Sets BH register to 0 

.repeat: 
    lodsb    ; Loads byte into AL 
    cmp al, 0   ; Sees if AL is 0 
    je .done   ; Jumps to done if AL is zero 

    int 10h   ; Otherwise, print 
    jmp .repeat  ; Repeat 

.done: 
    ret 

text db 'Test', 0 

times 510 - ($ - $$) db 0 ; Pads 510 - (current location - start location) zeros 
dw 0xAA55     ; Standard PC boot signature (takes up 2 bytes) 

편집 : 나는 내 코드에 다음을 추가했습니다 : iso 파일을 만들기위한

xor ax, ax 
cld 
xor bh, bh 

, 나는 다음과 같은 명령을 실행에 iso 파일 굽기

dd if=/dev/zero of=floppy.img bs=1024 count=1440 
dd if=bootloader.bin of=floppy.img seek=0 count=1 conv=notrunc 
mkdir iso 
cp floppy.img iso/ 
mkisofs -o file.iso -b floppy.img iso 

을 내 usb, 다음 명령을 실행합니다 :

umount /dev/sdX 
dd if=/home/mint/Downloads/file.iso of=/dev/sdX bs=4M && sync 
+2

실제 컴퓨터에서 ".iso"를 부팅하려면 정확히 무엇을하고 있습니까? –

+2

_LODSB_를 사용하여 정방향을 사용하므로 _CLD_로 방향 플래그를 앞으로 설정할 수 있습니다. 당신은 당신의 coe에 도달하기 전에 BIOS가 어떤 방향으로 설정했는지 보장 할 수 없습니다. –

+1

[Int 10h/ah = 0eh] (http://www.ctyme.com/intr/rb-0106.htm)의 경우 BH 레지스터를 0으로 설정하면 쓰기 위해 페이지 번호로 사용되기 때문에 . –

답변

3

당신이 만든 iso는 광학 디스크 이미지입니다. 실제 컴퓨터에서 부팅 할 때만 광 디스크 (예 : CD-R)에 구울 수 있습니다. QEMU와 함께 사용하면 분명히 에뮬레이트 된 CD-ROM으로 사용하고있는 것입니다. USB 드라이브에 복사하면 USB 드라이브에서 부팅하기위한 올바른 형식이 아닙니다.

USB 드라이브를 부팅하는 올바른 형식은 간단합니다. 부트 로더는 플로피 또는 하드 디스크처럼 드라이브의 첫 번째 섹터에 있어야합니다. 따라서 "iso"부분을 만드는 것을 건너 뛰고 USB 드라이브에 부트 섹터를 직접 작성하십시오. 예 :

dd if=bootloader.bin of=/dev/sdX 
+1

아마도 "하이브리드"ISO 이미지가 리눅스 "라이브 CD"이미지에 일반적으로 사용된다는 사실 때문에 OP가 혼란 스러웠습니다. 올바른 파티션 테이블과 같이 보이기 때문에 USB 장치로 'dd'할 수 있습니다 부팅 가능한 ISO9660 이미지와 같으며 syslinux 3.72 이상에서는이 부팅을 지원합니다. ([이 블로그는 그 중 일부를 간략히 언급하고 있습니다] (https://www.turnkeylinux.org/blog/iso2usb) 대부분 isohybrid 명령을 사용하고 있습니다.) –