SATA-контроллер, смазанная фотография и конкурс

    Несколько дней назад, на форуме 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 ограничения:
    1. Доступ к дискам через «костыль» BIOS очень медленный, поэтому фильм с такого диска в KolibriOS не посмотришь — будет идти рывками. Скорость копирования файлов тоже неприемлемая — можно пообедать, пока копируется большой файл.
    2. Некоторые диски без драйвера вообще никак не видны в системе.

    Ввиду этого, на сегодняшний момент у нас пишутся 2 драйвера SATA (параллельно):

    Оба драйвера имеют одну неприятную особенность — наглухо подвешивать систему в случае любой нештатной ситуации — и тогда требуются логи, чтобы увидеть конфигурацию дисков и попытаться узнать причину зависания. Именно это и произошло у 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.2.2 со следующими параметрами:



    Результат приведён на фото ниже (можно открыть фото в новом окне с помощью ПКМ, и тогда оно откроется в оригинальном размере). Я уж не знаю, то ли руки у меня совсем кривые, то ли все эти программы в своих рекламных роликах / на сайте используют специальным образом изготовленные тестовые фотографии, которые хорошо восстанавливаются, то ли эта фотография из разряда таких, которые ни одна существующая программа восстановить не сможет, но факт остаётся фактом: я не смог получить хороший результат.

    UPDATE: YUVladimir (автор программы SmartDeblur) даёт в комментариях разъяснение, почему все программы дают плохое качество: habrahabr.ru/company/kolibrios/blog/192558/#comment_6710828



    Поэтому я решил объявить конкурс — любой читатель Хабра может попытаться улучшить оригинальную смазанную фотографию с помощью любой программы восстановления смазанных изображений (необязательно пользоваться одной из тех, что я привёл — я уверен, что есть ещё много других). Выложить улучшенную фотографию можно либо в комментариях к этому посту, либо на нашем форуме в оригинальной ветке, до 17 сентября 2013 года 24:00 по Гринвичу. К фотографии нужно приложить инструкцию (лучше скриншот), какой программой, какой версией и какими настройками пользоваться, чтобы добиться такого результата.

    Лучшие 10 фотографий, по мнению разработчиков KolibriOS, будут выставлены на голосование на Хабре. Автор фотографии, набравшей больше всего голосов, будет награждён фирменными флешкой и футболкой с логотипом KolibriOS (включая пересылку на указанный победителем адрес). Удачи!

    Бонус — приз в 1000 рублей тому, кто первым правильно подскажет Mario_Z, как решить проблему зависания: board.kolibrios.org/viewtopic.php?f=1&t=2343&start=120#p51072 (само решение необязательно; достаточна только подсказка). Подсказки можно писать как здесь в комментариях, так и на нашем форуме.
    KolibriOS Project Team
    0.00
    Быстрая операционная система для бизнеса и хобби
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 70

      +3
      Мне кажется что вполне можно по полученой после deblur-а фотографии восстановить большую часть лога. Особенно с помощью хабра, люди тут глазастые, раньше уже восстанавливали текст с таких фотографий если ничего не путаю. Тем не менее удачи всем, кто будет пытаться получить более-менее качественное изображение. Я в свое время так и не смог найти нормальную программу для этого дела.
        +1
        Так не факт, что у меня получилось прогнать SmartDeblur с оптимальными настройками. Я же в графике — ноль без палочки. Я почти уверен, что есть настройки лучше тех, которые нашёл я.
        +4
        Вот это детектив!
        • UFO just landed and posted this here
          • UFO just landed and posted this here
              +1
              Это бесполезно: сообщения ведь генерируются исходя из реального железа — там в коде переменные, а не константы. Нам нужны значения переменных, которые плохо видны в логе на фото и не существуют в коде.
            +1
            А как они (создатели утилит) хотели? Чтобы все фотографии были смазаны идеальным образом, чтобы им было легко их восстановить? Фигушки! Пусть доказывают на реальных изображениях, кто из них круче, и восстановит лучше.
            +4
            Ну, хайвмайнд, не подкачай!
            Setting OS disk
            Initialize IRQ
            Initialize PIC
            Initialize system X86 machine
            Initialize system timer (IRQ08) ???
            Try to initialize APIC
            Enable interrupts 2, 13
            Disable interrupts in IDE controller
            Search floppy drives
            Search hard drive and ATAPI drives
            Get memory for cache
            Search partitions on disk devices
            Initilize system directory /sys
            APIC not found
            Determining amount of memory 0511 (???)
            Setting window defaults
            Calculating background
            Reserving IRQs & ports
            CPU frequency is 2392 MHz
            Setting mouse
            Set handler of interrupts for IDE
            Enable interrupts in IDE controller

            Attach interrupt & Handler ???
            Set IDE IRQ6 return code ???
            Channel 1 Disk 0
            Disk ???
            Channel 1 Disk 1
            Channel 2 Disk 0
            ??? ??? CD-RW/DVD-ROM SN-3248
            Channel 2 Disk 1
            UMCI controller at 00:E3 with 2 ports initialized
            Attach interrupt 11 (handler ???)
            Attach interrupt 1 handler 000326C4
            IRQI error code 80059068
            Attach interrupt 12 handler 008962E4
            kernel SVN r3870
            1 CPU detected
            CPU0
            CPU1
            CPU2
            CPU3
            CPU4
            IDEContrProgrammingInterface 013A
            IDE_Interrupt ???
            Primary Bus Master IDE Status Register ???
            Secondary Bus Master IDE Status Register ???
            Attach Interrupt 10 Handler ???
            Set IDE IRQ14 return code ???
            Attach interrupt 15 Handler ???
            Set IDE IRQ15 return code ???
            IDE DMA mode
            • UFO just landed and posted this here
                +1
                Ну это, наверное, распознавание текста, или что за программа Хайвмайнд такая?
                На фото, после «1 CPU detected», написано:
                BAR0 ????
                BAR1 ????
                BAR2 ????
                BAR3 ????
                BAR4 ????
                То, что там BAR0-BAR4, мы и так знаем (это как раз константы). Нам бы значения переменных рядом с ними.
                • UFO just landed and posted this here
                    0
                    K:

                    Сообщение ядра.
                    • UFO just landed and posted this here
                    +2
                    мой вариант:

                    BAR0 01F0
                    BAR1 03F4
                    BAR2 0170
                    BAR3 0374
                    BAR4 0FA0
                      0
                      Это был лишь пример, чего там быть не может, и что может. Для участия в конкурсе нужен весь второй столбик — не только эти 5 строчек.
                        +2
                        Я не хочу денег. :) Просто было пара минут свободного времени. Удачи вам.
                          +2
                          Не думал об этом так. Тогда спасибо Вам большое! Действительно, идея с ручной расшифровкой кажется более стоящей, и можеть дать лучшие результаты. Но тогда конкурс придётся аннулировать, ведь невозможно будет подсчитать, кто дал лучший ответ.
                      +3
                      Нет, это просто у кого-то слишком много свободного времени. :)
                      А хайвмайнд — призыв к другим участникам помогать и общими силами решить проблему.

                      Предлагаю:
                      BAR0 01F0
                      BAR1 03F4
                      BAR2 0F70
                      BAR3 0374
                      BAR4 0F90
                        0
                        Это был лишь пример, чего там быть не может, и что может. Для участия в конкурсе нужен весь второй столбик — не только эти 5 строчек.
                          +2
                          Я не в конкурсе хотел участвовать, а просто помочь. Мне показалось, что ручная расшифровка имеющихся изображений — более перспективный подход, чем попытки исправить исходное изображение. Поэтому я и заложил начало — выложил, что удалось распознать мне, в надежде, что остальные подхватят порыв и будут исправлять и добавлять. Что, собственно, и начало происходить.
                            +2
                            Не думал об этом так. Тогда спасибо Вам большое! Действительно, идея с ручной расшифровкой кажется более стоящей, и можеть дать лучшие результаты. Но тогда конкурс придётся аннулировать, ведь невозможно будет подсчитать, кто дал лучший ответ.
                        0
                        А можете, если это не сложно, выложить скриншот экрана, содержащий константную часть данных?
                          +1
                          Это немного проблематично, так как лог выводится сразу как текст (константы) + числа (переменные), и для каждого компьютера он будет разный. У некоторых компьютеров будут определённые строчки, у других — другие. Вот пример чёткой фотографии лога с другого компьютера: board.kolibrios.org/download/file.php?id=4978
                      0
                      Самого главного не видно. В этом и проблема.
                        0
                        Так вы скажите, где именно там главное — так легче будет.
                          0
                          Второй столбец — наименее читаемый — как раз и важен. Особенно то, что после «1 CPU detected»
                            0
                            То, что в левом столбике, у всех компьютеров будет одинаковым (или почти одинаковым), кроме частоты процессора и размера оперативной памяти (а их я уже разглядел — 511MB RAM | 2392 MHz CPU). Из правого столбика нужны все числа (как десятичные, так и шестнадцатиричные) — это и есть переменные. Слова между числами — константы, их мы можем вытащить из кода.

                            Плюс нужно знать, каких чисел не может быть. Например, «IDEContrProgrammingInterface 013A» не может быть 013A, там либо 018A, либо 0180, либо 0185. Соответственно, в этом случае к фото подходит только 018A.
                              +1
                              Еще мой вариант:

                              Attach interrupt & Handler 80030263
                              Set IDE IRQ6 return code 80069040



                              UMCI controller at 00:E3 with 2 ports initialized
                              Attach interrupt 11 Handler 0020180
                              Attach interrupt 1 Handler 000326C4
                              IRQI error code 80059063
                              Attach interrupt 12 handler 008962E4
                              kernel SVN r3870



                              IDE_Interrupt 0180
                              Primary Bus Master IDE Status Register 000000084
                              Secondary Bus Master IDE Status Register 000000024
                              Attach Interrupt 10 Handler 000315E3
                              Set IDE IRQ14 return code 00069090
                              Attach interrupt 15 Handler 0009168E
                              Set IDE IRQ15 return code 00069084
                              IDE DMA mode
                                +1
                                UMCI — не может быть, это скорее всего, UHCI.
                                IRQI — тоже не может быть, это IRQ1
                          +1
                          SmartDeblur 1.27 / out of focus blur / radius 7 / Smooth 81

                          Что увидел
                          IDEContrProgrammingInterface 018A
                          IDE_Interrupt 0100
                          Primary Bus Master IDE Status Register 00000024 (000000E4 ?)
                          Secondary Bus Master IDE Status Register 00000024 (000000E4 ?)
                          Attach Interrupt 10 Handler 800315E8 (800315E3 ?)
                          Set IDE IRQ14 return code 80059090
                          Attach interrupt 15 Handler 8003160C (8003168C ?)
                          Set IDE IRQ15 return code 80059084
                          0
                          узнайте какой шрифт используется и каждую букву шрифта прогоните скользящим окном по фотке, вычисляя корреляционную функцию — распознаете текст. Нераспознанные буквы — при помощи серого вещества в черепной коробке — из контекста. Делов на час в матлабе
                            +1
                            Шрифт известно какой — один из 2 шрифтов KolibriOS, там большого выбора нет :-) Только он не TTF и не векторный, а особым образом сделанный — он, по-моему, только в KolibriOS и работает.
                              0
                              и вы бы хоть не jpeg выложили, а в bmp
                                +2
                                Я так понимаю, это оригинал изображения. И да, фотоаппараты, как правило, сохраняют в jpeg.
                                  +1
                                  Если посмотреть Properties оригинальной фотографии, то видно, что она сделана на смартфон:
                                    +2
                                    Это не смартфон, а обычный java телефон. У меня такой же :)
                                    Фотки на нем, кстати, можно сделать и получше.
                                      +1
                                      Мне почему-то казалось, что все Samsung GT-xxxx — смартфоны :-)
                                      У меня самого Samsung Galaxy S1: GT-i9000 — вот и напутал.
                                        +1
                                        GT-Sxxxx — все обычные телефоны.
                                          0
                                          неверное утверждение: Samsung Galaxy ACE GT-S5830 на андроиде например
                                            0
                                            Я просто про «Samsung GT-Sxxxx». Всякие вариации с «galaxy» и т.п. не рассматривал.

                                            P.S. Да и не об этом речь в посте)
                                  +1
                                  Так рассказ настоящий, а не выдуманный. Пользователь на самом деле выложил JPEG — вот он: board.kolibrios.org/download/file.php?id=5109
                                  Если бы я делал квест, тогда может быть, а так — работаем с тем, что есть на самом деле :-)
                                  +3
                                  Шрифт в текстовом виде: websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fother%2Ffont_conv%2Fchar.txt. Формат должен быть очевиден.
                                  +7
                                  Могу ответить на вопрос, почему все программы дают плохое качество восстановления (как автор программы SmartDeblur)
                                  Причин несколько:
                                  1. Низкий динамический диапазон фотографии, полутона в светлой части практически потеряны — а именно из них собирается исходное изображение при деконволюции.
                                  2. Неравномерное искажение — вверху справа смаз, плюс расфокус по всему полю
                                  3. Большой уровень шума.

                                  Доминирующая причина — 1.
                                  Поэтому ничего существенно лучшего получить не удалось:
                                  image
                                  Предварительно сделана гамма коррекция 0.3
                                  Параметры: 8.2 px, Smooth: 90%, Reducing of ringing: 50%
                                    +2
                                    Заявка на победу
                                      +1
                                      Не знаю, не знаю… Часть текста видна лучше, чем на моём фото, но часть — хуже. В любом случае, работа хорошая, но это и понятно — кому, как не автору, уметь пользоваться своей программой :-)

                                      За объяснение причин плохого качества восстановления — большое спасибо!
                                    0
                                    Мои варианты:

                                    Раз
                                    image

                                    Два
                                    image

                                    Три
                                    image


                                    Потом может еще поиграюсь. Пользовался фотошопом.
                                    0

                                    GIMP игрался с Sharpen, Hue-Saturation и, конечно, Invert
                                    +2
                                    Возможно стоит сконцентрироваться только на важном фрагменте:

                                    3 итерации SmartDeblur
                                    image
                                    image
                                    image
                                      –1
                                      Еще меньший фрагмент
                                      image
                                        +1
                                        Как по мне так первый вариант самый читаемый.
                                        +4
                                        Вообще стоит отметить, что при всей увлекательности процесса, разбирать пиксели на смазанных фотках — не лучшее, что можно придумать. Вон в Haiku в прошлом году добавили клевую фичу, теперь можно кернел паники/экраны смерти/вывод ядерного отладчика фотографировать на телефон и отсылать чувакам уже обычный plain text.

                                        Уместить в QR-код можно достаточно информации, если постараться:
                                        The default configuration produces a version 19 QR code with low recovery level and can store 792 bytes of data for example. Given more screen space, larger QR codes can be configured, up to a theoretical maximum size of 177x177 blocks which would be able to store 2953 bytes of data.
                                          0
                                          А почему бы экран смерти сразу в файл не выводить?
                                            +2
                                            В общем случае, например, потому, что на момент крэша никакая файловая система может не быть доступна: необходимые структуры ядра и физические носители еще не проинициализированы. Видео-вывод же, как правило, инициализируется одним из первых в системе, и можно считать, что он есть всегда (как и vga bios на x86 для псевдографики).
                                              +2
                                              Если бы система дошла до запуска LAUNCHER (то есть все основные подсистемы были проинициализированы), то логи сохранялись бы в файл. В данном случае крэш в момент инициализации дисковой подсистемы — сохранять файл некуда.
                                              0
                                              Экран смерти в QR — зачётно!
                                                +2
                                                Вообще да, очень интересная идея. Но мои знания ассемблера (стремящиеся к 0 со стороны "-1") не позволят мне это реализовать, а другие разработчики KolibriOS вряд ли возьмутся — хватает дел поважнее.
                                              +2
                                              Пользуйтесь:
                                                0
                                                Всё равно во втором столбце цифры не читаются, а они как раз самые важные…
                                                  0
                                                  Увы. Это все, чего я смог добиться.
                                              • UFO just landed and posted this here
                                                  0
                                                  Наверное безполезно применять программы к таким ужасным снимкам. Вот я поигрался, может поможет. Более-менее вышло:
                                                  s002.radikal.ru/i197/1309/55/2d1475de0cdf.jpg
                                                    +3
                                                    За абсолютную достоверность не ручаюсь, но это результат анализа других логов:
                                                    image
                                                      +2
                                                      PS: расшифровка ручками, потому, ессно, вне конкурса.
                                                      +7
                                                        +1
                                                        лучший
                                                        +1

                                                        Only users with full accounts can post comments. Log in, please.