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

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

  • Пакет Virtualbox и GPU: устройство с адресом PCI хоста, уже подключенным к этой виртуальной машине
  • Как узнать, как настроено мое текущее ядро ​​Linux
  • Создание ядра для BeagleBone Black приведет меня к проблемам hdmi
  • генерация кода / proc файловая система
  • как распаковать файл в linux red hat?
  • «WannaCry» в системах Linux: как вы себя защищаете?
  • Почему я должен создать собственное ядро?
  • Как заставить strace «декодировать» связь AF_NETLINK как с ioctl?
  • Измените фреймбуфер устройства для использования слоя наложения
  • Простой способ initrd для загрузки другого ядра с помощью kexec
  • Как долго длится зубной протеже в dcache?
  • Interesting Posts

    звук во FreeBSD 11 внезапно внезапно внезапно

    Является ли vim многопоточным?

    Установка Flash Player для Safari в Ubuntu

    Обновление yum представляет собой конфликт hponcfg-4.2.0-0.x86_64

    Почему `at` предупреждает меня, что команды будут выполняться с помощью / bin / sh? Что делать, если я хочу другую оболочку?

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

    mutt: автоматически показывать новые сообщения

    Мост Debian не поддерживает конфигурацию IPv6

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

    В MATE, как мне получить разные панели на рабочее пространство?

    Будет ли установка разных версий libssl вызывать проблемы?

    Превышение объема памяти на сервере с помощью PHP

    Как новые идентификаторы пользователей автоматически вычисляются по умолчанию в Linux?

    Нужно ли мне перекрестно скомпилировать мою программу, когда моя цель – 64-битная арка. и хост – 32-битная арка от семейства x86?

    Имя хоста для полного расширения имени домена

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