Ядра (уровень абстракции устройства) ОС написаны полностью на C? (Например: «UNIX написан на C») - PullRequest
5 голосов
/ 19 октября 2010

Действительно ли ядра ОС (уровень взаимодействия с устройством) написаны на C, или «написано на C» означает, что только большая часть ОС написана на C, а взаимодействие с устройствами записано в asm?

ПочемуЯ спрашиваю, что:

  1. Если ядро ​​написано в asm - оно не может быть кроссплатформенным.
  2. Если оно написано на C - я не могу представить, как оно могло быбыть написано на C.

OK.А как насчет ввода-вывода - я не представляю, как можно взаимодействовать с контроллером HDD или USB-контроллером или какими-то другими вещами, которым мы должны отправлять сигналы для записи без (или с небольшим количеством) ассемблера.В конце концов, спасибо.Я посмотрю на некоторые другие источники в Интернете.

PS (Наводнение) Жаль, что у нас нет курса ОС в университете, несмотря на то, что МФТИ является российским близнецом MIT, я обнаружил, чтоникто не пишет такие ОС, как minix.

Ответы [ 7 ]

9 голосов
/ 19 октября 2010

Основная идея Unix - написать почти все на C. Итак, изначально примерно 99% этого было C, это была точка, и главной целью была мобильность.
Поэтому, чтобы ответить на ваш вопрос, взаимодействие с устройствами также написано на C, да. Даже очень низкоуровневый материал написан на C, особенно в Unix. Но есть еще очень мало частей, написанных на языке ассемблера. На x86, например, загрузчик любой ОС будет включать некоторую часть в ассемблер. У вас могут быть небольшие части драйверов устройств, написанные на языке ассемблера. Но это необычно, и даже когда это сделано, это, как правило, очень маленькая часть даже кода самого низкого уровня. Сколько именно зависит от реализаций. Например, NetBSD может работать на десятках различных архитектур, поэтому они избегают языка ассемблера любой ценой; И наоборот, Apple не заботится о переносимости, поэтому приличная часть MacOS libc написана на ассемблере.

3 голосов
/ 19 октября 2010

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

  • Некоторые команды в режиме ядра, предназначенные только для манипулирования MMU или выполнения других привилегированных операций, не могут быть сгенерированы стандартным компилятором.В этом случае код должен быть написан на ассемблере.

  • Оптимизация производительности для конкретной платформы.Например, в архитектуре X64 предусмотрена инструкция по замене конечного значения, а в ARM есть переключатель смещения (поворачивает читаемое слово на N бит), который можно использовать в операциях загрузки.

  • Сборка«склеить» для взаимодействия с чем-то, что не будет хорошо сочетаться с (например) структурой стека C, форматами данных или соглашениями о расположении параметров.

3 голосов
/ 19 октября 2010

Это зависит.

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

3 голосов
/ 19 октября 2010

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

Путем небольшой хитрости, связанной с реализацией, можно написать драйверы полностью на C, так как обычно можно создать, скажем, volatile int *, который будет использовать регистр отображенного в памяти устройства.

2 голосов
/ 19 октября 2010

Существуют также операционные системы, написанные на других языках, например:

1 голос
/ 19 октября 2010

Если вас интересуют конкретные указатели, рассмотрите ядро ​​Linux. Все дерево программного обеспечения практически полностью написано на C. Самая известная часть сборки, используемая в ядре, - это entry.S, специфичная для каждой архитектуры:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/kernel/entry_64.S;h=17be5ec7cbbad332973b6b46a79cdb3db2832f74;hb=HEAD

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

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/include/asm/spinlock.h;h=3089f70c0c52059e569c8745d1dcca089daee8af;hb=HEAD

1 голос
/ 19 октября 2010

Вам не нужно удивляться таким вопросам. Захватите исходный код ядра Linux и поищите сами. Большая часть сборки хранится для каждой архитектуры в каталоге arch. Неудивительно, что подавляющее большинство находится на C. В конце концов, компилятор генерирует машинный код. Это не обязательно должен быть C. Наше встроенное ядро ​​на работе написано на C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...