Строго ли требуется сборка, чтобы сделать "низшую" часть операционной системы?

Я программист среднего уровня (абстракция), и несколько месяцев назад я начал думать, стоит ли мне уменьшать или увеличивать абстракцию (я решил уменьшить).

Теперь, я думаю, что я провел большую часть "исследований" о том, что мне нужно, но все еще осталось несколько вопросов.

Прямо сейчас, пока я "эффективно ничего не делаю", я просто укрепляю свои навыки C (купил "K&R C Programing Lang") и думаю (после того, как почувствую себя комфортно) начать изучать операционные системы (например, minix) только для целей обучения, но я В моей голове застряла идея, и я не знаю, стоит ли мне волноваться.

Теоретически (я думаю, не уверен), языки более высокого уровня не могут напрямую ссылаться на аппаратное обеспечение (например, регистры, ячейки памяти и т. Д.), Поэтому "идеальным языком" для базы будет ассемблер.

Я уже изучал ассемблер (некоторое время назад) только для того, чтобы увидеть, как это было (и я остановился в середине книги из-за устаревшего отладчика, который использовалась в книге (Assembly Language Step By Step, для Linux!)), Но из того, что я прочитал, мне не очень понравился язык.

Таким образом, вопрос прост: можно ли программировать операционную систему (загрузчик / ядро), не касаясь одной строки сборки, и при этом оставаться эффективной?

Даже если это возможно, это не будет "кросс-архитектура", не так ли? (i386/arm/mips и т.д...)

Спасибо за вашу поддержку

3 ответа

Решение

Вы можете сделать значительный объем работы без сборки. Linux или NetBSD не нужно полностью переписывать или исправлять для каждой из множества целей, на которых он работает. Большая часть кода является переносимой, а затем есть уровни абстракции, а ниже уровня абстракции вы найдете целевой целевой уровень. Даже в целевых слоях большая часть кода не является asm. Я хочу развеять эту ошибочную идею о том, что для программирования регистров или памяти для драйвера устройства, например, который вам нужен asm, вы не используете asm для таких вещей. Вы используете asm для 1) инструкций, которые есть у процессора, которые вы не можете выдавать на языке высокого уровня. или 2) где код, генерируемый языком высокого уровня, слишком медленный. Например, в ARM для включения или отключения прерываний есть специальная инструкция для доступа к регистрам состояния процессора, которые вы должны использовать, поэтому требуется asm. но программирование контроллера прерываний выполняется на языке высокого уровня. Примером второго момента является то, что вы часто обнаруживаете в библиотеках C, что memcpy и другие подобные часто используемые библиотечные функции кодируются вручную, поскольку это значительно быстрее.

Хотя вы, безусловно, МОЖЕТЕ писать и делать все, что вы хотите в ASM, но обычно вы обнаруживаете, что язык высокого уровня используется для доступа к "аппаратному обеспечению напрямую (например, регистрам, ячейкам памяти и т. Д.)". Вы должны продолжать пересматривать свои навыки C не только с помощью книги K&R, но и бродить по различным стандартам C, вы можете столкнуться с беспокойством по поводу того, сколько существует "определяемых реализацией" элементов, таких как битовые поля, как используются переменные размеры и т. Д. То, что программа, которую вы написали 10 лет назад, продолжает компилироваться и работать с использованием компилятора определенной марки (msvc, gcc и т. Д.), Не означает, что код является чистым и переносимым и будет продолжать работать. К сожалению, gcc научил многих очень плохим привычкам программирования, которые шокируют пользователя, когда они узнают, что они не знали язык десять лет или около того, и им пришлось переделать, как они решают проблемы, используя этот язык.

Вы сами ответили на свой вопрос в "Языки более высокого уровня не могут напрямую обращаться к оборудованию".

Хотите вы этого или нет, в какой-то момент вам придется иметь дело со сборкой / машинным кодом, если вы хотите создать ОС.

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

Чему я научился в прошлом, читая веб-сайты и книги, так это: а) многим программистам не нравится язык ассемблера по причинам, которые мы все знаем. б) основным языком программирования для ОС кажется C и даже C++; в) язык ассемблера можно использовать для "ускорения кода" после профилирования исходного кода на C или C++ (язык на самом деле не имеет значения)

Таким образом, сочетание языка среднего уровня и языка низкого уровня в некоторых случаях неизбежно. Например, нет смысла ускорять код для ожидания при вводе пользователем. Если важно создать самый короткий и быстрый код для одного конкретного диапазона компьютеров (AMD, INTEL, ARM, DIGITAL-ALPHA, ...), тогда вам следует использовать ассемблер. Мое мнение...

Другие вопросы по тегам