Выживание Windows XP x32 на современных ПК c процессором Intel

Kate

Administrator
Команда форума
Речь пойдет про платы периода 2016-2021+, т.е. процессоры Skylake и выше. На платформах AMD почти те-же проблемы, но проблем чуть меньше. Все что относится к Windows XP также применимо к Windows 2003 Server за исключением мелких деталей. C Windows XP/2003 x64 ситуация тоже схожа, но изначально условия несколько благополучнее (нет проблем с драйверами в системах с памятью выше 4Гб). Статья не является "пошаговой инструкцией", в основном теория и способы решения проблем. На вопрос "Да кому сейчас нужен этот XP?" мой персональный ответ - это хобби, протащить алмаз код 2001 года через паутину современного железа...

Если попытаться установить XP c установочного носителя(cdrom/usb/hdd), установщик вывалится в BSOD 0xA5.

76bbc321d06622b23f3773463484e57c.jpg

Этот код ошибки относится к подсистеме ACPI, которая выбирается установщиком как приоритетная. В установщике можно выбрать режим без использования ACPI, затем это отразится на работе Windows - 1) ограниченное управление питанием процессора/частоты и возможное ограничение на кол-во обнаруженных ядер, 2) часть устройств содержит код инициализации/управления/... в ACPI таблицах DSDT/SSDT, этот код никогда не будет задействован. Я режим "без ACPI" никогда не использовал и не тестировал, возможно есть и другие ограничения (самое известное - отсутствие программного способа выключить компьютер).

Вернемся к приоритетному режиму, с активным ACPI. Cтандарт менялся, выходило несколько версий, для нас ключевые версии ACPI 1.0b и ACPI 2.0, разница между ними существенная, а вот разница между ACPI 2.0 и например ACPI 6.1 со стороны Windows я подозреваю отсутствует (imho). Windows XP поддерживает только версию 1.0b, Vista и выше поддерживают обе версии. Производители мат. плат ориентируются на актуальные версии Windows, совместимость с Windows XP больше не требуется, поэтому код bios реализует только версию 2.0(или одну из последующих версий). Основные отличия стандарта 2.0 от 1.0b:

  1. синтаксис ACPI Source Language (ASL) расширен на ~13 новых комманд
  2. появился 64-битный доступ к памяти/полям структур
  3. на хранение/арифметику всех целых чисел выделяется 64 бита вместо 32 бит.
Причина почти всех BSOD 0xA5 это пункт 1) ACPI Source Language (ASL), для решения этой проблемы существует два различных файла ACPI.sys реализующих новый синтаксис. Второй файл взят из бета версии Longhorn и имеет также реализацию пуктов 2) и 3)

Итак, установщик более не радует нас BSOD 0xA5, можно устанавливать Windows c активным ACPI. Для управления используется клавиатура, после первой перезагрузки включается графическая часть установщика и можно использовать еще и мышь. Эти устройства давно с USB интерфейсом и у большинства пользователей с ширпотреб. материнскими платами подключены к портам южного моста. Южный мост у Intel еще с предыдущих платформ переименован в PCH (Platform Controller Hub) и на микросхеме H110(и выше) содержит только USB3 контроллер (в предыдущих платформах Ivy/Sandy/??? был совмещенный USB2/USB3 контроллер). Windows XP имеет встроенные драйвера только на USB1/USB2, для USB3 встроенные драйвера появились только в Windows 8. Так как же управлять USB-клавиатурой подключенной к USB3 контроллеру в установщике без драйверов? Помощь приходит со стороны мат. платы, почти во всех BIOS есть эмулятор PS/2 клавиатуры/мышь. Это программный эмулятор, работающий на уровне SMM (System Management Mode), он преобразует аппаратные события со стороны USB3 контроллера в виртуальный IO порт 0x60-0x64, для Windows и даже DOS это выглядит как аппаратное устройство и они активируют свои PS/2 драйвера. Эмулятор ущербный, с клавиатурой еще как-то можно работать, но мышь эмулируется на уровне "если прицелится, то можно нажать где-то на экране", но для установщика этого эмулятора хватает.

Управлять установщиком теперь возможно, далее будет BSOD 0x7B, про эту ошибку все и так знают - Windows не может найти ни одного поддерживаемого контроллера дисков(накопителей), решение тоже всем известное - в файлы установщика интегрировать AHCI драйверы производителя, для Intel есть много вариантов:

  1. простой и супер универсальный iaStor v11.2.0.1006
  2. продвинутые Intel RST/RSTe
  3. StorAHCI из Windows 8 как в виде портированных исходников от минимум двух авторов так и в двоичном виде
  4. MS AHCI из Windows 7
  5. опенсорсный UniATA
Для NVMe накопителей также есть несколько вариантов универсальных драйверов: open source OFA 1.3/1.5, Windows 7 NVMe Driver, Samsung NVMe Driver

В итоге мешающие препятствия преодолены, Windows можно установить и загрузить до состояния графического рабочего стола. Но работать в такой системе некомфортно, решаемые(-частично) проблемы:

1) по прежнему используется неэффективнaй PS/2 эмулятор мыши/клавиатуры

2) некоторые приложения ведут себя странно, рывки анимации или похожие глюки

3) процессор всегда потребляет существенную мощность

4) доступно 1.5-3.2Гб ОЗУ при установленном размере физической памяти 4Гб и выше

5) нет доступа к дополнительным накопителям с GPT разметкой

6) расширенные инструкции AVX/AVX2/AVX-512

По каждому пункту:

1) Вместо эмулятора нужен драйвер USB3 контроллера, Intel для XP драйвер не выпускала. После ряда экспериментов выяснилось что для Intel USB3 контроллера подходят три различных драйвера с разной стабильностью и совместимостью, самый лучший это портированный из Windows 8 драйвер от Microsoft. Для активирования более быстрого UASP режима накопителей есть три драйвера почти одинакового качества: а)VIA uas б) Microsoft uaspstor в) Etron uas. USB3 драйвер можно также интегрировать в установщик, но процесс достаточно сложный. Драйвера сторонних производителей USB3 для Windows XP это отдельная тема, "кто у кого что украл и при чем здесь индусы"

2) Проблема связана со счетчиком производительности. В разных версиях Windows для этого счетчика разный выбор из доступных аппаратных способов. Даже между Windows XP SP1 и SP2 выбор разный. Для SP3 выбор состоит из двух вариантов: а) ACPI Timer б) TSC процессора. Выбор определяет BIOS. С этим счетчиком актуален вопрос "Кто же напортачил, авторы спецификации ACPI 2.0, которые сэкономили на одном бите регистра и этим сломали совместимость c пред. стандартом или это авторы современных BIOS, которые своенравно интерпретируют назначение этого бита ?" Мое маленькое расследование почему важен этот бит:

Аппаратный таймер ACPI и предположительно часть других аппаратных ACPI-блоков на современных Intel-мат. платах отключены за ненадобностью (не используются в Windows 7-10, но могут использоваться в Vista или других "не windows" ОС). Этот бит говорит операционной системе можно ли вообще использовать таймер ACPI. Логично не устанавливать этот бит поскольку таймер отключен, но BIOS по прежнему устанавливает этот бит , так как в ACPI 2.0 за ним закрепили еще одну функцию - индикатор наличия рабочего HPET таймера. От таких "оптимизаций" у Windows XP сносит крышу и она использует выключенный ACPI таймер как счетчик производительности(прошедшего времени). Решение проблемы - один из системных файлов патчится чтобы состояние этого бита интерпретировалось всегда как "0" и выбор счетчика был только один - TSC. Еще один камень в сторону авторов BIOS - на плате Gigabyte H110 при отключении HPET в bios этот бит по прежнему равен "1", т.е. явная ошибка

3) Проблема снова связана с отключенными аппаратными ACPI блоками. В стандарте ACPI описаны два режима пониженного потребления мощности С2 и С3, для перехода процессор должен записать определенные значения в определенные порты ACPI железа, потом происходит БАХ и наступает мрак, на процессор тактовые импульсы больше не подаются + остальная магия, связанная с состоянием внутреннего кэша и т.д. Поскольку теперь ACPI на плате в урезанном режиме, Windows XP в режимы С2/С3 не переходит, хоть и записывает все что нужно в порты. Мрак не наступает, процессор крутится как ни в чем не бывало. Логично спросить - а как же экономят энергию Windows 7-10? Очень просто - они используют только возможности центрального процессора без задействования подсистемы ACPI.

От центрального процессора можно добиться два варианта:

  • классическая инструкция hlt, можно переключится только в режим С1
  • инструкции monitor/mwait, переключается в С7 или С10.
    Решение для Windows XP - патчим один файлик чтобы вместо ACPI С2/С3 использовались те-же два процессорных способа
4) Проблема давно известная, это программное ограничение появилось в Windows XP SP2. Для решения существует несколько известных утилит, PatchPae или более поздний комбайн "fix128" (все они некорректно меняют DMA функции, см. далее). Потом выяснилось что проблема зарыта гораздо глубже и виной тому Microsoft - она не смогла сделать удобное API для программирования DMA-передач. Вместо этого был монстр, который состоял из закрытых абстракций, коллбаков и подобных трюков. В теории через такой API все равно можно правильно программировать, но так смогли не только лишь все. Когда у вас менее 4Гбайт памяти, то драйвер какого-то устройства работает нормально, но если память переходит за эту границу, драйвер начинает вести себя по другому. Вместо того чтобы заменить API и мотивировать сторонних разработчиков исправить существующие драйвера, Microsoft пошла короткой дорогой - в SP2 вырезана поддержка памяти выше 4Гбайт, все DMA-передачи теперь также ограничены максимальным 32-битным адресом, система сертификации драйверов дает добро на драйвера, которые даже не работают с памятью > 4Gb, разрабы больше не парятся на тему "а как наш драйвер поведет себя на >4Гб ?"

Полноценного решения проблемы нет в принципе, если у вас есть некое устройство, но его драйвер некорректно работает с памятью >4GB, то устройство "в пролете", надо возвращать обратно лимиты по памяти. У Microsoft тоже есть такой драйвер - печально известный драйвер USB2. Тот же драйвер для Windows 2003 не имеет подобной проблем, но внутри он "другой", с корректным программированием DMA.

762d71ecfc4b6a17d41d5d74e82253bb.jpg

Вместо старых утилит снятия ограничений, обновилась WinXPPAE v3.5 от Daniel K., только она содержит правильный патч DMA-передач, восстанавливающий эквивалентный код из SP1 и при этом не создающий новых проблем.

5) Когда-то Paragon Software выпустил GPT драйвер для Windows XP, с тех пор его и используют. Альтернативный вариант это файлы из Windows 2003 поверх встроенных в XP. Для загрузки с GPT раздела этого не достаточно, так как необходима сквозная поддержка начиная с кода бут сектора, есть удачные эксперименты с использованием сторонних загрузчиков

6) AVX и выше требуют поддержки со стороны ОС так как нужно сохранять куда-то новые регистры при переключении контекста. Решение частичное - когда то Microsoft расщедрилась и заранее добавила новые поля как резервные в область сохранения контекста. Этих полей достаточно для сохранения всех AVX регистров в x32 режиме, но уже не хватает для всех AVX-512 регистров. Если речь про Windows XP x64, то места по-моему не хватит даже для всех AVX регистров, их там банально больше в два раза.

А теперь время "печали", список нерешаемых(нерешенных) проблем:

  1. Отcутствие WINE for Windows XP (есть конечно One-Core-API, но у него реализация на мой взгляд безкомпромиссная - заменять существующий код XP на код ReactOS/Wine ). Это самая существенная проблема выживания Windows XP, из-за неё почти все новые версии выпускаемого ПО не работоспособны(функция xxx не найдена в библиотеке yyy)
  2. существующие ACPI.sys не дотягивают до уровня хотя бы vista
  3. загрузка Windows 32бит из современного 64-битного UEFI режима
  4. установка/загрузка с GPT накопителя
  5. нет TRIM "на лету" для SSD, можно только периодически запускать сторонние утилиты для принудительного "маркирования" всех неиспользуемых секторов как свободных
  6. поддержка DirectX 10/11 видео-драйверов с более поздних Windows
P.S. Есть пара законченных проектов для ковыряния в кишках ядра XP и портирования драйверов:


Источник статьи: https://habr.com/ru/post/556930/
 
Сверху