2012-03-26 5 views
1

실제 부팅 모드에서 보호 모드로 전환 한 후 GDT 설명자를로드 한 다음 일부 스테이지 2 코드를 호출하는 자체 부팅 로더를 빌드하려고합니다. 내 프로그램을 디버깅하는 좋은 방법을 알 수 없으므로, 일을 시작하기위한 힘든 싸움이었습니다. 이상한 이유로 내 코드가 내 부트 로더의 두 번째 섹터를 메모리 주소 0x1000 주소로 읽는 데 실패합니다. 나는 Get Status of Last Drive Operation interupt 인 al = 0x01으로 int 0x13을 사용해 보았습니다. 0x01을 반환합니다. 이는 나를 더 혼란스럽게하는 Invalid Command을 의미합니다.부팅 이미지에서 섹터로드시 부트 로더에서 오류가 발생합니다.

mov ah, 0  ;reset drive 
    int 0x13 
    or ah, ah  ;check for error 
    jnz err  ;error handling function (prints ASCII A) 

    mov ax, 0 
    mov es, ax 
    mov bx, 0x1000 ;read sector into 0000:0x1000 

    mov ah, 0x02 ;read sector 
    mov al, 1  ;# of sectors to read = 1 
    mov ch, 0  ;Cylinder = 0 
    mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code) 
    mov dh, 0  ;head = 0 

        ;dl should equal the drive number as BIOS automatically detects it 
    int 0x13 
    or ah, ah 
    jnz err  ;check for error again (this is where the error occurs) 

컴퓨터가 부팅 될 때, 나는 BIOS 그래서 내 모든 인터럽트가 올바른 드라이브에서 수행해야 dl 레지스터에 드라이브 문자를 배치 것을 이야기하고있다. 플로피 드라이브 A:과 같고 BOCHS (CPU 에뮬레이터)에서 플로피 드라이브 A:을 부팅 이미지로 설정했지만 여전히 부팅되지 않습니다. 을 설정하려고했습니다. QEMU와 BOCHS가 코드를 올바르게 에뮬레이트하지 못하는 이유가 있습니까? 나는 이것을 USB에 태우고 라이브 BIOS에서 부팅 해 보려하지 않았다. 완성 된 코드 here을 게시하여 필요한 경우 검토 할 수 있도록하겠습니다. 내가 충분히 명확하지 않다면 사과 드리며 OS 개발 초보자입니다. 많은 감사합니다!

편집 : OS : Windows 7 x64 (x32 OS 개발 중) 에뮬레이션 : BOCHS는 NASM 컴파일러에서 생성 한 boot.img입니다.

+0

질문에 대답 했습니까? – Stewart

+0

@Stewart 부트 로더를 다시 작성하여 테스트 할 수 있습니다. 나는 당신의 새로운 코드를 그것에 통합하자마자 되돌아 올 것이다. 걱정 마세요 :) – user99545

답변

0

오류를 잘못 확인하고 있습니다. int 0x13 ah = 0 예를 들어, 아에서 어떤 것을보고하지 않고 carry 플래그를 설정하여 오류를 나타냅니다. ah jnz err 대신 또는 jh err을 사용하여 캐리를 설정하면 점프해야합니다.

관련 문제