У меня нет 286, и я не собираюсь запускать Linux на одном. Однако, поскольку 286 имеет защищенный режим, почему часто говорится, что Linux требует 386 ЦП или выше?
Из http://tuxmobil.org/286_mobile.html кажется, что версия Linux ELKS может работать на 286, это правильно? Какие (если есть) изменения были сделаны, чтобы ядро могло работать на 286 процессоре?
Теперь очевидно, что я понимаю, что ядро, скомпилированное для 386, не может выполняться на 286 процессоре, который является 16-разрядным. Итак, мой вопрос: почему стандартное ядро Linux не может быть скомпилировано для 286, а затем выполнено на 286? Требуется ли Linux аппаратная поддержка VM86?
linux-kernel
hardware-compatibility
ioctlvoid
источник
источник
Ответы:
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-битных процессорах.
источник
В ядре есть части, написанные на ассемблере, и их придется переписать для поддержки 286.
Что касается ELKS, в своем FAQ они указывают, что это подмножество ядра Linux, так что, возможно, они перенесли только абсолютные потребности.
источник
Я думаю, что реальный ответ на мой вопрос заключается в следующем:
Каждая основная архитектура ЦП (или ее основная редакция) требует некоторого кода поддержки сборки в дополнение к коду C.
Даже если вы получите GCC для компиляции ядра Linux в 16-битный 286 машинный код, все равно будет отсутствовать необходимый 16-битный 286-совместимый код сборки.
Другими словами, ядро в лучшем случае будет построено только частично. Любой сборочный код для конкретной архитектуры не сможет быть собран, поскольку он просто не написан для этой архитектуры.
Исходя из этого, я предполагаю, что это именно то, что делают, например, ELKS и подобные проекты, когда внедряют Linux на 286 или другие архитектуры - они реализуют этот отсутствующий код поддержки сборки.
источник
80386 поддерживает разбиение на страницы в дополнение к сегментации памяти, в то время как 286 поддерживает только сегментацию памяти. Linux сильно зависит от поддержки подкачки, т. Е. Использует плоскую схему памяти, которая в основном устанавливает все регистры сегментов на 0, и использует подкачку для управления приложениями. Чтобы перенести Linux на 286, основному диспетчеру памяти необходим полный редизайн для работы в сегментированном режиме без подкачки страниц, что, вероятно, является большой работой.
источник
Я не сборщик, но в соответствии с этим :
386 представляет расширенный набор команд из 286, так что кто знает, насколько сложным будет порт. Очевидно, что почти никто не удосужился попробовать это ... Я думаю, вы можете спросить об этом людей ELKS.
источник
Основная причина в том, что первоначальный проект GNU был нацелен на 32-битные машины (например, рабочие среды Unix середины 1980-х годов), а не на поддержку чего-то меньшего, поэтому весь набор инструментов GNU был непригоден для генерации 16-битного кода. Портировать раннее ядро Linux с большим количеством сборок на 286 было бы проще, чем с любой другой целью портирования - если бы у GCC была возможность создавать код 286 в защищенном режиме. Но нацеливание GCC на защищенный режим 286 было бы огромным проектом для поддержки устаревшего процессора.
источник
Недавно ядро Linux отказалось от 386 в качестве поддерживаемой платформы, а ядро Linux НЕ поддерживает процессоры Intel 286. 80286 - это не 32-битный процессор, который требуется для загрузки.
источник
Linux x86 не может быть легко перенесен обратно на 80286, потому что это 16-битный процессор, а Linux x86 требует 32-битный процессор.
Точнее, регистры на 286 все еще были только 16-битными. Ни один из регистров EX не был доступен. Кроме того, сегменты памяти и смещения были все еще только 16-битными. Программы по-прежнему должны были иметь дело с ближним / дальним кодом и данными.
Это означает, что для Linux / 286 потребуется радикально другое ядро и пользовательский API, чем в Linux / 386. Каждый исходный файл сборки и многие исходные файлы C должны быть переписаны. Это было бы похоже на разницу между программированием для Win16 и Win32.
Короче говоря, вы не можете просто сказать GCC компилировать для другого процессора. Каждый бит кода должен быть переписан для 16-битной среды.
источник
Из того, что я прочитал, канонический способ заставить Linux работать на 80286 - это запустить его на виртуальной машине. Это то, что Фабрис Беллард сделал здесь . Вы должны внедрить виртуальную машину самостоятельно или портировать один.
источник