Как написано ядро?

Запуск программы в режиме ядра запрещает использование стандартной библиотеки C, потому что единственное, с чем связана ваша программа, – это ядро. Поэтому мне разрешено использовать функции, определенные в ядре. Но само ядро ​​- это программа, написанная на C и скомпилированная для некоторой конкретной архитектуры. И он не должен использовать стандартную библиотеку C, но также не должен использовать никаких драйверов, так как драйверы являются загружаемыми модулями. Итак, мой вопрос в том, какие фактические функции C используются при написании ядра? Как вы можете взаимодействовать с оборудованием не через ядро? Не говори, что я смотрю на источники, это слишком новый уровень для меня, ТЮ.

3 Solutions collect form web for “Как написано ядро?”

Ядро Unix традиционно включало в себя код ассемблерного языка. Я недавно не смотрел его исходный код, но я подозреваю, что это все еще так.

См. Как драйвер действительно взаимодействует с аппаратным устройством? для обзора этой темы. Ответы на этот вопрос обсуждают два вида компьютерной архитектуры. В системе, использующей переносимые порт ввода / вывода (PMIO), ядро должно быть написано частично на языке ассемблера – хотя вы можете пройти с помощью нескольких очень коротких процедур. В системе, использующей I / O (MMIO) с отображением памяти, даже драйверы устройств могут быть полностью записаны на C. Все, что им нужно сделать, это объявить указатель, установить его равным виртуальному адресу устройства, а затем использовать его для управления устройством, как если бы он обращался к памяти.

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

Ядро воспроизводит целую кучу функций, предоставляемых libc статически, внутри себя.

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

Загрузка модулей ядра работает по принципу динамической загрузки и описывается здесь: http://www.tldp.org/LDP/tlk/modules/modules.html

  • Могут ли повлиять на адреса символов ядра? последствия?
  • конфигурации ядра и зависимости
  • Как получить доступ к физической памяти из пользовательского пространства?
  • Возобновление конфигурации ядра Linux
  • SELinux и Trusted OS - может ли SELinux быть ограничен корневым уровнем аппаратного уровня?
  • switch_root с systemd: «Слишком много уровней символических ссылок»
  • Как устройство IFB позиционируется в потоке пакетов ядра Linux
  • Почему во время загрузки висит ядро ​​Linux 3.2 (backport) Debian?
  • cc1: предупреждения обрабатываются как ошибки при компиляции FreeBSD 8.2 Release
  • Какая часть ядра Linux определяет порядок выполнения пользовательских приложений?
  • Что делает опция «nointremap» для Linux?
  • Interesting Posts

    В чем разница в использовании xinput и synclient для деактивации сенсорной панели в X

    Поддерживает ли Apache 2.2.3 TLSv1.1 и TLSv1.2?

    Перенаправление ввода с использованием команды и параметров

    Подставляя значение по умолчанию ('0') для нулевого параметра

    Разрешение файла продолжает меняться

    Регулярное выражение, соответствующее X-идентификаторам сеанса?

    sudo: разрешить одной команде устанавливать одну переменную среды

    Как правильно настроить яркость монитора во время загрузки?

    Добавить временную метку при записи файла

    Безопасная обработка PDF-файлов и других форматов электронных книг в Linux

    Какой URL-адрес следует использовать для списка воспроизведения репозитория Fedora EPEL в конфигурации кикстарта?

    Нет Вход в систему от tty2 до 6

    Какие проблемы следует ожидать при добавлении репозитория CentOS yum в RHEL?

    Установить php_http в Arch Linux

    sort и ls – почему не заглавные буквы отсортированы в первую очередь?

    Linux и Unix - лучшая ОС в мире.