20 января 2022 г., 20:25, "Eugene Grosbein" <eu...@grosbein.net> написал:

> 21.01.2022 0:04, sp...@itl.ua wrote:
> 
>> Выходит, крешится биосовский interrupt handler?
>>> Это ничему не противоречит. Если loader от 11.2 вызывает BIOS так, что BIOS 
>>> отрабатывает чисто,
>>> а более свежий loader вызывает BIOS так, что внутри BIOS всё ломается,
>>> то нужно заточить наш loader, чтобы он был совместим с такими BIOS-ами.
>> 
>> Разумеется, workarounds никто не отменял. Но хотечется понимать, на чьей 
>> стороне проблема.
>> По идее должен же interrupt handler быть устойчивым к любому набору 
>> аргументов
>> (значениям регистров, стека/etc) и возвращаться хотя бы с ошибкой? Или нет?
> 
> Не совсем. Некоторые вызовы BIOS работают только в real mode, некоторые 
> только в protected mode,
> некоторые в обоих. У нас loader переключает процессор в protected mode,
> то есть когда память адресуется как виртуальная и мапится в физическую.
> Из-за мапинга тоже вполне может быть креш.

Адрес буфера одинаковый во время чтения с hdd и с флешки, он больше значения 
переменной edata
(конец сегмента данных) и меньше значения переменной end (конец BSS), как и 
положено.
Мапинг - просто добавление 0xA000 к виртуальному адресу для получения 
физического,
вроде никаких подводных камней.
Если бы дело было таки в мапинге, он бы крушил и обращение к диску тоже, и 
крушил бы флешку
независимо от IDE/AHCI режима.

Еще эксперимент:
В том месте, где вызывается bd_edd_io(), я поставила цикл из 100 этих вызовов 
подряд.
Креш происходит в середине этого цикла, т.е. один и тот же вызов с одним и тем 
же набором
входных данных срабатывает N раз, а на N+1 падает.
Ну, вроде достаточно оснований присмотреться к вызову прерывания.

Из bd_edd_io() вызывается v86int(), который вызывает btx-ный int 31h, который 
вызывает
биосовский int 13h (работа с диском).
Выходит, фейлится или int 31h или int 13h.
_______________________________________________
freebsd mailing list
freebsd@uafug.org.ua
http://mailman.uafug.org.ua/mailman/listinfo/freebsd

Ответить