Disclaimer2: текст содержит много компьютерного абырвалга, кому неинтересно - не читайте, сдавайтесь сразу :-)
...патчил тут 2003 сервер (который как XP, но сервер) от недавнего криптолокера, и грустно глядя на 32-битную винду на процессоре i7, размышлял о том, какого фига PAE (использование более 4Гб в 32-битном режиме) в винде работает с обычным софтом, но глючит с некоторыми драйверами (в результате чего в "сервере" у меня так и торчит 4Гб памяти). Глючит оно на самом деле потому, что программы в ia32 ходят в память не напрямую (по линейному адресу), а с использованием регистра-"селектора", задающего начальное смещение, что позволяет подсунуть 32-битной программе 64-битное смещение так, что она этого и не заметит, а с железом, работающим с памятью напрямую, такое вот "не заметит" не катит - если драйвер не умеет выцеплять и передавать железу корректный полный адрес, то ой. Но мысль, как часто бывает, пошла дальше, и не совсем туда.
Архитектура x86-64 (кстати, придуманная AMD, intel подхватил уже позже, когда "не взлетела" интеловская архитектура ia64 (itanium)), является расширением архитектуры ia32, "внешне похожим на ia32, но всего побольше, и теперь в 64". На месте знакомые регистры AX, BX, CX, DX, BP, SI, DI и SP, только теперь с буковкой R в начале и 64 бит, и там даже сегментную организацию памяти недодушили (хотя и хотели).
Ia32 в свою очередь является расширением 8086 (16bit x86), сделанным примерно по тому же принципу - знакомые AX, BX и далее по списку, но 32 бит и с буковкой "E", и "селекторы" вместо "сегментов" из 8086. Ну и набор команд примерно тот же, но "теперь и 32 бит". С селекторами, кстати, как бы прорыв - теперь программе необязательно знать, где именно лежит её память (через что реализовано много интересных вещей вроде виртуальной памяти, в частности именно через это "необязательно" позже будет реализовано PAE), но логически это переделанные "сегменты" из ассемблера процессора 8086 - того самого, на котором собирались самые первые "писюки" (ну, или около того - там ещё 8088 был, но разница непринципиальная).
Сегменты же в 8086 появились не просто так. На момент создания 8086 уже понимали, что 64 килобайта адресуемой памяти - это как-то совсем мало, и замахнулись аж на целый мегабайт оперативки. Но вместо чтобы сделать линейный 20-битный адрес, адрес оставили 16-битным, а память нарезали ломтиками, обращаться к которым можно было через "сегмент", содержащий старшие биты полного адреса. Но почему сегменты, почему не 20 бит одним куском, вроде так проще же?
А потому, что ассемблер 8086 был разработан в том числе с учётом того, чтобы максимально упростить перенос ассемблерных программ, написанных под процессор 8080 - поэтому мнемоника 8086 в значительной мере копирует 8080, адреса - 16-битные, ну и так далее. Сегменты, соответственно, пришлось "пришить" чтобы 16-битные программы могли работать с 20-битным адресом, не замечая подвоха.
А 8080 это, на минуточку, времена примерно CP/M! Даже "синклеры-спектрумы" строились уже на более продвинутом Z80! CP/M, Карл! То есть, ассемблер современных, продвинутых, всех таких насквозь 64-битных процессоров фирмы intel до сих пор несёт в себе остатки потребности в переносе программ из, простите, CP/M!
А ведь у интел когда-то была настоящая, без груза совместимости с тёплыми ламповыми процессорами в DIP40 корпусе (керамическом, с позолоченными ножками), платформа - ia64, процессоры itanium. Архитектура EPIC, между прочим (Explicit Parallel Instruction Computer, а не то что вы подумали), точнее - VLIW (привет, Эльбрус!), а не этот ваш CISC, как в x86 и всём что из него выросло. Под неё даже винда была, только особая! Но поскольку этот интел-процессор не был, простите за каламбур, интел-совместимым, победил интел-совместимый AMD x86-64, на котором можно было запускать пиратский офис с радиорынка и нортон командер в дос-окошке.
Причем, учитывая прогресс технологий, вполне реализуем был бы такой сценарий. Выпускается процессор, содержащий два комплекта декодеров команд: ia32 - совместимый со всем этим античным безобразием, и (допустим) ia64 - ни с чем не совместимый, зато принципиально новый и перспективный. И позволить процессору переключаться между ними на ходу. Пишется операционная система, заточенная под ia64, но умеющая запускать ia32-совместимые программы, временно переключая для этого процессор на нужный декодер (и соответствующим образом транслируя передачу параметров при вызове системных функций). В результате мы можем быстро запускать ia64 задачи, и не-слишком-медленно - ia32 задачи. Дальше ia32 часть потихоньку редуцируется, а ia64 - развивается, чтобы лет через десять выпустить версию только с ia64 частью: один фиг ia32 к тому моменту почти вымрет. И получить наконец по настоящему современный процессор, а не результат постепенной эволюции 4-битного Intel 4004.
Но - нет.