Intereting Posts
Использовать awk для отправки списка символических ссылок на файлы в каталог с пробелами в имени? Значки переключателей вкладки размыты (Linux mint) Xvfb застрял в «встроенном расширении GLX» на Amazon Linux Экран GNU: как использовать: aclumask для установки разрешений для неизвестных пользователей? Как изящно выйти из Qemu VM с запущенным ядром Интерфейс не запускается в докере Убрано USB-устройство хранения данных все еще установлено Разрешить setuid для сценариев оболочки Резервное копирование магазина при отображении / отмене отображения windows X11? Должен / dev / random и / dev / urandom создаваться каждой загрузкой, или это статические файлы, которые можно поместить в tar? Добавить первый столбец в файл Как сделать sash учетной записи capabele только для sshfs и rsync? Почему в CentOS 7 не будет установлена ​​новая версия Node.js? быстрый фильтр IP, вызывающий DOS для sendmail под FreeBSD Создание пользовательского контекста / типа файла SELinux из CIL

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

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

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

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

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

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

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

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