> 640 килобайт должно хватить всем!Давай я тебе расскажу, как появилась эта фраза.
16-битная адресация позволяет адресовать 64 килобайта памяти. На широко известных процах MOS 6502 и Zilog Z80 был 8-битный размер машинного слова и 16-битная адресация.
Проц 8086 был 16-битным процом с 20-битной адресацией. Позволял адресовать мегабайт.
Однако это была вторая половина 70-х. В то время в компьютерах было совсем оперативной памяти. Дело в том, что память стоила слишком дорого. И пому мегабайт был никому не нужен.
Поэтому Intel выпустила процессор 8088. Это был всё тот же процессор, но с 16-битной адресацией, которая позволяла адресовать только 64 Кб.
Это позволяло удешевить компьютеры. Разводить меньше контактов под память. Использовать меньше физической памяти, т.к. обычно нужно использовать все имеющиеся контакты под память.
При этом, внутри процессор всё так же оставался 16-битным с 20-битной адресацией. Соответственно, программы использовали 20-битную адресацию. Просто последние четыре неиспользуемых бита адреса просто заполняли нулями. Это позволило впоследствие безболезненно перейти на 8086.
Сначала вышел IBM PC. Проц 8088, 64 Кб памяти (была ещё модель с 16 Кб памяти). Спустя несколько лет, вышел IBM PC XT. Памяти у него теперь был мегабайт (память подешевела). Однако и того мегабайта было доступно только 640 Кб.
Дело в том, что IBM написала спецификацию для IBM PC XT. Когда первые 640 Кб отдаются пользователю, а остальное пространство вплоть до конца первого мегабайта отдаётся под служебные нужды. Например там было окошечко 64 Кб для общения с видеопамятью.
Однажды наступил момент, когда юзерам стало не хватать 640 Кб ОЗУ. Появилась так называемая EMS-память. Там каким-то образом подрубались к памяти и добавляли ещё. Я не в курсе, как именно. При этом, прога должна знать, что память EMS в принципе существует. В противном случае, прога попросту не увидит дополнительную память.
Затем Intel выпустила процессор 80286 (или просто 286). 16-битный процессор с 24-битной адресацией. Теперь можно адресовать 16 мегабайт. Понятное дело, что 16 мегабайт на компьютерах того времени не было. В 1992 году, в год выхода Wolf3D, нормальным объёмом памяти считалось 2 Мб, а в 1993 году (в декабре месяце, почти что уже в 1994) нормальным объёмом памяти считалось 4 Мб. Так что 16 Мб, это теоретически лимит. Мол, задел на будущее.
И вот юзеры IBM PC XT ждут следующую версию компа, в котором будет 80286 процессор, и с которым не надо будет трахаться с EMS-памятью, чтобы преодолеть лимит в 640 Кб ОЗУ. Вышел IBM PC AT. На 286-м процессоре. Таком долгожданном! А что там насчёт двух мегабайт памяти вместо одного?
Ой.
Оказалось что, чтобы использовать 24-битную адресацию, надо использовать новый режим работы с памятью. Стандартный режим.
РЕАЛЬНЫЙ РЕЖИМ (8086)
СТАНДАРТНЫЙ РЕЖИМ (286)
Стартует комп (реальный режим). Стартует BIOS (реальны режим). Передаёт управление операционной системе (реальный режим). Запускается командный интерпретатор COMMAND.COM (реальный режим). Запускается пользовательская прога, которая переключает компьютер в стандартный режим. Юзер в ней поработал, а потом захотел прогу выключить.
Ой.
Проц НЕ МОЖЕТ переключиться в реальный режим. COMMAND.COM не может работать в стандартном режиме. Дело в том, что COMMAND COM был написан в те времена, когда ему надо было работать на 64 Кб ОЗУ (и даже на 16 Кб ОЗУ). Экономили каждый байт. Поэтому COMMAND.COM работал только в реальном режиме. Прогу можно переписать таким образом, чтобы она могла работать и в стандартном режиме, но тогда потеряется обратная совместимость.
Безвыходная ситуация. Или давайте весь имеющийся багаж прог под IBM PC пересобирать из исходников под стандартный режим. Или пользоваться прогами под стандартный режим, а потом перезагружать компьютер, чтобы вернуться в реальный режим. Или же проигнорить стандартный режим вовсе, как будто его и не существовало.
Именно так и поступил майкрософт. На вопрос "а как же два мегабайта памяти?" те ответили "а что, вам 640 Кб мало? По-моему, 640 Кб памяти хватит ещё очень надолго".
Что было дальше? А дальше вышел 386 процессор - 32-битный проц с 32-битной адресацией, в котором Intel пофиксила все недостатки, которые Microsoft нашёл в 286 процессоре.
РЕАЛЬНЫЙ РЕЖИМ (8086)
СТАНДАРТНЫЙ РЕЖИМ (286, был дружно всеми проигнорен)
ЗАЩИЩЁННЫЙ РЕЖИМ (386)
LONG LONG РЕЖИМ (x86_64, но я забегаю далеко вперёд, это будет только 2003 году)
Какие именно недостатки? Во-первых, возможность вернуться из защищённого режима в реальный без перезагрузки. Вот погонял ты в думчик, вышел и игры, а потом такой оп - и ты в COMMAND.COM-е.
Во-вторых, АППАРАТНАЯ ВИРТУАЛИЗАЦИЯ, чтобы запускать программы, которые в своё время были написаны для real mode (и знать не знают ни про какой protected mode), внутри многозадачной операционной системы. Операционка работает в protected mode, прога тоже работает в protected mode, однако ей кажется, как будто она работает в real mode. Ей кажется, что она имеет монопольный доступ к первым 640 Кб оперативной памяти компьютера. На самом деле, она работает в виртуальном адресном пространстве, и диапазон реальной физической памяти ей могли выделить какой угодно. Это работает БЫСТРО благодаря тому, что подобная переадресация работает аппаратно. Фича называется VM86.
А затем, уже ПОСЛЕ выпуска 386 процессора, внезапно выяснилось, то на 286 процессоре тоже можно вернуться из стандартного режима в реальный (через клавиатурное прерывание, но медленно), и 24-битную адресацию памяти можно поюзать, прям не выходя из реального режима.
286-й процессор всё ещё являлся актуальным процессором (никто ещё не перешёл на 386-й процессор, потому что он к этому моменту вышел совсем недавно, и пока что стоил дорого). Поэтому Microsoft поступила следующим образом. Актуальной версией операционной системы была Windows 2.0. На её основе, Microsoft выпустила Windows 286 и Windows 386.
Windows 286 имел в своём составе новый драйвер HIMEM. Используя этот драйвер, прога под виндой могла использовать вплоть до 16 Мб ОЗУ. При этом, сама винда по-прежнему работала в real mode, продолжая игнорировать standard mode и дальше, и реализуя многозадачость прям в реальном режиме.
Что интересно, HIMEM загружался ещё на этапе доса (был прописан в CONFIG.SYS), поэтому досовские программы с радостью начали использовать новую фичу. В итоге драйвер добавили в стандартную поставку доса, и больше не надо было ставить ради него винду.
Windows 386 получил возможность одновременного выполнения нескольких программ. Так-то и в Windows 286 несколько прог выполняются одновременно, однако когда вы выбираете одно окно, другое встаёт на паузу. На Windows 386, неактивные окна на паузу не встают.
Фактически то было 32-битное ядро системы с 16-битными прогами.
Также в Windows 386 вошла одна очень интересная прога. Она называется DPMI. "Расширитель памяти для DOS". При помощи неё, можно написать программу для DOS, которая использует Protected Mode и 32-битную адресацию памяти. Чем это отличается от 16-битной проги, которая использует HIMEM? Многозадачностью? Да нет - прога получается однозадачной. Так какой тогда смысл?
Дело в том, что 16-битная прога использует 20-битную адресацию, и при этом имеет возможность общаться с HIMEM, который использует 24-битную. "Слушай, HIMEM, я знаю, что где-то есть диапазон памяти, который я не вижу. Дай-ка мне оттуда такой-то блок данных. А теперь запиши туда этот". И вот так - гонять туда-сюда память. А с 32-битной адресацией, прога видит всю память, как открытую книгу. Так проще работать с памятью.
Поэтому Doom не работает на 286-х процессорах. Думу надо 4 Мб ОЗУ, и гонять куски данных из первого мегабайта в оставшиеся три мега 35 раз в секунду - маразм. Doom хочет нормальную полноценную 32-битную адресацию памяти.
Ну и 286-й проц не потянул бы дум, даже если его разогнать.
Вот, а потом вышел Windows 3.0. Там появилась новая фича - VESA VBE Protected Mode. Когда можно было избавиться от 64-килобайтного окошечка для общения с видеопамятью. Это дало старт высоким разрешениям, таким как 1280x1024 256 цветов.
Первым видеоадаптером с поддержкой Win32-режима стал адаптер от компании S3. Это был супердорогой адаптер, так как высокие разрешения требовали нескольких мегабайт видеопамяти. Использовалась память EDO, которая стоила дорого (а подешевела лишь в 1996 году).
На протяжении первой половины 90-х существовали супер дорогие видеокарты для типографий и прочих профессий, которым нужны высокие разрешения. Даже пафосный разъём для видеокарт появился - VLB (но использовался он чаще всео SCSI-контроллерами, благо что на матенках было несколько разъёмов VLB). Компания S3 как положила начало супердорогим видеокартам, так и положила и конец. S3 Trio 64+ - карта дешевле $100, которая умеет всё то же самое, что раньше умели только топовые решения. Как говорит Дмитрий Бачило, комментируя успех этой карты, "это как если бы сейчас ставить на все компьютеры GeForce 4090, которая стоит $80 и не греется".
Также в Windows 3.0 появился DMPI 1.0 (предыдущий имел версию 0.9). Казалось бы - ура, релиз! А то был какой-то пре-релиз 0.9. Но... многим версия 1.0 не понравилась, и они продолжили пользоваться 0.9. А в Windows 3.1 DPMI вообще не вошёл.
А потом появился DOS4GW, которым стали пользоваться почти все (во всяком случае, игры). Успех Дума заставил обратить на него внимание и остальных разработчиков игр. А вот когда релизнулся Quake, Id Software использовала там какой-то другой расширитель памяти для DOS. Но никто не бросился переходить с DOS4GW на него, так как уже существовал Windows 95.
Когда вышел Windows 3.1, всем казалось, что DOS это прошлое. Что будущее за Windows - как же всё-таки удобно открыть несколько окон сразу, и копировать результат вычислений одной проги в другую. В досе для этого пришлось бы выключить одну прогу и включить другую, а буфера обмена вообше не было бы (в лучшем случае, импортировать файл, в худшем - ввести результат с клавиатуры).
Да и конфиги какие тогда были! 486/66, четыре мега оперативы! А мажорчики так и вообще 6 или 8 мегов ставили! Мультимедиа, AWE32, сидиром, саундбластер! Досу тут места нет! Ни одна прога не тормозит! И тут выходит дум.
Ой, а оказывается, что, когда досовская программа запускается из-под доса, и она монопольно захватывает проц и видеокарту, то производителость получается такая, что графон поражает воображение. Аж сам Билл Гейтс впечатлился этой игрой (притом что за год до этого про Id Software вообще мало кто слышал). А под виндой доступ к видеокарте - непрямой, иначе никакой многооконности не будет, если каждая прога будет сама решать, где и что ей рисовать, не спрашивая разрешения операционной системы. А с непрямым доступом, производительность очень печальная. Myst, пасьянс и пошаговые стратегии.
Тогда Microsoft создал WinG, дав вожделенный прямой доступ прогам. Так Doom был портирован на винду.
Потом появился Windows 95, в котором WinG был заменён на DirectX. DirectX не успел войти в релиз, выйдя лишь пустя несколько месяцев. А впрочем, это уже совсем другая история