Для ядра/ОС все еще C?

Мне нравятся операционные системы, и в конечном итоге я хотел бы стать разработчиком ОС, в основном работающим над ядрами. Будет ли в будущем C по-прежнему предпочтительным языком, и что еще я должен попытаться выучить?


person Recursion    schedule 14.05.2009    source источник
comment
Все, ОСТОРОЖНО кажется нечестивым упоминать язык ассемблера в ответах на этот пост, и кто-то, кто не понял этого вопроса должным образом, просто упал - голосование. Я подозреваю, что это Коди.. LOL   -  person Alphaneo    schedule 14.05.2009
comment
Это потому, что язык ассемблера не поддерживает (в общем) для написания целых ядер. Поднять уровень абстракции - это путь.   -  person Chris Jester-Young    schedule 14.05.2009
comment
@Chris, ты ошибаешься, сборка была для какой-то части ядра.   -  person Alphaneo    schedule 14.05.2009
comment
Некоторые детали нужно использовать в сборе, да. Но как можно меньше; вы хотите использовать язык более высокого уровня для максимально возможной части системы.   -  person Chris Jester-Young    schedule 14.05.2009
comment
@Chris, никакая часть /не требуется/ для использования сборки - не напрямую. Вы можете написать каждый отдельный фрагмент кода, от POST до рабочего стола, в управляемом коде и AOTC. Единственный фрагмент кода, который должен когда-либо напрямую касаться машинного кода, — это компилятор.   -  person Serafina Brocious    schedule 14.05.2009
comment
Хах, как красиво на это смотреть! Я предполагаю, что моя проблема в том, что я не имел дело ни с одним языком (управляемым или нет), который имеет дело с привилегированными инструкциями (за исключением любого встроенного ассемблера, который может быть написан).   -  person Chris Jester-Young    schedule 14.05.2009
comment
Вы обрабатываете привилегированные инструкции через встроенные функции компилятора, например. вы создаете метод-заглушку «rdtsc» в своем управляемом коде, который при вызове становится инструкцией «rdtsc» в испускаемом коде. Очевидно, это можно полностью проверить на безопасность, как и любой управляемый код.   -  person Serafina Brocious    schedule 14.05.2009


Ответы (17)


Я думаю, можно с уверенностью сказать, что низкоуровневые части операционных систем (например, ядро) будут продолжать писаться на C из-за его скорости. Как упоминалось в другом месте, вам нужно знать ассемблер для определенных частей ядра (что-то нужно для загрузки ядра в память). Но вы можете работать над ядром, практически не зная ассемблера. Хорошим примером может быть, если вы реализуете файловую систему.

Не беспокойтесь о том, на каком языке реализована операционная система. Важно то, как используются операционные системы и что можно сделать для их улучшения. Хорошим примером является время, когда впервые появилась Unix. В файловой системе индексные дескрипторы располагались в передней части диска, а данные — в оставшемся пространстве. Это работало не очень хорошо, так как вы искали разные части диска для всех файлов. Затем была создана Быстрая файловая система Berkeley, чтобы создать файловую систему с поддержкой дисков. Это означает наличие инодов рядом с соответствующими им данными. Я опускаю многие детали, но надеюсь, это показывает, что важнее думать о том, как можно улучшить операционную систему, а не о том, на каком языке она будет программироваться.

Некоторыми последними тенденциями в операционных системах являются виртуализация и распределенные вычисления (см. документ Google по MapReduce). Файловые системы, безопасность, планирование (особенно с многоядерными процессорами) и т. д. постоянно вызывают интерес, хотя эти проблемы не новы.

Вот некоторые ресурсы, если вы хотите узнать больше о разработке ядра:

  • Linux Kernel Newbies — ресурс для тех, кто хочет начать модифицировать ядро ​​Linux.
  • исходный код xv6 — порт Unix версии 6 для x86 , Используется Массачусетским технологическим институтом для проведения занятий по операционным системам. Простота и легкость расширения (дополнительная информация).
  • Карта ядра Linux — цепочка вызовов системных вызовов в Linux. Полезно для визуализации того, что делает системный вызов.

Итог: начните знакомиться с ядром и читайте документы о том, о чем пишут исследователи (для этого полезен USENIX). ). Это знание гораздо более ценно, чем изучение нового языка, поскольку большинство концепций из одного языка можно легко перенести на другой, если случится изменение в написании операционных систем. Надеюсь это поможет!

person mgriepentrog    schedule 14.05.2009
comment
Это игнорирует все исследования управляемых ядер, на которые ссылается Крис. Кроме того, приверженность C не имеет ничего общего со скоростью (Singularity доказала, что управляемая ОС работает намного быстрее благодаря безопасности управляемого кода), а имеет отношение к тому, чтобы быть стандартом. - person Serafina Brocious; 14.05.2009
comment
Я упомянул C, потому что он все еще довольно распространен, и не помешает узнать, если он еще этого не сделал. Я не пытаюсь утверждать, что это быстрее или лучше. Основная цель моего поста — акцентировать внимание на том, что исследуется (включая управляемые ядра), и на том, как работает ядро. - person mgriepentrog; 14.05.2009
comment
Почему люди продолжают говорить, что Singularity доказала, что управляемая ОС работает намного, намного быстрее. Похоже, что было проведено очень ограниченное тестирование производительности. Запустите полноценное приложение, такое как Oracle RDBMS, через все популярные тесты в такой ОС, и оно будет более убедительным. Некоторые приложения делают такие вещи, как выравнивание данных по строкам кэша, чтобы смягчить ложное совместное использование. Как бы вы это сделали, работая на такой ОС, как Singularity? - person RussellH; 25.09.2009

Исследователи проявляют большой интерес к использованию языковых технологий, чтобы гарантировать, что ядро ​​не может вести себя неправильно. Несколько человек упомянули проект Singularity, который в настоящее время имеет (заслуженно ) Высокий профиль. Чем интересна сингулярность?

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

  • Сторонним драйверам предоставляется ограниченный интерфейс к системе. Проверка, проводимая компилятором, гарантирует, что плохой драйвер не может вывести систему из строя — самое худшее, что он может сделать, это вывести из строя собственное устройство.

  • Singularity использует технологию компиляции, а не технологию OS/MMU, чтобы изолировать один «процесс» от другого. Внезапно разветвляется новый «процесс» (действительно новый вид защитный домен) очень дешев, и эта дешевизна позволяет создавать новые конструкции.

Singularity — лишь последний из длинного списка проектов, в которых для решения проблем ОС использовались технологии языка и компилятора. Одним из моих любимых было ядро SPIN Вашингтонского университета, которое позволяло приложениям безопасно расширять ядро. и был написан на Модуле-3.

Эта область исследований все еще широко открыта, и еще не известно, какой набор функций языка или компилятора является "золотым пятном" для решения проблем с ОС. Итак, чтобы ответить на ваш вопрос:

  • В сегодняшних производственных системах C по-прежнему является "этим".

  • Для операционных систем будущего C почти наверняка не является «этим», мы знаем, что его можно сделать намного лучше, но точная природа нового «этого» все еще остается открытым вопросом.

person Norman Ramsey    schedule 14.05.2009
comment
+1. Я бы проголосовал за это дюжину раз, если бы была возможность. - person Serafina Brocious; 14.05.2009
comment
Для работы управляемого кода требуется виртуальная машина, которая должна быть создана на языке, способном компилироваться в объектный код. По сути, сингулярность аналогична стандартному дизайну микроядра. с виртуальной машиной вместо ядра и серверов, реализованных в управляемом коде. - person Jay Dubya; 14.05.2009
comment
Нет никаких причин, по которым виртуальная машина с управляемым кодом не может быть написана в самом управляемом коде с нуля. Вы можете заранее скомпилировать управляемый код в машинный код, а затем начать загрузку оттуда. Такой подход используют SharpOS, Cosmos, MOSA и Renraku. - person Serafina Brocious; 14.05.2009
comment
@Jay: вы можете проверить язык Дэна Гроссмана «Cyclone», который является монстром Франкштейна, но предоставляет своего рода «управляемый» код без виртуальной машины — он компилируется непосредственно в ассемблерный код (возможно, типизированный ассемблер). Это язык, а не ОС, и он немного чудовищен, но он дает представление о возможностях, выходящих за рамки простой виртуальной машины. - person Norman Ramsey; 15.05.2009
comment
@Cody, Norman: Только что просмотрел статьи в Википедии для SharpOS и cyclone, они компилируют байт-код своего ядра в объектный код, чтобы позволить машине загружаться с него, что я и пытался сделать. с основным модулем в объектном коде, который поддерживает остальную часть ОС. - person Jay Dubya; 15.05.2009
comment
@Jay: кажется, я понимаю твою точку зрения. Не знаю насчет SharpOS, но Cyclone компилирует все в ассемблерный код. Виртуальной машины нет, поэтому управление кодом не требует запуска виртуальной машины. В случае с Cyclone проверка типов обеспечивает те же гарантии, которые в других системах предоставляет виртуальная машина. - person Norman Ramsey; 16.05.2009
comment
@Norman: Насколько я понимаю, управляемый код относится к коду, который был скомпилирован для целевой виртуальной машины Microsoft. Я пытался подчеркнуть, что после компиляции в объектный код это неприменимо. Любая дополнительная безопасность или надежность, обеспечиваемая средой VM, является спорной. Знаете ли вы, превосходит ли проверка типов во время компиляции ту, что выполняется в С++? - person Jay Dubya; 19.05.2009
comment
С первым пунктом согласен, со вторым нет. Хотел бы я согласиться. C отстой, и, вероятно, он единолично отвечает за большинство проблем безопасности. Но я не вижу свидетельств того, что кто-то пытается использовать что-то лучшее для серьезной разработки ОС. - person T.E.D.; 27.08.2009
comment
@Jay: Да, проверка типов во время компиляции лучше, чем в C++. Например, это может гарантировать отсутствие ошибок указателя. - person Norman Ramsey; 14.03.2010

Коди не хотел утруждать себя ответом, поэтому я передаю это от его имени. :-P Некоторые примеры ОС, написанных на управляемых языках, а не на C или ассемблере, см. здесь:

Разумеется, Коди тоже не хотел упоминать об этом:

person Chris Jester-Young    schedule 14.05.2009
comment
Не решает вопрос. Это ОС, а не языки программирования. - person T.E.D.; 27.08.2009
comment
Кроме того, они демонстрируют, что (в силу того, что все они написаны на управляемом языке) нет необходимости писать ОС на C или ассемблере, и что ее можно написать (в некоторых случаях, включая начальную стадию загрузки) полностью на управляемом языке. язык. - person Chris Jester-Young; 28.08.2009
comment
SharpOS и Cosmos написаны на C#. Renraku, насколько я слышал, написан на Boo. С остальными вам придется разбираться самостоятельно. :-П - person Chris Jester-Young; 28.08.2009
comment
Хорошо, теперь я вижу, к чему ты клонишь. Переместите эти комментарии в ответ, и я заберу свой отрицательный голос. - person T.E.D.; 01.09.2009
comment
Вероятно, уже слишком поздно, чтобы отменить голосование против (у вас есть только небольшое окно времени, чтобы отменить голосование, чтобы люди не играли в систему), но я все равно отредактирую пост. - person Chris Jester-Young; 02.09.2009
comment
Суть в том, что все, кроме Singularity, нацелены на полностью управляемый конвейер и кодовую базу на основе стандарта CIL. Насколько мне известно, Singularity использует ядро ​​на основе C++. - person Dykam; 26.02.2010

C - это почти все, с изрядным количеством ассемблера. Важные темы для работы с ядром ОС включают:

  • Принципы кэширования и управления кэшем
  • Виртуальная память, управление TLB
  • Процессор и системная архитектура
  • Иерархии хранения
  • Методы параллельного программирования (взаимное исключение, блокировка и т. д.)
  • Алгоритмы и структуры данных
person Lance Richardson    schedule 14.05.2009
comment
Ну, я это знаю, мне просто интересно будущее ОС в целом. вы знаете, как облачные ОС и прочее, это все еще будет C. - person Recursion; 14.05.2009
comment
@unknown google, я думаю, Лэнс говорит о ядре, а не об ОС. Ядро будет написано в основном на C, даже для вашего так называемого Облака. - person Alphaneo; 14.05.2009
comment
Не волнуйся. Облачные ОС по-прежнему написаны на C (по крайней мере, на низких уровнях). Программистам C просто не разрешают выступать на пресс-конференциях. - person Matthew Flaschen; 14.05.2009

На самом деле в ядре современной ОС достаточно места для кода C++. Я только что посмотрел, и в дереве ядра ядра Win7 довольно много кода C++. Обратите внимание, что многие подсистемы остаются в простом C. На это есть несколько причин.

  1. C - исходный язык ОС на базе NT.
  2. C очень, очень хорошо понимается ключевыми людьми
  3. Хорошо написанный C может быть самым простым кодом для отладки, особенно в режиме ядра.

При этом многие команды и люди считают хорошо написанный C++ эффективным инструментом для работы с основной ОС.

В C++ нет ничего, что мешало бы использовать его для написания основного кода управления ресурсами, такого как планировщик, диспетчер памяти, подсистема ввода-вывода, графическая подсистема и т. д. и т. д.

Как указывали другие, для любой работы с ядром всегда потребуется немного языка ассемблера.

person Foredecker    schedule 14.05.2009
comment
Переход от C к C++ в ядре — крошечное изменение. Это очищает некоторые вещи (теоретически), но, в конце концов, это действительно тот же код. Обратите внимание на управляемые операционные системы, чтобы увидеть настоящие инновации — вот к чему мы идем. - person Serafina Brocious; 14.05.2009
comment
Где я могу это увидеть, если вы не возражаете? - person Recursion; 14.05.2009
comment
Смотрите пост, который я сделал выше. Он полон аккуратных ссылок от Коди. - person Chris Jester-Young; 14.05.2009

Microsoft находится в процессе перезаписи части Windows на .NET, однако я сомневаюсь, что большая часть ядра будет затронута.

Однако есть такие проекты, как Cosmos (http://www.gocosmos.org/index.en.aspx ), которые дают нам надежду.

person Jonathan Parker    schedule 14.05.2009
comment
Конечно, надежда вырваться из-под гегемонии C/assembly. :-) - person Chris Jester-Young; 14.05.2009
comment
Первая часть первого предложения выше не соответствует действительности. Не было перезаписи частей Windows в .NET. - person Foredecker; 14.05.2009
comment
Надеемся, что мы сможем уйти от старых операционных систем, где разделение процессов является нормой (что приводит к рискам безопасности и экстремальным потерям производительности), а безопасность ОС зависит от миллионов строк кода. - person Serafina Brocious; 14.05.2009
comment
@Cody, это риски для безопасности из-за языка. - person Alphaneo; 14.05.2009
comment
На самом деле да. Полностью так. При переходе к управляемому коду доступ одного бита кода к другому возможен только через предоставленные ему объекты. В неуправляемом коде единственная защита — это разделение процессов, которое, как мы неоднократно видели, терпит неудачу, в основном во время системных вызовов, когда ядру приходится манипулировать адресными пространствами. - person Serafina Brocious; 14.05.2009
comment
@ Коди, большинство разработчиков ядра ОС не разрабатывают ядро ​​​​Linux или Windows, а разрабатывают какое-то крошечное встроенное ядро. И я предположил, что мы говорим о последнем. - person Alphaneo; 14.05.2009
comment
@Alphaneo, на самом деле каждое ядро ​​​​сталкивается с одними и теми же основными проблемами. Независимо от того, взламываете ли вы случайную пользовательскую встроенную ОС или BSD, у вас одинаковые компромиссы в отношении гибкости языка. - person Serafina Brocious; 14.05.2009
comment
@Cody Я не думаю, что управляемый код - это своего рода панацея, которая может волшебным образом решить все виды проблем ... на самом деле, используя управляемый код, вы только добавляете уровень абстракции, потому что в конце строки должен быть какая-то виртуальная машина или среда выполнения, которая выполняет работу по контролю всех границ и т. д., и которая не может быть безошибочной и безошибочной... и это только потому, что ее разработало всего несколько человек, а миллионы людей в худшем случае попытаются взломать и сломать это (не рассчитывая на то, что если у кого-то есть доступ к машине, вся безопасность всех видов давно ушла...) - person Filippo Savi; 08.03.2013
comment
Теоретически МОЖЕТ быть без ошибок. Для этого она (ВМ) должна быть настолько маленькой, чтобы ее можно было официально проверить. Это означало бы, что ошибок можно было бы доказать, что они не существуют. - person Demi; 24.07.2013

Нет, это не "это". Ядра обычно пишутся на C с добавлением небольшого количества ассемблера. Но ОС написана на самых разных языках. Но даже там C++ можно использовать без особых проблем. Как и многие другие языки. Linux написан фанатиками C, которые боятся и ненавидят все остальное, что является их проблемой. Windows написана на большой смеси C и C++ и, возможно, с некоторыми битами старого кода Pascal. И в наши дни также появляются куски .NET. OS X использует Objective-C для большей части кода ОС.

Тот же совет применим и во всех других областях программирования:

  • Знай свое дело
  • Не ограничивайте себя Единственным Истинным Языком.

Ядро — единственная область, где применяются несколько «особые» правила. Но ядро ​​крошечное. Подавляющее большинство ОС может быть написано на любом языке.

Да, вам обязательно нужно знать C, но просто знать C далеко не достаточно.

person jalf    schedule 14.05.2009

Вы можете ознакомиться с проектом Singularity от Microsoft (также в Википедии):

Singularity — это экспериментальная операционная система, разрабатываемая Microsoft Research с 2003 года. Она задумана как высоконадежная ОС, в которой ядро, драйверы устройств и приложения написаны в управляемом коде.

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

person Greg Hewgill    schedule 14.05.2009
comment
Собираются ли они в конце концов удалить букву C? - person Matthew Flaschen; 14.05.2009
comment
Я не знаю. Википедия утверждает, что существующий код на языке C и ассемблере отвечает за обработку прерываний x86, что имеет смысл. Поскольку это очень низкоуровневый код, компилятору общего назначения сложно сгенерировать правильный код, если вы не встроите эту конкретную возможность непосредственно в компилятор. Или, возможно, некоторые другие платформы (кроме x86) предлагают такую ​​архитектуру, что код на ассемблере не требуется для обработки прерываний. В любом случае, обработка прерываний — далеко не самая интересная часть ядра. :) - person Greg Hewgill; 14.05.2009

Я думаю, что это довольно безопасная ставка на то, что серьезная (не экспериментальная) разработка ОС останется на C (и сборке) в обозримом будущем.

Доказательство, которое я представляю, это Ада. Он может стать таким же «голым железом», как C, обеспечивает лучший контроль над размещением данных и имеет более безопасное поведение по умолчанию практически для всего (например, проверка границ массива). С точки зрения разработчика ОС он либо равен, либо превосходит C по любому техническому параметру, который только можно придумать. Он доступен уже более 20 лет (хорошо ... по разумной цене, возможно, всего 15 лет).

Так что, если бы люди искали технически более совершенный язык, чем C, вы должны были бы повсюду видеть операционные системы, написанные на Ada, верно? На самом деле я вижу одну серьезную ОС, реализованную на Аде. Он больше не поддерживается в пользу повторной реализации на C.

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

person T.E.D.    schedule 27.08.2009

Определенно! Вы также должны изучить хотя бы один язык ассемблера/аппаратную архитектуру.

person Nikolai Fetissov    schedule 14.05.2009
comment
Я согласен, что знание сборки имеет решающее значение, но не для непосредственного использования. Требуется понять, чем управляет ваше ядро, но это не обязательно писать напрямую. В управляемых ОС единственная часть ядра, которая напрямую касается сборки (ну, машинного кода), — это, например, компилятор (который, помимо прочего, гарантирует безопасность памяти). - person Serafina Brocious; 14.05.2009
comment
@ Коди, ты пишешь загрузчик в управляемом коде, не так ли? - person Alphaneo; 14.05.2009
comment
Вы, безусловно, могли бы, но в этом просто нет смысла — если ваш загрузчик больше нескольких тысяч строк кода, у вас есть проблема. Цель загрузчика состоит в том, чтобы сделать наименьшее количество вещей, прежде чем передать управление ядру, поэтому делать это в чем-либо, кроме ассемблера, глупо - это не /all/ указывает на ядро ​​​​в целом. - person Serafina Brocious; 14.05.2009
comment
ОС написана на C для переносимости. Ассемблер по-прежнему используется для атомарных операций, ловушек/системных вызовов, начальной загрузки и т. д. — всего, что требует инструкций для конкретной платформы. И компиляторы НЕ являются частью какой-либо известной мне ОС. Это пользовательские программы. Они не гарантируют сохранность памяти — гарантирует ядро. Вам не нужно знать ассемблер, чтобы понять ОС, но это, безусловно, помогает. - person Nikolai Fetissov; 14.05.2009
comment
@ nickf3, посмотрите на любую управляемую ОС в списке Криса, и вы поймете, о чем я говорю. Компилятор является частью ОС по необходимости, и вместо того, чтобы полагаться на устаревшие механизмы разделения процессов, компилятор гарантирует безопасность кода. - person Serafina Brocious; 14.05.2009
comment
Я ненавижу вдаваться в семантические аргументы, но компилятор по-прежнему не является частью работающего ядра, если только вы не имеете в виду что-то вроде jit :) Компилятор строит вам ядро ​​для определенного набора инструкций (абстрактных в этих случаях). И я согласен, есть тонна места для исследований в операционных системах, но все еще нужно понимать C и asm (и компиляторы, и компоновщики, и кэши, и блокировки, и прерывания, и т. д., и т. д.), чтобы добиться чего-либо в этом исследовании. - person Nikolai Fetissov; 14.05.2009
comment
@ nickf3: Да, Коди имеет в виду динамический компилятор (на мой взгляд, JIT - такой старомодный термин). Статическая компиляция — это такая старая школа. :-) - person Chris Jester-Young; 14.05.2009
comment
Простите мое невежество, но сколько из этих нью-скульных ОС у вас работает в продакшене :) - person Nikolai Fetissov; 14.05.2009

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

  • язык Си и
  • Сборка

Насколько я знаю, некоторые части загрузчика будут написаны на ассемблере, а затем на C. Существует множество доступных операционных систем с открытым исходным кодом, таких как, например, последние TOPPERS. Попробуйте заглянуть в него.

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

person Alphaneo    schedule 14.05.2009
comment
Хотите оптимизировать ядро? Сократите затраты на системные вызовы и переключение задач, оптимизируйте используемые алгоритмы. Singularity доказала, что ядро ​​управляемого режима может быть /быстрее/, чем ядро ​​старой школы, из-за обеспечиваемой безопасности. - person Serafina Brocious; 14.05.2009
comment
@Cody, теоретически управляемый код НИКОГДА не может быть быстрее, чем код сборки или хорошо оптимизированный код C. И если вы говорите, что это быстрее, то все, что я могу сказать, это клянусь - person Alphaneo; 14.05.2009
comment
@Alphaneo: неправильный управляемый код может быть скомпилирован динамически, тогда как обычно код C или ассемблера слишком статичен для этого. Под динамическим я подразумеваю, что код может быть оптимизирован на основе показателей времени выполнения. Посмотрите, какова производительность Java (или .NET, если уж на то пошло) по сравнению с более статичными системами. - person Chris Jester-Young; 14.05.2009
comment
@Chris, значит ли это, что .NET быстрее, чем Assembly? по крайней мере в некоторых случаях. - person Alphaneo; 14.05.2009
comment
Да, если только ваш ассемблерный код не имеет возможности перекомпилировать себя на основе метрик времени выполнения. Я про долгоиграющие процессы, кстати (какие ядра), где по ходу можно собирать статистику. - person Chris Jester-Young; 14.05.2009
comment
@Chris, код сборки, перекомпилировать? О чем ты говоришь? - person Alphaneo; 14.05.2009
comment
Управляемый код никогда не может быть быстрее? Действительно? Хорошо, давайте проведем эксперимент. Соберите код для 8086, затем переместите его в систему x64 и запустите. Использует ли он все 16 64-битных регистров? Вы можете изучить динамическую генерацию кода и/или перекомпиляцию, прежде чем ответить на этот вопрос. - person Serafina Brocious; 14.05.2009
comment
@ Коди, некоторые люди говорят о вещах, которые существуют в теории (C #), а некоторые здесь говорят о практическом ближайшем будущем (C и Assembly). Во всяком случае, я не видел ни одного загрузчика, написанного на С#, и не мог себе представить, чтобы он был написан на С#... - person Alphaneo; 14.05.2009
comment
@Alphaneo, этого не существует только в теории. Все ОС, связанные Крисом (за исключением Singularity), используют управляемый код для каждой отдельной части ОС после загрузчика. Единственная причина, по которой управляемый загрузчик не был написан, заключается в том, что он не нужен. GRUB прекрасно справляется со своей задачей. Вы еще не назвали ни одной причины, по которой загрузчик нельзя было бы написать в чистом управляемом коде. - person Serafina Brocious; 14.05.2009
comment
@ Коди написал, что вы еще не назвали ни одной причины, по которой загрузчик не может быть написан в чистом управляемом коде ... ОБЯЗАТЕЛЬНО, хороший вопрос. - person Alphaneo; 14.05.2009
comment
@ Альфанео, я не понимаю, сарказм ты или нет, но мне бы очень хотелось, чтобы ты привел причину, по которой это невозможно сделать. На этом уровне существует множество неправильных представлений об управляемом коде, и я хотел бы помочь их прояснить. - person Serafina Brocious; 14.05.2009
comment
@ Коди, мне придется признать, что я был саркастичен. Вероятно, из-за моего неправильного представления или в некоторой степени незнания управляемого кода. А так как вы, кажется, много рассказываете об управляемом коде, я обещаю больше изучить управляемый код. Кстати, я написал пакеты BSP для ряда ОС, полностью на ассемблере и C, и я не мог поверить (думаю, если уж на то пошло), что я могу написать эти BSP на .NET. - person Alphaneo; 14.05.2009
comment
@Alphaneo, в зависимости от ограничений, с которыми вы работали, возможно, вы не смогли. Генерировать /чертовски/быстрый код из CIL очень легко, но генерировать небольшой код очень сложно. Что касается реальных возможностей, единственное, что, как мне кажется, может вызвать у вас проблемы, это если вам требуется точное время, например. вы должны бросать пиксели в PPU каждые X циклов (как в NES). - person Serafina Brocious; 14.05.2009
comment
@Cody ...Я написал в блоге по этому вопросу, см. indcricket.blogspot.com, я буду продолжать учиться, даже сейчас во многих местах, таких как программирование DSP, ассемблер все еще правит. - person Alphaneo; 14.05.2009

Я много занимался программированием как в Windows NT, так и в ядре Linux. И я могу заверить вас, что пока эти 2 ОС существуют вокруг C, они будут использоваться в ядре. Я думаю, что причин множество, но самый простой ответ — время. Как упоминалось в предыдущих постах, время, необходимое для переписывания ядра на другом языке, того не стоит. И это будет не просто портирование кода. Ядру потребуются серьезные модификации дизайна. Лично я считаю C наиболее подходящим языком для ядра. Возможность управлять вашей открытой памятью и динамически выделять и освобождать вашу собственную память имеет решающее значение, когда вы работаете в ядре. Особенно, если вы работаете со страничной памятью. Размер стека, выделенный вам в режиме ядра, также обычно меньше, чем в пользовательском режиме, поэтому эффективность использования памяти снова имеет решающее значение. C также позволяет программистам создавать красивые структуры данных, которые не содержат всех раздутых накладных расходов, присущих управляемым языкам. На мой взгляд, структуру можно использовать так же эффективно, как и объект, но опять же без раздутых накладных расходов. Управляемые языки также должны быть «управляемыми». В ядре у вас нет ничего, что бы убирало ваши беспорядки. Не поймите меня неправильно, я люблю C# и считаю, что фреймворк .NET прекрасен, но если вы работаете с ядром, то C есть и останется таковым.

person Ian    schedule 26.02.2010

C++ поддерживается для разработки режима ядра в Windows, но вы не можете легко использовать исключения и RTTI. Я считаю, что сегодня нет смысла писать код на C, поскольку накладные расходы C++ незначительны (любая инфраструктура трассировки/отладки будет намного дороже, чем дополнительное разыменование для вызова виртуальной функции). Фактически, большинство Windows DDK реализуют объектно-ориентированные шаблоны с помощью C, что просто неудобно по сравнению с C++.

Если вы решите использовать C++ для разработки в режиме ядра, вам потребуется переопределить оператор new, чтобы выбрать, следует ли размещать класс в выгружаемой или не выгружаемой памяти. Здесь могут пригодиться некоторые хорошие макросы.

person Vlad Lifliand    schedule 26.02.2010

Вы обязательно должны свободно владеть C.

Как указывали другие, нет причин, по которым операционная система должна быть написана на C, и можно многого добиться, используя более сложные языки. Но если вы собираетесь работать над операционными системами в реальном мире (т. е. не в академических кругах или исследовательской лаборатории), вам придется смириться с несколькими реалиями:

  1. Существующие операционные системы огромны, часто содержат миллионы строк кода и написаны на C или его производных, таких как Objective-C или C++.
  2. Новым операционным системам требуются сотни инженерных лет (и многие календарные годы), чтобы достичь и соответствовать функциональности и надежности существующих операционных систем.

В результате мне трудно понять, как и когда мир отойдет от ядер операционных систем на основе C. Да, это технически возможно. Но цена может оказаться слишком высокой. Во всяком случае, тенденция, похоже, направлена ​​на консолидацию небольшого числа семейств ОС — Windows, Linux и BSD — все они основаны на C.

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

person Keith Smith    schedule 24.06.2009

Ну, в сообществе osdev C обычно называют языком высокого уровня. И более «низкоуровневым» языком будет ассемблер (вы вынуждены использовать ASM в начале вашего ядра, поэтому вы должны использовать ASM, но вам не обязательно использовать C).

person user69969    schedule 17.03.2014

Я указываю на язык программирования Oberon и Операционная система Oberon от автора языка Pascal, Никлауса Вирт. У проекта Никлауса Вирта также есть фан-сайт.

Если я правильно понимаю Андрей Николаевич Терехов, у Ады есть то преимущество, что проверки доступа к памяти могут быть перенесены с уровня аппаратного обеспечения ЦП на уровень компилятора, что уменьшает количество логических вентилей в ЦП, что, в свою очередь, выгодно с точки зрения энергопотребления. Чем меньше логических элементов требуется ЦП, тем больше ядер можно создать из того же количества логических элементов. С этой точки зрения ЦП, специально адаптированные для языка, в котором компилятор заменяет части аппаратного обеспечения, имеют фундаментальное преимущество с точки зрения количества операций на ватт.

person Martin Vahi    schedule 03.11.2014

Слишком часто можно услышать высказывание: язык C является синонимом скорости, а Ada — нет. Это не правда. Ада добавляет несколько проверок, которые замедляют выполнение. Это правда, но для целей отладки или безопасности. Следовательно, они могут быть удалены конфигурацией во время компиляции. Таким образом, вы можете генерировать программы ADA без накладных расходов. С другой стороны, обратите внимание, что компилятор gnu транслирует языки Ada и C в один и тот же промежуточный код. В результате вы получаете в конце тот же исполняемый код. Я прочитал здесь, что Ada нельзя использовать для разработки драйверов. Это неверно. Ада имеет те же возможности, что и язык Си. Более того, это позволяет избежать многих ошибок. Вы видите, что существует операционная система реального времени MarteOS, полностью написанная на Аде.

Основная причина, по которой Ада не используется для программирования ядра ОС, заключается в том, что язык C используется для Unix. Это норма POSIX, когда API системных вызовов выражается прототипами C. Все фрагменты ОС уже написаны на C. И язык C представляет 17% программного обеспечения, разработанного в мире.

Наконец, Ада строгая, и многим это не нравится. Они предпочитают разрабатывать программное обеспечение с уязвимостями и тратить больше времени на отладку.

person Didier    schedule 13.12.2014
comment
Я не понимаю, почему Ваш ответ был отклонен. Я предполагаю, что самые умные комментарии не всегда являются самыми популярными комментариями. Даже среди специалистов. - person Martin Vahi; 12.02.2015