OSDev

для всех
Текущее время: 01 май 2024, 14:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 17:20 

Зарегистрирован: 12 янв 2012, 11:24
Сообщения: 8
Столкнулся со следующей проблемой при использовании файлов 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 байт. заработало нормально. но проблема общая осталась.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 17:41 
Заблокирован

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 19:52 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:00 
Аватара пользователя

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

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

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

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

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


Последний раз редактировалось pavia 12 янв 2012, 20:10, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:06 

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:10 

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

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

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

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

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:14 

Зарегистрирован: 13 окт 2008, 17:38
Сообщения: 46
Откуда: Владимир
pavia писал(а):
Станислав, 42h функция поддерживается не во всех биосах и не для всех устройств. Если не путаю виндоус использует 42h только если диск больше 8Гб.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:20 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Эдуард, мое дело дать наводку, выше дело ее понять.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 20:35 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема чтения файлов ima, img
СообщениеДобавлено: 12 янв 2012, 21:45 

Зарегистрирован: 12 янв 2012, 11:24
Сообщения: 8
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.


Последний раз редактировалось Эдуард 12 янв 2012, 22:18, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB