LINUX.ORG.RU

Начались разговоры об удалении поддержки архитектуры процессоров i486 в ядре Linux

 , ,


0

3

24 апреля 2025 г. в рассылке разработчиков ядра Линус Торвальдс поднял вопрос о целесообразности продолжения поддержки процессоров на базе архитектуры i486. Это связано с обсуждением части кода ядра, отвечающего за эмуляцию инструкций CX8 (CMPXCHG8B) и TSC (Time Stamp Counter), поддержка которого требует вложений сил и времени, но не несёт существенной пользы. Исключения из ядра поддержки i486 позволит избавиться от вышеназванных инструментов и освободит около 14104 строк кода.

25 апреля 2025 г. Инго Молнар, один из мейнтейнеров архитектуры х86, предложил набор патчей, удаляющих из ядра поддержку процессоров i486 (M486, M486SX и AMD ELAN), а также начальных серий процессоров i586. Он предлагает оставить только возможность работы только с процессорами х86, поддерживающими инструкцию CX8 и регистр TSC (Time Stamp Counter), которые появились в CPU Pentium.

>>> Подробности

★★★★★

Проверено: CrX ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от anonmyous

Хотя, конечно, всё равно не до конца понятно, чем их 4-байтная не устроила. Поинтер-то свапнуть уже можно, и, вроде как, норм…

Ядро же не на Java, не на C# и не на Rust написано, и для обхода той же ABA-проблемы потребуется городить эмуляцию 8-байтной операции CAS, так как остальной код наверняка использует lock-free структуры со счётчиками. Насколько я понял, именно код эмуляции и устали поддерживать.

QsUPt7S ★★★
()
Ответ на: комментарий от Rost

владельцы классических 486 кроме доса на них ничего не запускают, максимум вин95. линукс, даже древний, там сильно тормозит. а современный так вообще не запустится из-за малого количества озу

Так тема вообще не из-за них, про классические 486 уже давно все забыли. Но полно более современных промышленных решений на 486-х, скорее их клонах, вроде Vortex 86 Embedded c архитектурой 486 и SoC. Небольшое энергопотребление, размеры и стоимость. Памяти на таких платах может быть несколько сот Мб.

praseodim ★★★★★
()
Ответ на: комментарий от QsUPt7S

Насколько я понял, именно код эмуляции и устали поддерживать.

Кстати, а как так получается, что код эмуляции пары процессорных инструкций в общей сложности - это 14 тысяч строк кода? Не дохрена ли

praseodim ★★★★★
()
Ответ на: комментарий от Rost

даже древний, там сильно тормозит. а современный так вообще не запустится из-за малого количества озу

Вика говорит, что максимальный объём виртуального адресного пространства у 486 - 2^46 байт, а разрядность шины адреса - 32 бита. Значит, теоретически, могут быть машины и с 4GiB RAM, не включая swap, а этого современным ядрам ещё хватает.

QsUPt7S ★★★
()
Ответ на: комментарий от QsUPt7S

Не теоретически, а есть. Не знаю правда с 4 Гб или нет, но с 128 Мб и более точно есть. Промышленные embedded решения на SoC типа Vortex86, которые по архитектуре совместимы с 486-ми. Вполне современные платы с ними спокойно можно купить.

praseodim ★★★★★
()
Последнее исправление: praseodim (всего исправлений: 1)
Ответ на: комментарий от praseodim

Кстати, а как так получается, что код эмуляции пары процессорных инструкций в общей сложности - это 14 тысяч строк кода? Не дохрена ли

Действительно. Но непосредственно эмуляция 8-байтной CAS - это 97 строк. Большая часть остального, если судить по именам предлагаемых к удалению файлов, относится к эмуляции чего-то из FPU…

QsUPt7S ★★★
()
Ответ на: комментарий от QsUPt7S

Ядро же не на Java, не на C# и не на Rust написано, и для обхода той же ABA-проблемы потребуется городить эмуляцию

Мда, слаб я в хайлоаде… Спасибо, прочитал про ABA. Там, до кучи, упоминалось и то, что, вообще-то, списки 2ной связности тоже никто не отменял, а им надо свапать 2 поинтера.

anonmyous ★★
()
Ответ на: комментарий от QsUPt7S

Вика говорит, что максимальный объём виртуального адресного пространства у 486 - 2^46 байт

Это как? Можно ли ссылку на это утверждение?

anonmyous ★★
()
Ответ на: комментарий от QsUPt7S

Да не чего-то из FPU, а FPU вообще. 486 - последний проц, который мог быть без FPU.

firkax ★★★★★
()
Ответ на: комментарий от anonmyous

14 бит селектор, 32 бита смещение. Оно не линейное, нарезано на сегменты по 4гб, и на самом деле 4гб сегменты использовать в таком режиме не получится (их можно свапать только целиком, и 1 сегмент тогда займёт всё линейное адресное пространство и дальше ничего не сделать будет), так что на самом деле следует ещё где-то хотя бы 4 бита снять. Итого выходит где-то 42 бита. Ещё есть резон поделить на два (остаётся 41 бит - это 2 терабайта всего) т.к. половина этих адресов общесистемная, и только другая половина приватная для процесса.

Эта механика не специфична для 486, она одинаковая для всех x86-32, а так же для x86-64 когда они в 32-битном режиме.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

14 бит селектор, 32 бита смещение.

Так это же фейковая хрень. Там же, по-моему, если база+смещение переваливало за разрядность шины (32 бита), то просто адрес обрезался, и начинался с 0. То есть, в отличии от HMA, где реально можно было выйти за пределы 1го мега, тут-то никуда выйти, по факту, не получалось? Или я совсем всё забыл?

anonmyous ★★
()
Ответ на: комментарий от anonmyous

Это как? Можно ли ссылку на это утверждение?

Intel 80486 - Технические характеристики (сводно):

  • Разрядность регистров: 32 бита
  • Разрядность внешней шины данных: 32 бита
  • Разрядность внешней шины адреса: 32 бита
  • Объём виртуальной адресуемой памяти: 64 Тб (2^46)
QsUPt7S ★★★
()
Ответ на: комментарий от anonmyous

Это не про физическую память, там же написано что виртуальная. База тут ни при чём, очевидно что одновременно эти терабайты в физическую память не влезут и большая их часть будет в свапе.

firkax ★★★★★
()
Ответ на: комментарий от anonmyous

Так это же фейковая хрень.

Так страничный режим появился ещё в 386, и виртуальная память через него реализовывалась, а не через сегментную модель.

QsUPt7S ★★★
()
Последнее исправление: QsUPt7S (всего исправлений: 1)
Ответ на: комментарий от QsUPt7S

Страничная трансляция тут ни при чём, она адресует линейные 4гб. Большая виртуальная память именно через сегменты и их свап делается. Если у проца есть PAE и много физической памяти (которой хватает) - то можно их свапать за пределы 4гб не выгружая на диск, но одновременно «в наличии» показывать не больше 4гб.

firkax ★★★★★
()
Ответ на: комментарий от pihter

Ну в очень секретных местах есть, да :) Не удивлюсь, если ключи шифрования для ЗАС-терминалов до сих пор на перфолентах распространяются.

gns ★★★★★
()
Последнее исправление: gns (всего исправлений: 1)
Ответ на: комментарий от QsUPt7S

Объём виртуальной адресуемой памяти: 64 Тб (2^46)

Да ну, бредятина. И в английской версии вики такого нет. Да, поинтер такой длины можно создать, но никакую память он реально не адресует, так как адрес просто врапается по 32 битам. Думаю, это какой-то «умник» переводил.

И да, сходил по ссылке, на которую они указывают. Там именно это и говорится: https://theretroweb.com/misc/documentation/i486-microprocessor-data-sheet-apr89-661908936fa46960543494.pdf

Since each task on the 486 Microproces-
sor has a maximum of 16K (2 14 -1) selectors, and
offsets can be 4 gigabytes, (2 32 bits) this gives a
total of 246 bits or 64 terabytes of logical address
space per task. The programmer sees this virtual
address space.

The segmentation unit translates the logical ad-
dress space into a 32-bit linear address space. 

Горе-переводчик упустил эту последнюю фразу, и решил, что logical address space - это объём виртуальной памяти… А это просто размер поинтера, который тут же обрезается до 32бит.

anonmyous ★★
()
Ответ на: комментарий от firkax

Это не про физическую память, там же написано что виртуальная.

Нет, в том то и дело. Это и не виртуальная тоже. Пример: вы получили пэйдж фолт, обратившись к этим «верхним» адресам. Только у вас даже cr2 32битный, так что вы даже не сможете узнать, какой конкретно адрес фолтанул, чтобы его примапить.

Это не виртуальная память, это чистый фейк.

anonmyous ★★
()
Ответ на: комментарий от QsUPt7S

Так страничный режим появился ещё в 386

… и был 32битным. И ни копейкой больше.

anonmyous ★★
()
Ответ на: комментарий от firkax

Большая виртуальная память именно через сегменты и их свап делается.

Как делается? Вы где в обработчике фолта посмотрите адрес фолта полный, а не его 32 бита?

anonmyous ★★
()
Последнее исправление: anonmyous (всего исправлений: 1)
Ответ на: комментарий от anonmyous

Причём тут пейдж фолт? Повторю ещё раз, речь не про страничную адресацию и не про линейные адреса. Повторю ещё раз, очевидно терабайты данных в физическую память не влезут и часть из них будет в свапе.

Свап, если что - это не какие-то страницы «за пределами 4гб» (таких не бывает), это флаг «сегмент отсутствует» в дескрипторе.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Повторю ещё раз, очевидно терабайты данных в физическую память не влезут и часть из них будет в свапе.

Вы покажите пример, как вы подсвапите их обратно. Если полный адрес фолта вам ни где не доступен.

anonmyous ★★
()
Ответ на: комментарий от anonmyous

Нет никакого фолта, обращение не доходит до страниц вообще. Всё происходит в рамках виртуального адреса (селектор:смещение). Сегмент никуда не замаплен, базового адреса у него вообще нет. Выбрасывается исключение «сегмент отсутствует» (вроде int12) и даётся его селектор. ОС обеспечивает доступность сегмента в линейной памяти (возможно, выгружая какие-то другие), прописывает в селектор базовый адрес и переключает флаг его доступности.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Свап, если что - это не какие-то страницы «за пределами 4гб» (таких не бывает), это флаг «сегмент отсутствует» в дескрипторе.

Так ему вообще можно ставить бит присутствия то? Если он у вас хоть в какой-то момент времени присутствует, то исключения не будет, и он обратится по урезанному адресу.

Или вы имеете в виду, ВСЕГДА ставить таким дескрипторам бит отсутствия, и тупо эмулировать каждое обращение к памяти?

anonmyous ★★
()
Ответ на: комментарий от firkax

ОС обеспечивает доступность сегмента в линейной памяти (возможно, выгружая какие-то другие), прописывает в селектор базовый адрес и переключает флаг его доступности.

И что толку? Если он все другие сегменты перекрывает собой. Ведь теперь надо вообще все обращения к нему трапать, чтобы не схватить то, что какой-то другой сегмент тоже покрывает.

anonmyous ★★
()
Ответ на: комментарий от anonmyous

Если он все другие сегменты перекрывает собой

Не «перекрывает» а выгружает. У выгруженного сегмента нет базового адреса. И не «все другие», а только некоторое их количество, нужное чтобы расчистить место для того который мы сейчас сделаем доступным. Я в самом начале писал, что сегменты по 4гб и правда неудобно, для нормальной работы они должны быть поменьше. По 256мб уже можно нормально использовать, один замапил, другой выгрузил.

все обращения к нему трапать,

Трапаются только обращения к выгруженным - при первом к ним обращении.

Это ж основы работы свапа, как можно этого не знать?

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Не «перекрывает» а выгружает. У выгруженного сегмента нет базового адреса. И не «все другие», а только некоторое их

Я имею в виду, что у нормальной проги есть парочка флат-сегментов на 4 гига. И не такие, которые помечены как отсутствующие, а обычные. В вашей схеме такие, очевидно, нельзя применять, даже вне этого свапинга. Их вообще быть не должно. Все перманентные сегменты должны быть урезаны чтобы не залезать на окно свапинга. Ну и сами сегменты свапинга - тоже урезаны до размеров этого окна.

Да, понял идею, грандиозно. :) Кстати, в селекторах, по-моему, 3 бита служебных, а не 2. Так что ещё меньше выйдет по факту.

anonmyous ★★
()
Ответ на: комментарий от firkax

Трапаются только обращения к выгруженным - при первом к ним обращении.

Это ж основы работы свапа, как можно этого не знать?

Основы заключаются в том, что у вас не происходит перекрытия с другими сегментами. А здесь это не так, и если у вас есть флат-сегменты, то придётся уже трапать каждое обращение. А вот если их нет… ну тогда не придётся. :)

anonmyous ★★
()
Ответ на: комментарий от anonmyous

Ты пытаешься натянуть флат-привычки на сегментную модель памяти. Не надо так делать. В сегментной модели никаких 4гб-сегментов нет по множеству причин. Есть сегмент данных (его размер меняется сисколлом sbrk если речь про юниксы), есть дополнительные сегменты разных размеров - пример аналог того что mmap возвращает. Ты пробовал сделать 4-гиговый mmap в 32-битной проге? Очевидно, он зафейлится.

перманентные сегменты

Ну и сами сегменты свапинга - тоже урезаны до размеров этого окна.

Нет никаких «перманентных сегментов» и «сегментов сваппинга», выгружен может быть любой сегмент, кроме тех которые нужны для работы ядерного менеджера памяти. Разумеется, разумная ОС будет выгружать в первую очередь те которые не пользуются частым спросом.

Да, понял идею, грандиозно

Я ничего особенного не рассказал, это штатная работа защищённого режима x86 с сегментной памятью и свапом.

Кстати, в селекторах, по-моему, 3 бита служебных, а не 2.

Один бит то служебный, но он тоже адресный. Неадресных только два. А так, я об этом тоже писал в самом начале:

половина этих адресов общесистемная, и только другая половина приватная для процесса

firkax ★★★★★
()
Ответ на: комментарий от firkax

Нет никаких «перманентных сегментов» и «сегментов сваппинга», выгружен может быть любой сегмент

Любой, да не любой. Вам надо исключить пересечения в каждый конкретный момент времени. Или имеется в виду, что у вас сегменты подгружаются каждый раз по разным адресам, и база всякий раз выставляется динамически? А чёрт, точно…

Я ничего особенного не рассказал, это штатная работа защищённого режима x86 с сегментной памятью и свапом.

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

anonmyous ★★
()
Ответ на: комментарий от anonmyous

Тут как раз разницы нет. Сегмент с нужным селектором может загружаться в любое место линейного адресного пространства, а страница с нужным линейным адресом может загружаться в любое место физической памяти.

firkax ★★★★★
()
Ответ на: комментарий от gns

На марсоходах разное, но всё это Mips+vxWorks. Об этом писали.

i386 если и было, то какая-то редкая экзотика, вообще не слышал о таком.

Про китайцев не знаю, но у нас mips, и у американцев тоже Mips и PowerPC.

https://ru.wikipedia.org/wiki/RAD750

frost_ii ★★★★★
()
Последнее исправление: frost_ii (всего исправлений: 2)
Ответ на: комментарий от firkax

Тут как раз разницы нет.

Да, в случае, когда сегменты не пересекаются - всё так. При том, что они даже в риалмоде пересекаются. То есть, такое их состояние (без пересечений) не казалось мне «обычным» для какой-либо из существующих ОСей. Осталось только понять, какие конкретно ОСи использовали технику, которую вы называете «обычной». И были ли такие вообще…

anonmyous ★★
()
Ответ на: комментарий от lenin386

Да, если совсем точно: Rise mP6. Я потому и сказал, что из подобного знаю только Vortex86, но это далеко не микроконтроллер.

CYB3R ★★★★★
()

Даже интересно, что конкретно они поддерживают в этой части? Переписывают каждый раз?

jackill ★★★★★
()
Ответ на: комментарий от firkax

Я ничего особенного не рассказал, это штатная работа защищённого режима x86 с сегментной памятью и свапом.

Я думаю, это все не имеет отношения к реальности. Вы предлагаете жонглировать сегментами в пол гига, да еще и 6ю сразу (по общему числу сег регов). Хотя у вас памяти в те годы было - 4-16Мб. То есть, чтобы такой механизм реализовать, вам понадобится еще и пейджинг, чтобы странички внутри этих сегментов тоже свапировать. Я уверен, что никто в здравом уме так не делал, так что не выдавайте это за стандартную практику.

anonmyous ★★
()
Ответ на: комментарий от gns

Какой-то RAD - это powerPC (RAD под разными номерами) Mongoose V и R3000 - чистый MIPS И то и другое vxWorks

древности на микроконтроллерах, самопальное на всём, что попало под руку, часто индустриальное, но в расчёт это не беру.

Российское - отечественная реинкарнация R3000 и микроконтроллерное

frost_ii ★★★★★
()
Ответ на: комментарий от CYB3R

Причём, интерестно, что это разработка National Semiconductor (поэтому и первые буквы в названии NS) и они уже были в 1997 году. А TI купил NS в 2011, но при этом когда-то давно TI сам выпускал нормальные 80486 процессоры, в socket 3. Получается, TI много лет вобще не беспокоило, что он может, но не выпускает 486 в виде микроконтроллера.

Где используют эти NS486SXF не знаю, нагуглил только хроматограф SIEMENS MAXUM II.

mky ★★★★★
()
Ответ на: комментарий от Rost

Запускал Xы на 6 МБ. Для просмотра картинок в PAW (power analysis workstation) нужно было. Правда использовалась версия от Acelerated-X. 6МБ всё-таки маловато было.

Evgueni ★★★★★
()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от mky

О как, а лицензия у них на х86 куда делась?

Была же у Intel, AMD,VIA (через покупку Cyrix и IDT), что-то ещё было в каком-то виде у Transmeta и NEC.

О, надо найти на даче ноутбук сони с crusoe, интересно, что туда можно сейчас поставить

One ★★★★★
()
Ответ на: комментарий от One

Похоже, лицензия растворилась вместе с Cyrix. Только сейчас узнал, оказывается, Texas Instruments, SGS Thomson и IBM выпускали процессоры по заказу Cyrix, но по контракту имели право продавать их под своим брендом. https://en.wikipedia.org/wiki/Cyrix_Cx486

А дальше вобще муть. Cyrix слилась с National Semiconductor, там она была выделена в отдельное подразделение Cyrix National Semiconductor и продана VIA. Но, при этом, что купил VIA непонятно, похоже, только имя. Инжинеры, создававшие Cx486 разбежались, лицензию на проц, похоже, NS придержал, раз выпускал NS486SXF. И NS ещё и новые разработки Cyrix придержал, MediaGX, переименованый в Geode, позже был продан AMD.

mky ★★★★★
()
Ответ на: комментарий от pihter

Ну а кто аппаратуру-то менял? Да и на чем еще? Пароль одноразовый, носитель уничтожать удобно.

gns ★★★★★
()
Ответ на: комментарий от anonmyous

Даже в текстовой консоли?

зависит от количества озу. нынешнее ядро очень громоздкое, я сомневаюсь что условные 8мб хватит для 6.13, даже если собрать ядро самому с минимум опций. с 16мб может и взлетит.

Rost ★★★★★
()
Ответ на: комментарий от Dimez

Джунов найму для перевоза.

Я возьмусь за 200к в год. Только можно авансом их получить? Экономия составит 1000%.

xwicked ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.