Столкнулся со следующей проблемой при использовании файлов img и ima в VirtualBox'e или VMware.
в первые 512 байт записан начальный загрузчик. Далее идут код переводящий проц в защищенный режим и ядро ОС.
ядро ОС собрано ld. сначала идет секция кода(text), выровненная на 4к.
далее по смещению 0х2000 идет секция данных(data).
по смещению 0х3000 идет секция rdata.
начальный загрузчик загружает сектора со 2го по 65 по адресу 0х7С00+512 и передает туда управление. далее код переводит проц в защищенный режим и копирует ядро по адресу 0х200000.
проблема в том что считывает только 16 секторов.
код загрузчика:
Код:
format binary
use16
org 7c00h
start:
cli
xor ax,ax
mov ds,ax
mov ss,ax
mov es,ax
mov sp,0x7c00
sti
;количество головок(сторон), нумерация с 0 (0...1)
;количество дорожек на одной стороне, нумерация с 0 (0....79)
;количество секторов на дорожке, нумерация с 1 (1...18)
;cl - номер сектора
;ch - номер дорожки
;dh - номер головки
;в ah = 02 - номер ф-ии, в al = 01 - число секторов для чтения
;es:bx - адрес буфера
mov cl,2
mov ch,0
mov dh,0
mov ah,2
mov al,17
mov bx,0x7c00+512
xor dl,dl ;номер устройства
int 13h
jnc @f
mov si,msgSectorError
call k_puts
mov cl,1
mov ch,1
mov dh,0
mov ah,2
mov al,18
mov bx,0x7c00+512+17*512
xor dl,dl ;номер устройства
int 13h
jnc @f
mov si,msgSectorError
call k_puts
mov cl,1
mov ch,2
mov dh,0
mov ah,2
mov al,18
mov bx,0x7c00+512+17*512+18*512
xor dl,dl ;номер устройства
int 13h
jnc @f
mov si,msgSectorError
call k_puts
mov cl,1
mov ch,3
mov dh,0
mov ah,2
mov al,12
mov bx,0x7c00+512+17*512+18*512+18*512
xor dl,dl ;номер устройства
int 13h
jnc @f
mov si,msgSectorError
call k_puts
jmp 0:0x7c00+512
msgSectorError db 'Error read sector',0xA,0xD,0
k_puts:
...
times 510-($-start) db 0
dw 0x55AA
include 'protected.asm'
times 1474560-($-start) db 0
код загрузчика специально заточен под эту проблему
проблема в том что VirtualBox что VMware читают только 16 секторов нормально,а остальные только нули, хотя сама ф-ия чтения ошибку не выдает. в итоге раздел text читается нормально, а разделы data и rdata просто нули.
удалось в ld убрать выравнивание по 4к и расположить data и rdata сразу за text все влезло в первые 0х2000 байт. заработало нормально. но проблема общая осталась.
проверял просто в коде ядра выводил на экран байты с нужных адресов.