Виртуальные машины.
Вот мне интересно, написал программку переводящую проц в защищенный режим.В VirtualBox и Qemu нормально запускается и работает. В Bochs при запуске машинка перезагружается. Специально откопали флопик, дискетку, залил все на дискетку, запустил на реальном железе - все прекрасно работает. Что это? Смертный грех разработчиков bochs'a?
Что дебаггер выдает? Код? По osdev ответ пробовали искать?
Цитата: kailot2
нужно больше лога до exception'а, ну и код бы не мешало увидеть.
Код:
org 100h
start:
mov ax,3
int 10h
;скопируем GDT по 5000h:0
mov ax,cs
mov ds,ax
mov si,gdt32
mov ax,05000h
mov es,ax
xor di,di
xor cx,cx
mov cx,[gdtsize]
rep movsb
;Загрузим код защищенного режима по адресу 07000h:0000h
;int 25h
;02h Возвращает в BX первый кластер файла
;Параметры: ES:DI = имя файла
mov ax,cs
mov es,ax
mov ah,02h
mov di,progname
int 25h
cmp bx,-1
je _error
;int 25h
;04h чтение цепочки кластеров
;Параметры:es:di = buffer BX = первый кластер цепочки
mov ax,07000h
mov es,ax
xor di,di
mov ah,04h
int 25h
mov ax,3
int 10h
mov [jadr],70000h
mov [addr],50000h
lgdt fword [gdtr32]
in al, 0x92;включаем A20
or al, 2
out 0x92, al
cli ;запрещаем прерывания
mov al,8Fh;запрещаем NMI
out 70h,al
in al,71h
; Перейдём в защищённый режим
mov eax, cr0
or eax, 1
mov cr0, eax
; Перейдём на 32-битный код
mov ax,8
mov ds,ax
use32
xchg bx,bx
dw 0xEA66
jadr dd 0
dw 08
_error:
mov ax,cs
mov es,ax
mov ah,01h
mov di,_errormsg
int 21h
ret
_errormsg db 'GDT.BIN or PROG32.bin not found',0
progname db 'PROG32 BIN'
; Таблица дескрипторов сегментов для 32-битного ядра
align 16
gdt32:
dq 0 ;пустой
db 0FFh,0FFh,0,0,0,9Ah,0CFh,0 ;код
db 0FFh,0FFh,0,0,0,92h,0CFh,0;данные
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;видеосегмент
gdtr32:
gdtsize dw $ - gdt32 - 1
addr dd gdt32
start:
mov ax,3
int 10h
;скопируем GDT по 5000h:0
mov ax,cs
mov ds,ax
mov si,gdt32
mov ax,05000h
mov es,ax
xor di,di
xor cx,cx
mov cx,[gdtsize]
rep movsb
;Загрузим код защищенного режима по адресу 07000h:0000h
;int 25h
;02h Возвращает в BX первый кластер файла
;Параметры: ES:DI = имя файла
mov ax,cs
mov es,ax
mov ah,02h
mov di,progname
int 25h
cmp bx,-1
je _error
;int 25h
;04h чтение цепочки кластеров
;Параметры:es:di = buffer BX = первый кластер цепочки
mov ax,07000h
mov es,ax
xor di,di
mov ah,04h
int 25h
mov ax,3
int 10h
mov [jadr],70000h
mov [addr],50000h
lgdt fword [gdtr32]
in al, 0x92;включаем A20
or al, 2
out 0x92, al
cli ;запрещаем прерывания
mov al,8Fh;запрещаем NMI
out 70h,al
in al,71h
; Перейдём в защищённый режим
mov eax, cr0
or eax, 1
mov cr0, eax
; Перейдём на 32-битный код
mov ax,8
mov ds,ax
use32
xchg bx,bx
dw 0xEA66
jadr dd 0
dw 08
_error:
mov ax,cs
mov es,ax
mov ah,01h
mov di,_errormsg
int 21h
ret
_errormsg db 'GDT.BIN or PROG32.bin not found',0
progname db 'PROG32 BIN'
; Таблица дескрипторов сегментов для 32-битного ядра
align 16
gdt32:
dq 0 ;пустой
db 0FFh,0FFh,0,0,0,9Ah,0CFh,0 ;код
db 0FFh,0FFh,0,0,0,92h,0CFh,0;данные
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;видеосегмент
gdtr32:
gdtsize dw $ - gdt32 - 1
addr dd gdt32
Я все таки склоняюсь к тому что это
Короче не баг а фича :)