Linux на 286?

15

У меня нет 286, и я не собираюсь запускать Linux на одном. Однако, поскольку 286 имеет защищенный режим, почему часто говорится, что Linux требует 386 ЦП или выше?

Из http://tuxmobil.org/286_mobile.html кажется, что версия Linux ELKS может работать на 286, это правильно? Какие (если есть) изменения были сделаны, чтобы ядро ​​могло работать на 286 процессоре?

Теперь очевидно, что я понимаю, что ядро, скомпилированное для 386, не может выполняться на 286 процессоре, который является 16-разрядным. Итак, мой вопрос: почему стандартное ядро ​​Linux не может быть скомпилировано для 286, а затем выполнено на 286? Требуется ли Linux аппаратная поддержка VM86?

ioctlvoid
источник
6
16-разрядный - это перебор. 8-битных достаточно для запуска Linux. Смотрите проект Дмитрия Гринберга.
Марко
Minix работал на 8086 (8 бит, 128 КБ ОЗУ IIRC). Microsoft Xenix работала на 80286. Некоторые сумасшедшие души пытались запустить Linux в 8086 тоже (с некоторым успехом). Но нет, «полный опыт Linux» будет невозможен на такой ограниченной машине.
vonbrand
Вы можете использовать Linux для запуска на очень ограниченных устройствах. Но это не очень полезно, например, для настольного компьютера. Пока вы не заявите о своих целях, трудно сказать, является ли «Linux on 286» жизнеспособным для вас.
9000

Ответы:

4

286 защищенный режим (PM) принципиально отличается от того, что предлагает 386. Думайте о 286 PM как о прототипе, у которого было так много недостатков, что почти никто никогда не использовал его, и все это было полностью переработано с нуля для 386.

Он не использовал модель с плоской памятью, он использовал сегментированную модель, подобную реальному режиму, что означало, что вам приходилось прыгать через обручи для доступа к памяти в блоках размером более 64 КБ одновременно.

Это было полностью несовместимо со всеми (MS-DOS) программами, доступными в то время, поэтому, когда вы были в PM, вы не могли использовать ни одну из программ, к которым вы привыкли.

Вы также не сможете снова выйти из защищенного режима, пока не перезагрузите компьютер, поэтому производители придумали креативные решения, такие как установка флага в ОЗУ, а затем запись магического значения в контроллер клавиатуры, который щелкнул бы булавкой сброса на ЦП, чтобы перезагрузить компьютер. машина. Первое, что сделал бы BIOS, это обнаружил установленный ранее флаг, после чего он затем переключился бы на исходную программу вместо запуска процедуры POST, что позволило бы исходной программе продолжить работу после «выхода» из PM.

Это означало, что использование 286 PM не позволяло вам запускать обычные программы DOS без большого количества хитростей. В то время, когда были только программы для DOS, использование PM вообще не стоило усилий.

Так что работать с 286 PM оказалось сложнее, чем просто жить без него и полагаться на EMS и XMS для доступа к дополнительной памяти. Ряд 286 материнских плат имели поддержку чипсета для EMS, так что вы можете использовать всю дополнительную системную память без необходимости использования PM.

Intel признала эти недостатки и выпустила совершенно новый PM в 386. Модель с плоской памятью упрощает доступ к памяти объемом до 4 ГБ. Процессор может входить и выходить из PM с помощью пары инструкций, поэтому не требуется никаких неуклюжих протоколов перезагрузки. VM86 означает, что в большинстве случаев вам даже не нужно выходить из PM, вы можете запускать программы DOS, пока вы находитесь в PM.

Все эти улучшения означали, что 386 PM был не только более функциональным, но и значительно более совместимым.

Другими словами, единственное общее между защищенным режимом 286 и 386 - это имя. Вот почему операционные системы PM обычно 386 или новее. Добавление поддержки для 286 PM было бы совершенно независимым усилием, при котором мало или вообще не было кода, которым можно было бы поделиться с совершенно другим 386 PM.

Напротив, 386 PM работает практически одинаково вплоть до последнего из 32-битных процессоров, и даже выше, если вы запускаете 32-битное программное обеспечение на 64-битных процессорах.

Malvineous
источник
3

В ядре есть части, написанные на ассемблере, и их придется переписать для поддержки 286.

Что касается ELKS, в своем FAQ они указывают, что это подмножество ядра Linux, так что, возможно, они перенесли только абсолютные потребности.

Диди Коэн
источник
1
Был математический сопроцессор для 286, 80287.
Ренан
3

Я думаю, что реальный ответ на мой вопрос заключается в следующем:

Каждая основная архитектура ЦП (или ее основная редакция) требует некоторого кода поддержки сборки в дополнение к коду C.

Даже если вы получите GCC для компиляции ядра Linux в 16-битный 286 машинный код, все равно будет отсутствовать необходимый 16-битный 286-совместимый код сборки.

Другими словами, ядро ​​в лучшем случае будет построено только частично. Любой сборочный код для конкретной архитектуры не сможет быть собран, поскольку он просто не написан для этой архитектуры.

Исходя из этого, я предполагаю, что это именно то, что делают, например, ELKS и подобные проекты, когда внедряют Linux на 286 или другие архитектуры - они реализуют этот отсутствующий код поддержки сборки.

ioctlvoid
источник
3

80386 поддерживает разбиение на страницы в дополнение к сегментации памяти, в то время как 286 поддерживает только сегментацию памяти. Linux сильно зависит от поддержки подкачки, т. Е. Использует плоскую схему памяти, которая в основном устанавливает все регистры сегментов на 0, и использует подкачку для управления приложениями. Чтобы перенести Linux на 286, основному диспетчеру памяти необходим полный редизайн для работы в сегментированном режиме без подкачки страниц, что, вероятно, является большой работой.

Ревант Камарадж
источник
2

Требуется ли Linux аппаратная поддержка VM86?

Я не сборщик, но в соответствии с этим :

Поскольку исходная реализация 32-разрядного расширения архитектуры 8086, набор команд 80386, модель программирования и двоичные кодировки по-прежнему являются общим знаменателем для всех 32-разрядных процессоров x86, это называется x86, IA-32 или i386. -архитектура в зависимости от контекста.

386 представляет расширенный набор команд из 286, так что кто знает, насколько сложным будет порт. Очевидно, что почти никто не удосужился попробовать это ... Я думаю, вы можете спросить об этом людей ELKS.

лютик золотистый
источник
2

Основная причина в том, что первоначальный проект GNU был нацелен на 32-битные машины (например, рабочие среды Unix середины 1980-х годов), а не на поддержку чего-то меньшего, поэтому весь набор инструментов GNU был непригоден для генерации 16-битного кода. Портировать раннее ядро ​​Linux с большим количеством сборок на 286 было бы проще, чем с любой другой целью портирования - если бы у GCC была возможность создавать код 286 в защищенном режиме. Но нацеливание GCC на защищенный режим 286 было бы огромным проектом для поддержки устаревшего процессора.

Лунатик
источник
1

Недавно ядро ​​Linux отказалось от 386 в качестве поддерживаемой платформы, а ядро ​​Linux НЕ поддерживает процессоры Intel 286. 80286 - это не 32-битный процессор, который требуется для загрузки.

Flukas88
источник
5
Первоначально Linux был написан на 386 в 1991 году. К тому времени 286 уже были старыми, и у основного дерева ядра никогда не было бэкпорт-кода для поддержки 286.
Flukas88
Это может быть, но вопрос все еще был, почему это так? Не то, почему было принято решение отказаться от поддержки 286/386 (что очевидно), но каковы технические причины, по которым поддержка такого старого процессора не может быть легко осуществлена. Т.е. почему ядру требуется 32-битный процессор? Почему ядро ​​не может быть скомпилировано для 286?
ioctlvoid
Разве у ядра также не было арифметического сопроцессора, как его требования?
Бонси Скотт
Нет, ядро ​​поддерживает математическую эмуляцию, по крайней мере, раньше. Следовательно, вы даже можете запустить ядро ​​Linux на процессоре с неисправным FPU. Тем не менее, 286 все еще поддерживал математический сопроцессор,
80287.
В отредактированной части моего ответа я указал, что эмуляция реализована в ядре Linux. Он даже использовался для портирования Linux на S / 390 (он же IBM Mainframe), так как на момент его портирования у него не было модуля с плавающей запятой.
Диди Кохен
1

Linux x86 не может быть легко перенесен обратно на 80286, потому что это 16-битный процессор, а Linux x86 требует 32-битный процессор.

Точнее, регистры на 286 все еще были только 16-битными. Ни один из регистров EX не был доступен. Кроме того, сегменты памяти и смещения были все еще только 16-битными. Программы по-прежнему должны были иметь дело с ближним / дальним кодом и данными.

Это означает, что для Linux / 286 потребуется радикально другое ядро ​​и пользовательский API, чем в Linux / 386. Каждый исходный файл сборки и многие исходные файлы C должны быть переписаны. Это было бы похоже на разницу между программированием для Win16 и Win32.

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

toejam
источник
1
Пожалуйста, рассмотрите использование уценки для повышения читаемости.
lord.garbage
0

Из того, что я прочитал, канонический способ заставить Linux работать на 80286 - это запустить его на виртуальной машине. Это то, что Фабрис Беллард сделал здесь . Вы должны внедрить виртуальную машину самостоятельно или портировать один.

user1095108
источник