ROS Newsletter54

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

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

Использование памяти

Минимальный объём памяти, требуемый ReactOS, на протяжении некоторого времени рос, в основном, из-за требований программы установки. Вообще, разработчики знали, что после установки ReactOS требовалось значительно меньше памяти, чем во время самого процесса. Многие полагали, что существует некоторая утечка памяти, либо в самом установщике, либо в диспетчере памяти. Это была проблема, которая беспокоила многих, но она не была решена до тех пор, пока Алекс Ионеску (Alex Ionescu) не разрешил её. Алекс первым изменил вывод программы установки для отображения кеша ядра и пула ядра вместо страничного и нестраничного пулов, чтобы определить, где исходит утечка памяти. Он также убрал хак, который останавливал программу установки при уровне использования памяти более 40%. Затем он исправил часть диспетчера памяти и менеджер кеш-памяти, в результате чего объем требуемой памяти уменьшился до 24 мегабайт. Объем памяти, требуемый операционной системе после загрузки теперь снизился до 20 мегабайт. Я уверен, что я не единственный, кто высоко ценит эти исправления.

Клиент-серверная среда выполнения

Компонент CSRSS (Client/Server Runtime Subsystem, клиент-серверная среда выполнения) управляет консолью и является пережитком тех вренем, когда код ReactOS был чрезмерно запутанным. Тимо Крейцер (Timo Kreuzer) потратил на работу с ним несколько дней, пытаясь исправить структуру данных CSR_API_MESSAGE. Эта структура данных требуется для функции CsrClientConnectToServer и правильной инициализации модуля user32, который работает с передачей сообщений, окнами и другими необходимыми для работы операционной системы вещами. Исходная версия этой структуры в ReactOS является неправильной, в результате чего неправильно используется функцией CsrClientConnectToServer. Так или иначе, где-то в недрах кода ROS какой-то компонент использует константно заданный размер этой структуры данных, поэтому любые попытки удалить или добавить в нее новые переменные приводят к падению системы. Тимо попытался отследить то место, где это происходит, но, увы, безрезультатно. Сейчас он приостановил работу над компонентом и, если поглядеть на код, его нельзя винить за это. Там есть строчки, где кто-то использовал множественное приведение типов - сначала к указателю на базовый тип, потом этот адрес увеличивался на размер структуры, и потом приводился к другому типу, который требовалось использовать. Любой человек, знающий язык C, поморщился бы при виде такого кода, поскольку он одновременно уродлив и с большой вероятностью может содержать ошибки.

Сеть

Прошло много времени с тех пор, когда Арт Еркс (Art Yerkes) впервые заставил сетевой стек работать. С тех пор Камерон Гутман (Cameron Gutman) продолжил работу над ним, пытаясь улучшить код и встроить новые функции. Многое из этой работы было сделано в отдельной ветке SVN, но большая часть была соединена с основным кодом. Однако не так давно Арт выделил время на то, чтобы разобраться с давно найденными ошибками, поскольку сейчас он гораздо лучше понимает работу сетевого стека и протоколов.

Арт также провел дополнительную работу над кодом, недавно исправив проблему с loopback'ом. Для того, чтобы подключиться к прослушиваемому сокету, привязанный адрес должен либо быть 0, либо совпадать с адресом адаптера, к которому приложение собственно привязано. Для приложений, которые хотят прослушивать loopback, возможно привязать адрес 0 или же 127.0.0.1. Первый способ позволяет прослушивать все возможные адаптеры, второй же позволяет приложению прослушивать только локальный трафик. Однако в ReactOS приложения, которые пытались привязаться к адресу 0, получали вместо него привязку к первому найденному в системе адаптеру. Обычно это означало, что приложения не могли прослушивать локальный трафик, что приводило к сбоям. Арт нашел и устранил эту проблему, благодаря чему привязка к адресу 0 теперь работает.

Другая проблема, которую Арт исправил, заключалась в неправильном обращении с IRP_MJ_CLEANUP и IRP_MJ_CLOSE. Изначально Арт не понимал, для чего эти две функции предназначались. IRP_MJ_CLEANUP используется для отмены всех "висящих" IRP, принадлежащих объекту, на котором она была вызвана. Сам по себе объект все еще является актуальным даже после IRP; IRP_MJ_CLOSE предназначалась для освобождения памяти из-под объекта. Однако, вместо этого ReactOS расценивала эти IRP как идентичные и освобождала память из-под объекта при вызове любой из них. Поскольку операционная система ожидала, что объект будет все еще актуален после вызова CLEANUP, это вызывало проблемы с исчезнувшими ресурсами.

Звук

Работа над звуком достигла той позиции, на которой Эндрю Гринвуд смог воспользоваться Winamp'ом для воспроизведения музыки. Вообще это теоретически уже было возможно ранее, но только с использованием sndblst.dll версии NT 4. Теперь можно использовать ту версию sndblst.dll, которую написал Эндрю. В данный момент возможно проиграть только один файл, хотя Эндрю не пробовал проигрывать в несколько потоков одновременно. Теоретически это должно вызвать предупреждение о том, что устройство уже используется. Использование потоков на уровне ядра пока не работает, по крайней мере у Эндрю. Чтобы заставить wdmaud.drv взаимодействовать с кодом, написанным Джоханнесом Андервальдом, а так же написать sndblst.sys (часть sndblst.dll, работающая на уровне ядра), потребуется еще некоторое время.

Целевая платформа

Версия Windows, которую ReactOS официально считает целевой, являлась спорным предметом уже некоторое время. По сути есть две заявленных целевых платформы, одна из которых включает в себя ядро NT, а вторая - подсистему Win32. Официально ядро ReactOS считает целевой платформой ядро Server 2003, также известное как NT 5.2. Эта целевая платформа практически не меняется. С другой стороны, целевая платформа Win32 всегда ориентирована на последнюю версию Windows, которой на момент написания этой статьи является Windows Vista. Вот почему часто производятся commit'ы в SVN, связанные с функционалом Vista. Когда выйдет Windows 7, целевая платформа Win32 будет снова смещена, однако это не значит, что будет принято решение также сменить целевое ядро.

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