Несколько дней назад, на форуме KolibriOS зарегистрировался англоязычный пользователь с ником mdickie, и пожаловался, что в его ноутбуке Dell Latitude C640 не работает мышь: board.kolibrios.org/viewtopic.php?f=4&t=2389. Так как недавно у нас появилась поддержка USB (в частности, USB-мышей), то наш основатель Mario_Z логично предположил, что mdickie использует какую-то старую версию, и посоветовал ему скачать последнюю ночную сборку и проверить на ней.
Предположение Mario_Z оказалось верным — в ночной сборке мышь заработала, но сломалось что-то другое:
It works with the latest build,
Thanks
EDIT: It freezes slower.
К сожалению, пользователь был немногословен (либо английский — не его родной язык), поэтому некоторое время мы выясняли, что же именно не так, задавая наводящие вопросы, пока картина не прояснилась:
I mean it needs a little more time to freeze the mouse.
Oh yes, the whole system freezes. The Keyboard and the clock aren't working.
Здесь уже я догадался, что причиной зависания, скорее всего, является драйвер SATA IDE, который в настоящий момент разрабатывает Mario_Z. На данный момент, в KolibriOS есть родной драйвер только для контроллера PATA, а поддержка контроллера SATA в режиме IDE осуществляется только через BIOS, что вносит 2 ограничения:
- Доступ к дискам через «костыль» BIOS очень медленный, поэтому фильм с такого диска в KolibriOS не посмотришь — будет идти рывками. Скорость копирования файлов тоже неприемлемая — можно пообедать, пока копируется большой файл.
- Некоторые диски без драйвера вообще никак не видны в системе.
Ввиду этого, на сегодняшний момент у нас пишутся 2 драйвера SATA (параллельно):
- Драйвер для контроллера SATA в режиме IDE от Mario_Z: board.kolibrios.org/viewtopic.php?f=1&t=2343
- Драйвер для контроллера SATA в режиме AHCI от Serge: board.kolibrios.org/viewtopic.php?f=31&t=2152
Оба драйвера имеют одну неприятную особенность — наглухо подвешивать систему в случае любой нештатной ситуации — и тогда требуются логи, чтобы увидеть конфигурацию дисков и попытаться узнать причину зависания. Именно это и произошло у mdickie, и поэтому я попросил его приложить логи. Естественно, при зависании всей системы скопировать логи прямо из KolibriOS в текстовый файл не получится, и в таких случаях мы просим сфотографировать лог с экрана монитора на смартфон или фотоаппарат, и выложить фото на нашем форуме. И здесь мы переходим ко второй части статьи.
Для записи лога в текстовый файл (наподобие dmesg в Linux) у нас есть утилита BOARD, которая также выводит последние несколько строк лога в своём окне. При зависании системы, видимой части лога обычно недостаточно, а скопировать весь файл не представляется возможным, как я уже говорил выше. Остаётся только дублировать весь лог на экран, а потом его фотографировать, и для таких целей у нас на стартовом экране существует опция:
Сам функционал для дублирования лога на экран написала CleverMouse, но я могу гордиться тем, что моих знаний ассемблера хватило, чтобы оформить этот функционал как опцию для стартового экрана* (до этого, требовалась ручная перекомпиляция ядра KolibriOS, чтобы включить или отключить этот функционал, что зачастую слишком сложно для новых пользователей проекта).
* Мы часто неофициально называем этот экран "синим экраном" по аналогии с Windows, но, естественно, никакой связи с BSOD ("Blue Screen of Death" /"Синий экран смерти") наш стартовый экран не имеет (кроме цвета). Даже скорее, он является полной противоположностью синего экрана Windows — там синий экран возвещает о «конце жизни», а у нас — наоборот, о начале :-)
Итак, я попросил mdickie включить опцию C на «синем экране» и приложить получившийся лог. Что он и сделал, только вместо фотографии, он переписал текст вручную:
========= tmpdisk 0.45 ========
trying to add disk
10% of free RAM will be used, new Disksize: 50MB
operation completed successfully
K: Attach Interrupt 11 Handler 80BA2F04
К сожалению, его ответ ничем нам не мог помочь, хотя результат был вполне ожидаемым. Дело в том, что лог хотя и выводится на экран, но одновременно с отрисовкой других программ (например, «иконок»), и, если событие отрисовки происходит после события вывода лога (как это было в нашем случае), то часть лога просто затирается в видеопамяти, так как другие изображения рисуются поверх него (в файле, конечно, весь лог сохраняется, но файл вытащить невозможно, как было сказано выше).
Так как я сам уже сталкивался с подобной проблемой неоднократно, то нашёл решение — отключение запуска всех программ, кроме ядра, гарантированно не затирает лог на экране. В KolibriOS есть свой аналог автозагрузки Windows, или /etc/init.d Linux: после загрузки ядра, оно запускает программу LAUNCHER, которая читает из файла AUTORUN.DAT по одной строке, и запускает прописанные там программы (с опциональными параметрами). Причём, в KolibriOS и сам рабочий стол, и иконки, и фоновая картинка — запускаются именно из AUTORUN.DAT, а не являются частью ядра. Таким образом, всё что было нужно, это добавить на стартовом экране возможность отключить вызов LAUNCHER после загрузки ядра. Воодушевлённый тем, что я смог добавить опцию дублирования лога на экран, я добавил и опцию отключения LAUNCHER (под буквой D на фото синего экрана выше).
Поэтому я попросил юзера одновременно включить дублирование лога на экран и отключить загрузку LAUNCHER:
Unfortunately it's only part of the log, so it won't help us.
Please turn on option C and simultaneously turn off option D on blue screen. This will boot KolibriOS without starting the desktop at all, but only display the debug log. Please try to make a photo this time. Don't worry about small font — we should be able to understand it. The mouse should still move, so first of all, try to move it for a longer time and see that it doesn't get stuck (let us know if it still does).
Эта просьба наконец-то увенчалась успехом — нам была представлена фотография полного лога (ниже я привожу её в уменьшенном размере):
Пользователь меня предупреждал, что фотография выглядит плохо, но я самонадеянно написал ему (перевод с английского выше): "Не бойся насчёт мелкого шрифта — мы сможем его разобрать". Взглянув на фото, я понял, что недооценил умение пользователя делать плохие фото (либо переоценил свои возможности их разбирать) — фотография была конкретно «смазана», так что разобрать что-то было практически невозможно. Я советовал пользователю, как попытаться решить проблему зависания (и получить текстовый лог, вместо смазанного фото), но ему это, видимо, надоело, и он решил подождать, пока KolibriOS станет более стабильной.
Итак, рассчитывать на получение ещё какой-либо информации от этого пользователя не приходилось, а проблему зависания решить очень желательно (но для этого нужно получить чёткую фотографию лога). И тут я вспомнил про программы восстановления смазанных изображений (одну из них — SmartDeblur — автор даже рекламировал несколько раз на Хабре).
Я скачал для пробы 2 версии SmartDeblur (последнюю бесплатную и последнюю платную с trial-version), а также найденную в интернете программу Blurity, открыто считающую себя лучше SmartDeblur в разделе сравнения:
- SmartDeblur v.1.27: github.com/Y-Vladimir/SmartDeblur
- SmartDeblur v.2.2: smartdeblur.net/download.html
- Blurity v1.5.171: www.blurity.com/download
Поигравшись с ручными настройками и воспользовавшись методом автоматического улучшения там, где он был, я так и не смог получить нормального результата. Самое лучшее фото, что у меня вышло, было получено с помощью ручной подстройки в SmartDeblur v.2.2 со следующими параметрами:
Результат приведён на фото ниже (можно открыть фото в новом окне с помощью ПКМ, и тогда оно откроется в оригинальном размере). Я уж не знаю, то ли руки у меня совсем кривые, то ли все эти программы в своих рекламных роликах / на сайте используют специальным образом изготовленные тестовые фотографии, которые хорошо восстанавливаются, то ли эта фотография из разряда таких, которые ни одна существующая программа восстановить не сможет, но факт остаётся фактом: я не смог получить хороший результат.
Поэтому я решил объявить конкурс — любой читатель Хабра может попытаться улучшить оригинальную смазанную фотографию с помощью любой программы восстановления смазанных изображений (необязательно пользоваться одной из тех, что я привёл — я уверен, что есть ещё много других). Выложить улучшенную фотографию можно либо в комментариях к этому посту, либо на нашем форуме в оригинальной ветке, до 17 сентября 2013 года 24:00 по Гринвичу. К фотографии нужно приложить инструкцию (лучше скриншот), какой программой, какой версией и какими настройками пользоваться, чтобы добиться такого результата.
Лучшие 10 фотографий, по мнению разработчиков KolibriOS, будут выставлены на голосование на Хабре. Автор фотографии, набравшей больше всего голосов, будет награждён фирменными флешкой и футболкой с логотипом KolibriOS (включая пересылку на указанный победителем адрес). Удачи!
Бонус — приз в 1000 рублей тому, кто первым правильно подскажет Mario_Z, как решить проблему зависания: board.kolibrios.org/viewtopic.php?f=1&t=2343&start=120#p51072 (само решение необязательно; достаточна только подсказка). Подсказки можно писать как здесь в комментариях, так и на нашем форуме.
Автор: yogev_ezra