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

Запуск программы в режиме ядра запрещает использование стандартной библиотеки 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

  • Неопределенные ссылки на «get_rome_version» и «rome_download» при компиляции «btusb_probe» в ядре SM-G360T
  • Какая часть ядра Linux определяет порядок выполнения пользовательских приложений?
  • Что изменилось между ядрами 3.7 и 3.9, которые влияют на корневые файловые системы LVM / RAID?
  • При установке rpm-пакета ядра в ОС Qubes жалуется: dracut-install: ОШИБКА: установка /usr/lib64/plymouth//label.so
  • Что ждет Linux при переключении с Xorg на текстовую консоль?
  • Переполнение FIFO FlexCan
  • Является ли монолитная природа Linux (часть) проблемой с драйверами ARM?
  • empty modules.dep для новой компиляции ядра
  • Не удалось установить драйвер контроллера Ethernet Atheros AR8161 для CentOS 6
  • Наблюдение за записью жесткого диска в пространстве ядра (с драйверами / модулями)
  • компиляция ядер для арматуры
  • Linux и Unix - лучшая ОС в мире.