OSDev
http://osdev.su/

проблема чтения файлов ima, img
http://osdev.su/viewtopic.php?f=6&t=484
Страница 1 из 2

Автор:  Эдуард [ 12 янв 2012, 17:20 ]
Заголовок сообщения:  проблема чтения файлов ima, img

Столкнулся со следующей проблемой при использовании файлов 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 байт. заработало нормально. но проблема общая осталась.

проверял просто в коде ядра выводил на экран байты с нужных адресов.

Автор:  Станислав [ 12 янв 2012, 17:41 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

Ты читаеш с дискеты dl=0, когда биос передаёт управление загрузчику в dl уже забит номер диска на котором твой загрузчик, 42 функция лучше, чем 2, там адрес секторов просто как переменная dq, с головками, дорожками не паришся.
Я через инт15 копирую так в верхнюю память 2 мегобайта, перед тем как в защищённый режим перейти.

Автор:  phantom-84 [ 12 янв 2012, 19:52 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

Нет. Дело в том, что у флоппика две стороны. Нужно читать дорожку сначала с одной стороны, а затем с другой. И лишь потом увеличивать номер дорожки. По-хорошему нужно делать трансляцию линейных адресов в chs непосредственно перед чтением, тогда будет практически все равно, сколько секторов, на какой дорожке/стороне они находятся. Упрощенный код трансляции адресов для флоппика можно найти здесь.

Автор:  pavia [ 12 янв 2012, 20:00 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

Мало известный факт. БИОС не читает последовательно больше секторов чем секторов на дорожке. Вернее даже запрещается пересекать границу.
Это связано, с тем что биос делает чтение через DMA, а аппаратура FDC имеет такое ограничение.
Из-за этого ограничения таблица разделов HDD выравнивается на границе секторов на дорожке.

Так что ставишь AL=1, а вот требуемое число секторов читаешь в цикле перебирая CHS адресацию.

Цитата:
;количество головок(сторон), нумерация с 0 (0...1)
;количество дорожек на одной стороне, нумерация с 0 (0....79)
;количество секторов на дорожке, нумерация с 1 (1...18)

Лучше запросить у боса. А для удобства сделать трансляцию LBA->CHS

Станислав, 42h функция поддерживается не во всех биосах и не для всех устройств. Если не путаю виндоус использует 42h только если диск больше 8Гб.

Автор:  Эдуард [ 12 янв 2012, 20:06 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

phantom-84 писал(а):
Нет. Дело в том, что у флоппика две стороны. Нужно читать дорожку сначала с одной стороны, а затем с другой. И лишь потом увеличивать номер дорожки. По-хорошему нужно делать трансляцию линейных адресов в chs непосредственно перед чтением, тогда будет практически все равно, сколько секторов, на какой дорожке/стороне они находятся.


у меня и так вроде адресация в chs. нумерация вроде идет такая: (головка,дорожка,сектор).
mbr имеет координаты (0,0,1) - т.е. первый сектор 0 дорожки 0 головки
я читаю со второго.... сначала все сектора 0й дорожки, потом 1й, потом 2й...
на дорожке 18 секторов, 80 дорожек на стороне, 2 стороны на дискете.
если бы проблема была в переключении сторон, то я бы удачно списывал первые 17 секторов (см. код),
а это 0х2200 байт данных, а у меня читаются только первые 16 секторов нормально, остальные нули....
хотя сама ф-ия чтения ошибку не выдает.

Автор:  Эдуард [ 12 янв 2012, 20:10 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

pavia писал(а):
Мало известный факт. БИОС не читает последовательно больше секторов чем секторов на дорожке. Вернее даже запрещается пересекать границу.
Это связано, с тем что биос делает чтение через DMA, а аппаратура FDC имеет такое ограничение.

Так что ставишь AL=1, а вот требуемое число секторов читаешь в цикле перебирая CHS адресацию.

Цитата:
;количество головок(сторон), нумерация с 0 (0...1)
;количество дорожек на одной стороне, нумерация с 0 (0....79)
;количество секторов на дорожке, нумерация с 1 (1...18)

Лучше запросить у боса. А для удобства сделать трансляцию LBA->CHS

Станислав, 42h функция поддерживается не во всех биосах и не для всех устройств. Если не путаю виндоус использует 42h только если диск больше 8Гб.


это стандартная разметка дискеты.....если попытаться считать более 18 секторов с дорожки, ф-ия вернет ошибку, проверенно. делал по секторное чтение в цикле, проблема та же. специально обрезал загрузчик до этой версии, что бы разбираться с этой проблемой.

Автор:  valeri [ 12 янв 2012, 20:14 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

pavia писал(а):
Станислав, 42h функция поддерживается не во всех биосах и не для всех устройств. Если не путаю виндоус использует 42h только если диск больше 8Гб.


По крайней мере, что касается BOOTMGR (Vista, 7, 8), то он сначала определяет (точно не помню, вроде как через функцию 41h) поддерживается ли функция 42h/43h и в случае положительного результата использует их, никакой привязки к размеру диска нет. А, или мы говорим только о загрузочном секторе? )))

Автор:  phantom-84 [ 12 янв 2012, 20:20 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

Эдуард, мое дело дать наводку, выше дело ее понять.

pavia, так он и читает потреково (по 18 секторов, начиная с первого сектора трека).

valeri, я специально человеку написал подобный код, а он его проигнорировал. Видимо, пока трудновато.

Автор:  pavia [ 12 янв 2012, 20:35 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

Эдуард. Во первых по правь с головками фантом верно написал вначале головки чередуются, а уже потом треки увеличиваешь.
Во-вторых упрости MBR до того чтобы он читал сектора и выводил их содержимое на экран. (напрямую читать в видео память не выйдет). Выкинуть защищённый режим и прочее.

В-третьих возьми отладчик и пройдись по коду пошагово. Лично мне turbo debuger нравится. Компилируешь под дос в com и загружаешь дос( NTVDM не годится) и отладчик.

Автор:  Эдуард [ 12 янв 2012, 21:45 ]
Заголовок сообщения:  Re: проблема чтения файлов ima, img

pavia писал(а):
Эдуард. Во первых по правь с головками фантом верно написал вначале головки чередуются, а уже потом треки увеличиваешь.
Во-вторых упрости MBR до того чтобы он читал сектора и выводил их содержимое на экран. (напрямую читать в видео память не выйдет). Выкинуть защищённый режим и прочее.

В-третьих возьми отладчик и пройдись по коду пошагово. Лично мне turbo debuger нравится. Компилируешь под дос в com и загружаешь дос( NTVDM не годится) и отладчик.


ок. про треки с головками понял.
НО! восемнадцатый сектор имеет координаты (0,0,18) в CHS, который я считываю первым блоком команд.
я считываю 17 секторов начиная со второго, в первом блоке:
Код:
;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

17 секторов это 0х2200 байт, а считываются нормально 0х2000 байт. я так и делал, печатаю по байтно сектора на экран....сравнивал печать на экране с бинарником в WinHEX.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/