실제 부팅 모드에서 보호 모드로 전환 한 후 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입니다.
질문에 대답 했습니까? – Stewart
@Stewart 부트 로더를 다시 작성하여 테스트 할 수 있습니다. 나는 당신의 새로운 코드를 그것에 통합하자마자 되돌아 올 것이다. 걱정 마세요 :) – user99545