В Википедии говорится : «IBM PC-совместимый — это любой персональный компьютер, аппаратно и программно совместимый с персональным компьютером IBM (IBM PC) и его последующими моделями» . Но что это на самом деле означает? Очевидный буквальный перевод заключается в том, что для того, чтобы устройство было совместимо с ПК, на нем должно работать все программное обеспечение, первоначально написанное для IBM 5150. Является ли это разумным определением? Может ли ему соответствовать любое современное оборудование?
Прежде чем углубиться в это, давайте вернемся к истокам индустрии x86. IBM выпустила ПК, построенный почти полностью на основе стандартных компонентов Intel, и предоставила полные схемы в техническом справочнике IBM PC . Любой мог купить те же детали у Intel и собрать совместимую плату. Операционная система все равно требовалась, но Microsoft с удовольствием продавала MS-DOS любому, кто предложит деньги. Единственное, что мешало клонировать всю плату целиком, — это BIOS, компонент, который находился между самим оборудованием и большей частью работающего на нем программного обеспечения. Концепция BIOS зародилась в CP/ M , операционной системе, первоначально написанной в 70-х годах для систем на базе Intel 8080. В то время не существовало значимой стандартизации — системы могли использовать один и тот же процессор, но иметь совершенно разное оборудование, и любое программное обеспечение, которое делало предположения об используемом оборудовании, не работало бы на других платформах. BIOS в CP/M фактически представлял собой абстрактный слой, набор кода, который можно было модифицировать в соответствии с конкретным оборудованием без необходимости изменения остальной части операционной системы. Пока приложения вызывали только функции BIOS, им не нужно было беспокоиться о базовом оборудовании, и они работали на всех системах, имеющих работающий порт CP/M.
К 1979 году на рынок вышли платы на базе процессора 8086, преемника Intel процессора 8080. 8086 не был совместим по машинному коду с 8080, но ассемблерный код 8080 можно было скомпилировать в инструкции 8086, что упрощало перенос старого кода. Несмотря на это, появление версии CP/M для 8086 затянулось, и компания Seattle Computer Products начала разработку новой ОС, во многом основанной на CP/M и использующей ту же концепцию уровня абстракции BIOS. Когда IBM начала искать ОС для своего будущего ПК на базе 8088 (8086 с 8-битной шиной данных вместо 16-битной), сложная цепочка событий привела к тому, что Microsoft заплатила Seattle Computer Products единовременную сумму за портирование их ОС на оборудование IBM, и остальное уже история.
Однако ключевым моментом было то, что, несмотря на существование MS-DOS, которая теперь поддерживала только оборудование IBM, абстракция BIOS сохранялась, и BIOS принадлежал производителю оборудования — в данном случае, IBM. Ключевое отличие заключалось в том, что в то время как системы CP/M обычно включали BIOS на загрузочном носителе, IBM интегрировала его в ПЗУ. Это означало, что дискеты MS-DOS не содержали всего кода, необходимого для работы на ПК — требовался BIOS от IBM. Поначалу это не представляло очевидной проблемы на американском рынке, поскольку, что кажется крайне странным с точки зрения современной истории, не было ясно, можно ли вообще защитить авторским правом машинный код. В 1982 году в деле Williams v. Artic было установлено, что это возможно, даже если код исправлен в ПЗУ — это в итоге оказало более широкое влияние на отрасль в деле Apple v. Franklin , и стало ясно, что клонированные машины, использующие код ПЗУ оригинального производителя, не будут пользоваться успехом. Любому, кто хотел сделать оборудование совместимым с ПК, пришлось бы искать другой способ.
И вот здесь ситуация несколько расходится. Компания Compaq, как известно, провела реверс-инжиниринг BIOS IBM в условиях «чистой комнаты», чтобы создать функционально эквивалентную реализацию без нарушения авторских прав. Другие производители, ну, были менее щепетильны — они разработали реализации BIOS, которые либо реализовывали подмножество функциональности IBM, либо не реализовывали все те же особенности поведения, и совместимость была ограничена. В ту эпоху несколько производителей выпускали кастомизированные версии MS-DOS, поддерживающие различное оборудование (что, казалось бы, не должно быть необходимым, учитывая, для этого и был создан BIOS, но всё же), и набор программного обеспечения для ПК, работающего на их оборудовании, сильно различался. Это была эпоха, когда производители даже выпускали системы на базе Intel 80186 , улучшенной версии 8086, которая была быстрее, чем 8086 на той же тактовой частоте, и также была доступна с более высокими тактовыми частотами. Производители клонов увидели возможность выпускать оборудование, превосходящее по производительности ПК, и некоторые из них воспользовались этим.
Можно было бы подумать, что IBM тоже немедленно бы отреагировала на это, но нет — 80186 интегрировал множество компонентов, которые на платформах на базе 8086 (и 8088) представляли собой отдельные микросхемы, но, что особенно важно, не обеспечивал совместимость. Пока всё работало через BIOS, это не должно было иметь значения, но во многих случаях работа через BIOS приводила к снижению производительности или просто не предоставляла необходимую функциональность. А поскольку это была эпоха однопользовательских операционных систем без защиты памяти, ничто не мешало разработчикам просто напрямую обращаться к аппаратному обеспечению, чтобы получить желаемый результат. Изменение базового оборудования привело бы к сбоям.
Именно это и произошло. IBM была крупнейшим игроком, поэтому люди стали ориентироваться на платформу IBM. Когда интерфейсов BIOS было недостаточно, они обращались непосредственно к оборудованию — и даже если этого не происходило, они всё равно зависели от особенностей работы реализации BIOS от IBM. Рынок DOS-совместимых, но не PC-совместимых систем практически исчез, хотя были и заметные исключения — в Японии платформа PC-98 добилась значительного успеха, в основном благодаря тому, что японский рынок в то время был довольно сильно оторван от остального мира, а также потому, что она поддерживала японский язык в то время, когда платформа PC была в основном ограничена ASCII или его незначительными вариантами.
Таким образом, некоторое время ситуация оставалась относительно стабильной. Однако базовое оборудование изменилось — процессор 80286 предоставил возможность доступа к более чем мегабайту адресного пространства, и это быстро бы сломало множество систем, если бы IBM не придумала совершенно ужасающий способ взлома, который меня подкосил ещё в 2009 году и который в итоге был достаточно кодифицирован в дизайне Intel, чтобы стать одним из механизмов взлома оригинальной системы безопасности Xbox . Первый ПК на базе 286 даже представил новый контроллер клавиатуры, который поддерживал более совершенные клавиатуры, но оставался обратно совместимым с оригинальным ПК, чтобы избежать сбоев в программном обеспечении. Даже когда IBM выпустила PS/2, первую значительную перестройку архитектуры платформы ПК с совершенно новой шиной расширения и соответствующими патентами, чтобы предотвратить её клонирование без выплаты компенсации IBM, они позаботились о том, чтобы всё оборудование было обратно совместимо. На протяжении десятилетий совместимость с ПК означала не только поддержку официально поддерживаемых интерфейсов, но и поддержку базового оборудования. Именно это позволило поставлять установочные носители, которые, как ожидалось, будут работать на любом ПК, даже если вам понадобятся дополнительные носители для драйверов, специфичных для оборудования. Это то, что по-прежнему отличает рынок ПК от рынка настольных компьютеров на базе ARM. Но это уже не так верно, как раньше, и интересно подумать, было ли это когда-либо настолько правдой, как считалось.
Рассмотрим крайний случай. Если я куплю современный ноутбук, смогу ли я запустить на нем DOS 1981 года? Ответ очевиден: нет. Во-первых, современные системы в значительной степени не используют устаревший BIOS. Весь уровень абстракции, на который опирается DOS, отсутствует, поскольку был заменен UEFI. Когда UEFI впервые появился, он обычно поставлялся с модулем служб совместимости (Compatibility Services Module), уровнем, который преобразовывал прерывания BIOS в вызовы UEFI, позволяя производителям поставлять оборудование с более современным программным обеспечением и драйверами, не дублируя их для поддержки старых операционных систем¹ . Совместима ли эта система с ПК? В самом строгом смысле этого слова — нет.
Хорошо. Но аппаратная часть в целом одинакова, верно? Есть такие проекты, как CSMWrap , которые позволяют реализовать CSM поверх стандартного UEFI, поэтому всё, что обращается к BIOS, должно работать без проблем. И да, если они полностью реализуют интерфейсы BIOS, то всё, что использует интерфейсы BIOS, будет работать нормально. Но что насчёт того, что не использует? Старое программное обеспечение будет ожидать, что моя звуковая карта Sound Blaster будет обрабатывать ограниченное количество прерываний и будет предполагать, что она сможет установить собственный обработчик прерываний и подтверждать их на самом контроллере прерываний. Это действительно не сработает, если у вас PCI-карта, которая отображается на какой-либо вектор APIC . Кроме того, если ваша клавиатура подключена через USB или SPI, то чтение через CSM будет работать (потому что она обращается к UEFI для получения фактических данных), но попытка чтения непосредственно с контроллера клавиатуры не сработает² . Таким образом, вы по-прежнему фактически полагаетесь на прошивку, которая должна делать все правильно, но это не так, потому что среднестатистический человек, который хочет запустить DOS на современном компьютере, имеет три костюма фурри и несколько носков до колен, и хотя вы важны и необходимы, и я вас всех люблю, вас недостаточно, чтобы убедить транснациональную мегакорпорацию изменить бит в чипсете, который заставляет все это старое работать.
Но представьте, что вы, или, как и я, считаете, что написание собственной прошивки для своей странной китайской подделки материнской платы Thinkpad — это хорошее и разумное использование времени, сможете ли вы заставить это работать в полную силу? Ха-ха, конечно, нет. Да, вы, вероятно, можете убедиться, что звуковая карта PCI Sound Blaster, подключенная к док-станции Thunderbolt, имеет маршрутизацию прерываний к чему-то, что уже не является 8259 , а притворяется им, чтобы вы могли просто обрабатывать IRQ 5 самостоятельно, и вы, вероятно, даже можете написать какой-нибудь код SMM, который заставит вашу клавиатуру работать, но как насчет частных случаев? Что, если вы пытаетесь запустить что-то, собранное на IBM Pascal 1.0 ? Есть риск, что система предположит, что попытка доступа к адресу чуть больше 1 МБ даст ей данные, хранящиеся чуть выше 0, и теперь она сломается. На настоящем ПК это будет работать нормально, а здесь — нет, так что совместимо ли это с ПК?
Это очень интересный абстрактный вопрос, и я собираюсь его полностью проигнорировать. Давайте поговорим о графике для ПК 3. Оригинальный ПК поставлялся с двумя различными опциональными видеокартами — монохромным графическим адаптером ( MDA ) и цветным графическим адаптером (CDA) . Если вы хотели запускать игры, вы делали это на CGA, потому что MDA не имел механизма адресации отдельных пикселей, поэтому вы могли отображать только целые символы. Таким образом, даже на оригинальном ПК существовало программное обеспечение, которое работало на одном оборудовании, но не на другом.
Дальше дела пошли ещё хуже. CGA была, мягко говоря, ужасна. Даже IBM это понимала — в 1984 году они выпустили PCjr , призванный сделать платформу ПК более привлекательной для домашних пользователей. Помимо, возможно, худшей клавиатуры, когда-либо ассоциировавшейся с брендом IBM, компания добавила несколько новых видеорежимов, позволяющих отображать на экране более 4 цветов одновременно , и программное обеспечение, зависящее от этого, не отображалось корректно на оригинальном ПК. Конечно, поскольку PCjr потерпел полный коммерческий провал, он не отображался корректно и на будущих ПК. Это станет лейтмотивом.
Никогда не существовало должным образом специфицированной графической платформы для ПК. Поддержка расширенных графических режимов 5 в BIOS была определена VESA , а не IBM, и даже тогда для достижения хорошей производительности требовалось прямое обращение к аппаратному обеспечению. Только с появлением спецификации DirectX от Microsoft что-либо стало широко применимым, даже если вы ограничивались платформами Microsoft, и это был API на уровне ОС, а не аппаратный. Если вы будете использовать интерфейсы BIOS, то код эпохи CGA будет отлично работать на графическом оборудовании, выпущенном до 2010-х годов, но если вы попытаетесь напрямую обратиться к регистрам оборудования CGA, то у вас возникнут проблемы. Это даже не новость — даже если мы ограничимся подлинным линейкой IBM PC (и проигнорируем PCjr), к моменту появления Enhanced Graphics Adapter мы не будем полностью совместимы с CGA . Совместим ли IBM PC/AT с EGA PC? Вы, вероятно, ответите «да», но существует программное обеспечение, написанное для оригинального PC, которое там не будет работать.
А теперь давайте углубимся в детали. У первого ПК была чётко определённая частота процессора и чётко определённое количество тактов, необходимых для выполнения любой инструкции. Люди могли писать программное обеспечение, зависящее от этого. Когда процессоры стали быстрее, некоторые программы стали давать сбои. Это привело к появлению систем с « турбо-кнопкой» — кнопкой, которая снижала тактовую частоту до уровня, приблизительно соответствующего первому ПК, чтобы предотвратить сбои. Ничего страшного, позже мы всё равно получим сбои Windows на быстрых машинах , потому что аппаратные характеристики неизбежно будут влиять на производительность.
Итак, что же такое совместимость с ПК? Ни один современный ПК не сможет запустить DOS, которая работала на оригинальном ПК. При желании можно добиться того, чтобы он запустил большинство старых программ, если только они не предполагают наличие сегментации памяти, проблем с процессором или не пытаются напрямую взаимодействовать с видеокартой. И даже в этом случае он может оказаться непригодным для использования или зависнуть, потому что времени мало.
Правда в том, что технически невозможно описать понятие «совместимость с ПК» ни сейчас, ни, честно говоря, когда-либо. Если бы вы отправили современный ПК в 1981 год, СМИ были бы поражены и также отметили бы, что на нём не работает Flight Simulator. «Совместимость с ПК» — это социально определяемый конструкт, как и «женщина». Мы можем зацикливаться на деталях, а можем просто расслабиться.