ROS Newsletter58

Материал из Русский WINE
Перейти к: навигация, поиск

Выпуск новостей ReactOS №58

UniATA

Драйвер Universal ATA часто упоминался как решение многих неприятных проблем в ReactOS, таких как отсутствие поддержки дисков SATA и ограничение видимой области дискового пространства в 8 Гб. Поскольку существование таких проблем в наше время абсурдно, их исправление было высокоприоритетно. Однако, существовало несколько препятствий для перехода к постоянному использованию UniATA, и Алексею Брагину удалось разрешить некоторые из них. Крупнейшей проблемой этого драйвера была неспособность определения приводов CD-ROM на физических устройствах. Алексей определил, что это было связано с размером временных задержек: создатель UniATA решил уменьшить время ожидания для некоторых операций, в результате чего контроллерам не хватало времени для изменения внутреннего состояния. Алексей установил временные задержки равными используемым в старом ATAPI-драйвере, и теперь дисководы стабильно обнаруживаются на реальных устройствах.

Другим вопросом, оставшимся неисправленным, является работа UniATA в VirtualBox. Причина неработоспособности пока неизвестна, но этот вопрос является следующим в списке Алексея.

Пулы памяти

Как часть работ в направлении поиска повреждений памяти, Алексей также перепроверял использование пулов памяти. Пулы являются средством выделения памяти в ядре и драйверах, при этом они могут быть как выгружаемыми (записываемыми на диск), так и не выгружаемыми (всегда находящимися в памяти). Алексей работал над новой реализацией и одной из её частей является, по сути, отладчик пула, позволяющий обнаруживать выход за границы при чтении или записи в выделенных пулах. При помощи отладчика пула обнаружилось лишь одно чтение за границей выделенной памяти, в менеджере Plug&Play. Но этот инструмент не проверяет, что именно считывается или записывается, поэтому нельзя сказать, что обнаружены все возможные проблемы. По крайней мере, теперь группа разработчиков будет иметь инструмент, который поможет убедиться в том, что подобных ошибок не было сделано. Все это сделано в рамках подготовки к новой реализации пула, которая работает у Алексея, но не может быть внесёна в общий репозиторий, так как ReactOS даёт сбой при использовании нового кода. Надеемся, что с отладчиком Алексей сможет отследить, по какой причине это происходит.

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

Кроме того, Алексей исправил проблему с драйвером USB, которая была причиной сбоя при работе с физическими устройствами. Код драйвера USB пытался удалить указатель из несуществующего связанного списка, что в конечном итоге портило пул. Этот случай является одним из примеров ошибочной перезаписи, которую отладчик пула ещё не способен обнаруживать.

И ещё про память

В процессе исправления ошибки, порождаемой программой OllyDbg, Майкл Мартин (Michael Martin) также неумышленно исправил процесс установки программы Mono. Истинная причина, по которой OllyDbg и Mono завершались с ошибкой до этого исправления, остаётся неясной, однако Майкл, очевидно, решил саму проблему. Что же именно происходит, когда OllyDbg вызывает несколько функций, начиная с CreateFileMappingA? Интерес для нас представляет определение объёма требуемой памяти. Далее OllyDbg вызывает функцию MapViewOfFile и здесь всё сбивается с пути. Функция MapViewOfFile (и вызывающий её код) смотрят на структуру данных SEC_IMAGE, которая может быть, а может не быть создана при вызове функции CreateFileMapping (и в коде, вызывающем её). Если структуру удаётся обнаружить, то будет использован указанный в ней размер, округлённый до границы страницы. Если же структура SEC_IMAGE не найдена, функция MapViewOfFile должна получить размер из структуры FileObject, созданной ранее в функции CreateFileMapping. Однако здесь это значение не округлялось. Это и порождало проблемы, когда OllyDbg вызывал третью функцию из этой последовательности, VirtualQuery. Эта функция уже обладает информацией об области памяти, включая её размер. OllyDbg, очевидно, ожидает, что размер будет округлен до границы страницы и не способен работать с неокругленным размером.

Майкл изначально не понимал, что округления не происходит, и провёл некоторые исследования в Windows XP. Там он обнаружил, что VirtualQuery всегда возвращает размер, кратный размеру страницы, так что он вернулся в ReactOS, чтобы увидеть, где этого округления не происходит, и обнаружил ошибку. По какой именно причине начала работать программа установки для Mono, никто не мог сказать с уверенностью, так как ещё никто не разбирался, по какой причине в ней происходил этот сбой. Однако, все тестеры уверены в том, что после того как Мартин внёс данное исправление, у них появилась возможность успешно установить Mono.

Newsletters
30-39 #30#31#32#33#34#35#36#37#38#39
40-49 #40#41#42#43#44#45#46#47#48#49
50-59 #50#51#52#53#54#55#56#57#58#59
60-69 #60#61#62#63#64#65#66#67#68#69
70-79 #70#71#72#73#74#75#76#77#78#79
80-89 #80#81#82#83#84#85#86#87#88#89
90-99 #90#91#92#93#94#95#96#97#98#99