Почитал я идущие на форуме обсуждения и решил немного пофилософствовать на тему “С чего начать разработку ОС” :)
Думается, одна из важнейших ошибок самодеятельных разработчиков ОСей заключается в крайне расплывчатой формулировке самой задачи. Нередко хотят разработать систему, “чтоб была быстрой, надёжной и с красивым графическим интерфейсом”. Естественно, что такое “техническое задание” не слишком подходит для проектирования даже “Тетриса”. Отсюда мораль: конкретизируйте свои пожелания, отделите главное от второстепенного, определитесь с модулями системы, порядком их разработки.
Вторая проблема тесно связана с первой: новички в осеписании, даже если они являются довольно опытными программистами-“прикладниками”, нередко плохо себе представляют функции ОС и, как следствие, испытывают затруднения с “отделением мух от котлет”. К примеру, упомянутые пожелания к “красивому графическому интерфейсу” не имеют к созданию ОС практически никакого отношения! Думаю, всем известно, что в Linux есть как интерфейс командной строки (shell в разных вариантах), так и графический интерфейс (даже несколько, из коих наиболее распространёнными являются KDE и Gnome). Меньшее число людей знает, что и Windows может благополучно обойтись без графического рабочего стола, хотя для этого надо малость поизвращаться (рабочий стол Windows – это программа пользовательского режима, а отнюдь не какой-то компонент ядра, и поменять её труда не составляет). Но, наверное, в наше время мало кто представляет себе ОС, вообще лишённую с нынешней точки зрения пользовательского интерфейса :) А между тем таковые вполне могут существовать. Например, в 1960-е годы нередко использовался такой способ ввода заданий в машину: оператор помещает в устройство ввода с перфокарт колоду этих самых перфокарт, содержащих текст задания (операторы на языке управления заданиями плюс необходимые данные), нажимает на устройстве кнопку “Внимание”, после чего ОС, получив прерывание, считывает колоду и запускает задание на выполнение. Результаты, как правило, выводятся на печать. Тем не менее, на функциональности ядра системы пользовательский интерфейс не оказывает никакого влияния (точнее, лишь выдвигает к нему некие минимальные требования): все современные “фичи”, за исключением разве что PnP и сбережения электроэнергии, существовали уже в тех самых 1960-х годах (у ним относятся и многопроцессорные системы, и виртуальная память, и кэши для команд и данных, не говоря о более простых вещах вроде прерываний или прямого доступа к памяти – DMA). Выход здесь только один: знакомиться достаточно глубоко как с историей ОС, так и с современными системами. Например, совсем нелишне будет почитать “Внутреннее устройство Microsoft Windows”: по крайней мере, станет ясно, как некоторые важные вещи могут быть реализованы на практике.
Ещё одна загвоздка – слабое знакомство с аппаратной платформой. Чтобы создать ОС, недостаточно выучить ассемблер – необходимо достаточно хорошо понимать, как работает “железо” и как его программировать. Информации по этому вопросу много, но зачастую она не слишком хорошо структурирована или представлена фрагментарно. Например, весьма сложно добыть полные спецификации PCI, поскольку они являются платными (мне, например, официальная спецификация не попадалась ни разу). Здесь остаётся только читать, что есть (часто на английском), спрашивать на форумах и экспериментировать самому. (Кстати, вопрос навскидку для самопроверки: какая из многочисленных спецификаций описывает, как узнать объём и расположение областей памяти на обычном современном ПК? Лично я был несколько удивлён, когда докопался-таки до правильного ответа :) )
Ну и последнее. Разработка ОС – задача вполне посильная для одиночки, причём за разумное время (не больше одного-двух лет при условии посвящения этому одного-двух часов каждый день), но только в том случае, если этот одиночка не распыляется и обладает достаточной настойчивостью и терпением. Поэтому – ограничиваем круг задач и не пытаемся объять необъятное (можно вспомнить про поддержку периферии в Linux – хотя над этой системой работает толпа народу, поддержка по-прежнему иногда оставляет желать лучшего). В частности, если нет особых причин, нет смысла пытаться поддерживать старые процессоры (80386, к примеру) и древнюю периферию (не поддерживающие LBA жёсткие диски).
Если что упустил – жду кирпичей в свой адрес :)
Пы.Сы. Несмотря на несколько менторский тон, я не пытаюсь кого-то учить или выставлять себя особо умным -- у меня просто манера рассуждений такая :)
|