ROS Newsletter84

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

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

Переписывание загрузчика DLL

Загрузчик отвечает за процесс загрузки и инициализации необходимых запускающемуся приложению ресурсов и функций, находящихся в динамических библиотеках DLL. Реализация загрузчика, имеющегося в ReactOS, была создана очень и очень давно, и, как и большинство других участков старого кода, была выполнена некорректно. После некоторой доработки удалось добиться его функционирования, однако для этого потребовалось множество "костылей". Существуют проблемы, связанные с инициализацией локальной памяти потока (Thread Local Storage), вызовом функции DllMain в некоторых DLL, а также с загрузкой библиотек DLL в правильном порядке, основанном на перекрёстных, а иногда даже циклических зависимостях. Старый код был попросту не в состоянии корректно обработать большинство таких ситуаций, что приводило к тому, что множество поступивших отчетов об ошибках содержало данные о сбоях при загрузке библиотек. Алексей Брагин решил найти и окончательно решить эти проблемы, для чего он взял наработки по переписыванию загрузчика, имевшиеся в соответствующей ветке репозитория, и доработал их для корректного функционирования с текущей кодовой базой ReactOS.

Переписывание загрузчика было не самым простым занятием, поскольку его компоненты находились в диспетчере памяти, NTDLL и kernel32. Так как и в компоненте режима ядра, и в компоненте пользовательского режима содержалось множество ошибок, исправление только одной компоненты приводило к неработоспособности другой. Алексей столкнулся с этими ошибками, когда впервые попытался использовать в ReactOS свой новый код пользовательского режима, и обнаружил неправильное функционирование диспетчера памяти. В частности, существует ранее недокументированный флаг DONT_LOAD, используемый при загрузке образов. На первый взгляд может показаться, что он указывает диспетчеру памяти не загружать определённую секцию бинарного образа. Однако, в имеющейся на данный момент документации говорится о том, что этот флаг всегда игнорируется и диспетчер памяти должен загружать все секции. В действительности, диспетчер памяти ReactOS пытался обрабатывать этот флаг, что приводило к несовпадению размера и контрольных сумм загруженного образа в сравнении с теми, которые имел бы целиком загруженный образ.

Функции загрузчика в kernel32 представляют собой по большей части ссылки на реальные функции, находящиеся в NTDLL. Однако, многие функции из kernel32 неправильно вызывали функции из NTDLL, например, передавали неправильные или полностью опускали необходимые параметры. Функции NTDLL представляют собой последнюю часть головоломки, но Алексей всё ещё занят их отладкой. Как только удастся довести их до полностью работоспособного состояния, у ReactOS появится хороший новый загрузчик, который, как мы надеемся, устранит большинство старых ошибок, связанных с проблемами загрузки библиотек.

О создании микшера звука в рамках GSoC

Йоханнес Андервальд (Johannes Anderwald), наставник проекта по созданию звукового микшера, прислал мне разъяснение сути этого проекта, однако из-за некоторой путаницы я не смог его получить до момента публикации предыдущего выпуска новостей. Необходимость в программном микшере возникает тогда, когда у звукового оборудования имеется всего одна физическая линия для воспроизведения и записи аудио. У высококачественного звукового оборудования зачастую имеется несколько физических линий, используемых звуковым стеком для одновременного воспроизведения нескольких потоков. Смешиванием звуковых потоков в этом случае занимается звуковое устройство. Однако, если архитектура оборудования основана на спецификации Intel AC97, в которой обычно имеется всего одна физическая линия, то смешивание аудиопотоков для обеспечения правильного вывода звука ложится на плечи операционной системы. Даже при условии наличия у пользователя звуковой карты с несколькими физическими линиями, возможна ситуация, когда требуется воспроизвести больше звуковых потоков, чем имеется физических линий в наличии. Решением в такой ситуации может стать использование программного микшера. Создание такого микшера является целью одного из проектов, разрабатываемых в рамках Summer of Code.

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