Основной вопрос загрузки ОС - PullRequest
5 голосов
/ 10 января 2010

У меня есть некий базовый вопрос к процессу загрузки компьютера и той части, где загрузчик вызывает ОС.

Итак, я знаю, что BIOS копирует первые 512 байт с загрузочного диска в память и выполняет код - так что это загрузочный блок.

  • Но как этот маленький ассемблер загружает загрузчик командами из ОС?
  • Продолжает ли загрузчик работать и все еще действует как «передатчик» между программным и аппаратным обеспечением? Или управление полностью отдано ОС?
  • Почему все загрузчики написаны на ассемблере?
  • А почему при написании ОС вы должны вернуться с C ++ к C?

С наилучшими пожеланиями, ламы

Ответы [ 6 ]

12 голосов
/ 10 января 2010

1) Загрузчик обычно содержит несколько простых инструкций для загрузки еще большего количества данных с диска и его запуска.

2) Нет,

3) Чтобы уменьшить занимаемое ими пространство.

4) Нет.

6 голосов
/ 10 января 2010
  • Но как этот маленький ассемблер загружает загрузчик командами из ОС?

Да, загрузчик небольшой, но BIOS - нет, и он реализует ... всегда реализовывал ... системные вызовы ввода / вывода DOS. Эта система ввода-вывода изначально запускала всю систему ввода-вывода ОС еще в DOS и в первые дни Windows. Теперь это просто консоль, отвечающая за загрузку реальной ОС, которая затем поставляет все свои собственные драйверы. Это своего рода библиотека драйверов устройств и оригинальный эмулятор IBM-PC для загрузчика.

  • Продолжает ли загрузчик работать и все еще действует как «передатчик» между программным и аппаратным обеспечением? Или управление полностью отдано ОС?

Загрузчик загружается после запуска ОС. Это хороший вопрос, потому что в первоначальной концепции ПК BIOS делала ввод-вывод для ОС, а также для загрузчика, и поэтому часть системы выжила при загрузке ОС.

  • Почему все загрузчики написаны на ассемблере?

Несколько причин: они должны быть небольшими, у них есть ограничения макета с фиксированным адресом, они должны делать вызовы BIOS в стиле int $ x , учитывая их размер и тот факт, что некоторые из них должны быть в ассемблере выиграть нечего, взяв 128 или около того байтов и сказав: «Хорошо, эту часть вы можете написать на C, старайтесь не писать более 10 или около того операторов».

  • А почему при написании ОС вам нужно возвращаться из C ++ в C?

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

2 голосов
/ 10 января 2010

Но как этот маленький ассемблер загружает загрузчик команды из ОС?

Поскольку вы не можете сделать много в 512 байтах кода (хотя, фактически, загрузчик не является строго ограниченным 512 байтами), загрузчик обычно не намного загружает больший блок код с диска в оперативную память, а затем выполнить его.

Продолжает ли загрузчик работать и все еще действует как «передатчик» между программным и аппаратным обеспечением? Или управление полностью передано ОС?

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

Почему все загрузчики написаны на ассемблере?

Полагаю, это в основном по одной причине: если вы пишете загрузчик на языке высокого уровня, созданный код, скорее всего, будет опираться на какую-то библиотеку времени выполнения, содержащую необходимые функции. Однако, они часто не нужны для загрузчика и поэтому увеличивают размер кода.

А почему при написании ОС нужно возвращаться с C ++ к C?

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

Редактировать: Я также слышал аргумент, что некоторые разработчики ОС придерживаются языка C, потому что выбор различных парадигм и стилей программирования меньше, чем, например, в C ++. Поэтому легче работать в команде с общей кодовой базой, потому что каждый будет писать больше «похожего» кода. (Поскольку я сам не участвовал в разработке open-source или OS, я не могу судить по опыту, является ли это верным утверждением или нет.)

1 голос
/ 10 января 2010

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

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

Однако, это не полностью исключает написание ядра на C ++. Есть способы обойти это.

0 голосов
/ 08 июня 2011

Во всех ответах отсутствует один важный момент о том, почему он написан на ассемблере: потому что:

а. MMU все еще не настроен,

б. нет существующего процесса загрузчика, выполняющего загрузку ваших скомпилированных двоичных файлов - поскольку область памяти не является однородной - некоторые части зашиты для целей DMA / BIO и т. д., поэтому требуется много работы по переназначению.

Таким образом, когда вы пишете это в сборке, вы должны явно указать все места в вашей памяти - где находятся данные, где находится исполняемый файл и т. Д., И убедиться, что эти ограничения не конфликтуют.

Если вы пишете на C, gcc скомпилирует его в некоторый стандартный формат ABI, и для загрузки двоичного файла в память уже существует существующий загрузчик (это может быть просто библиотека). Поскольку обычно используемая двоичная память больше, чем доступная в физической памяти, и определенные части памяти зарезервированы для аппаратного использования - в зависимости от платформы / оборудования - поэтому необходимо настроить MMU перед загрузкой этих двоичных файлов.

Загрузка ELF является лишь одним аспектом сложности:

http://wiki.osdev.org/ELF#Loading_ELF_Binaries

Но существует такой дистрибутив, как uClinux, который устраняет необходимость установки MMU:

http://www.uclinux.org/

Кто-то должен научить меня больше об этом .....

0 голосов
/ 10 января 2010

Загрузчик начальной загрузки загружает операционную систему с диска.

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

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

Загрузчик начальной загрузки обычно пишется на ассемблере, потому что это хороший баланс между полным контролем ичитаемость.Он может быть написан в виде простого машинного кода (и, вероятно, первые были), но это сложнее для чтения.Он может быть написан на низкоуровневом языке, таком как C, но трудно достичь низкоуровневых подпрограмм в BIOS, которые вам нужны для загрузки, а также трудно удержать его в пределах ограничений по размеру, так как скомпилированный код имеет тенденцию иметьмного накладных расходов.

Операционная система обычно написана на низкоуровневом языке, таком как C (с такими вещами, как загрузчики начальной загрузки и драйверы оборудования, все еще в ассемблере).Вы можете написать его на C ++, так как он основан на C, но это было бы в основном бессмысленно, поскольку вы не использовали бы большую часть того, что добавил C ++.Ориентация объекта просто не очень полезна при написании операционной системы.

...