Предположительно, это означает, что единственными конструкторами C, которые доступны для программиста ядра, являются только базовые операторы присваивания, побитовые операторы и циклы. Это верно?
Практически все функции языка C будет по-прежнему работать в ядре без необходимости особой поддержки времени выполнения, ваш C компилятор сможет перевести их на ассемблере, которые могут работать так же, в режиме ядра, как они будут в обычная программа пользовательского режима.
Однако библиотеки, такие как Standard C Library, не будут доступны, вам придется написать свою собственную реализацию. В частности это означает, что нет malloc
и free
, пока вы их не реализуете самостоятельно.
Если да, то как более сложные вещи, такие как ввод/вывод основной памяти и планирование процесса, достигнуты на самом низком уровне? Могут ли они быть реализованы только в чистой сборке?
Memory I/O is something much more low level, который обрабатывается процессором, BIOS и другим оборудованием на вашем компьютере. OS, к счастью, не должна беспокоиться об этом (за некоторыми исключениями, например, зарезервированными адресами и некоторыми функциями управления памятью).
Планирование процесса - это концепция, которая на самом деле не существует на уровне машинного кода для большинства архитектур. x86 имеет a concept of tasks и коммутацию аппаратных задач, но nobody uses it. Это абстракция, созданная ОС по мере необходимости, вам придется реализовать ее самостоятельно, или вы можете решить, иметь ОС с одной задачей, если вы не хотите тратить силы, она все равно будет работать.
Что значит тогда, когда ядро должно быть записано в C (например, linux). Являются ли некоторые части ядра неотъемлемо записаны в сборке?
Некоторые части ядра будут в значительной степени зависимыми от архитектуры и должны быть записаны в ASM. Например, on x86 switching between modes (например, для запуска 16-битного кода или как часть процесса загрузки), или обработка прерываний может быть выполнена только с некоторыми защищенными инструкциями ASM. Справочное руководство по вашей архитектуре выбора, например, Intel® 64 and IA-32 Architectures Software Developer’s Manual для x86, - это первое место, где можно найти эти детали.
Но C - это портативный язык, он не нуждается в таких концепциях архитектуры с низким уровнем архитектуры (хотя теоретически можно было бы сделать все, начиная с файла .c с использованием встроенных ASM-компиляторов). Более полезно отвлечь это в ассемблерных подпрограммах и создать свой код на вершине чистого интерфейса, который вы могли бы поддерживать, если бы вы хотели перенести свою ОС на другую архитектуру.
Если вас интересует предмет, я настоятельно рекомендую вам посетить the OS Development Wiki, это отличный источник информации об операционных системах, и вы найдете много любителей, которые разделяют ваши интересы.
Библиотеки времени исполнения компилируются «совместимым компилятором для этой ISA». Так в чем проблема?Операции ввода-вывода памяти выполняются с помощью кода низкого уровня, написанного для конкретной архитектуры, с использованием того же «совместимого компилятора». Планирование процесса - это задача высокого уровня, поэтому я даже не буду упоминать об этом. –
Пожалуйста, имейте в виду, что C был изначально написанные для облегчения построения ОС. –
Перейдите на сайт kernel.org и посмотрите на источник для себя. Почти все это в C - даже драйверах устройств и других очень низкоуровневых материалах, но да, есть бит сборка для таких вещей, как переключения режимов процессора и т. д. –