Вопросы по внутренним ядрам Linux

Я читал «Драйверы устройств Linux, 3-е издание» и столкнулся с некоторыми элементами ядра, которые я не совсем понимаю. Надеюсь, гуру на этом форуме помогут мне.

  1. Является ли ядро ​​Linux внутренне работать с виртуальными или физическими адресами? Что меня особенно смущает, так это то, что существует несколько типов адресов (логический, виртуальный, шинный и физический), и все они действительны и работоспособны ядром.

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

  3. Может ли процесс спящий при запросе семафора (который имеет значение 0) и должен его ждать?

  4. Атомные операции – гарантируются ли они конкретными инструкциями процессора?

2 Solutions collect form web for “Вопросы по внутренним ядрам Linux”

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

Является ли ядро ​​Linux внутренне работать с виртуальными или физическими адресами? Что меня особенно смущает, так это то, что существует несколько типов адресов (логический, виртуальный, шинный и физический), и все они действительны и работоспособны ядром.

Да. В разных частях ядра используются разные адресные пространства.

В то время как код ядра обрабатывает системный вызов, его сопоставления памяти включают в себя как все пространство памяти ядра, так и весь объем памяти процесса (если у вашего ядра не установлена ​​высокая память, но это слишком сложно, чтобы войти сюда). Это все логические (или виртуальные) адреса: старшие биты адреса указывают, какую страницу искать в MMU , а младшие биты – линейный адрес внутри страницы. Отображения памяти внутри MMU изменяются всякий раз, когда происходит переключение задачи (изменение таблицы страниц в MMU является большой частью переключателя задачи).

Некоторые драйверы устройств должны управлять адресами памяти, которые действительны для устройства, которым они управляют. Это часто физические адреса, хотя некоторые архитектуры имеют IOMMU, поэтому устройства также видят собственные логические адреса. Разумеется, подсистема управления памятью в ядре должна управлять множеством разных адресов.

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

Это зависит от архитектуры. Большинство архитектур имеют некоторый вид DMA (прямой доступ к памяти) , который позволяет, по крайней мере, обмениваться информацией с устройствами через ОЗУ. Кроме того, на некоторых архитектурах (например, ARM) все обращения к устройствам выполняются с инструкциями по загрузке и хранению на соответствующих адресах, в то время как другие (например, i386) имеют конкретные инструкции процессора для этой цели. См. Ввод-вывод с памятью для получения более подробной информации.

Может ли процесс спящий при запросе семафора (который имеет значение 0) и должен его ждать?

Да, семафор ( down и друзья) – это операция блокировки. Это хорошо объяснено в книге.

Атомные операции – гарантируются ли они конкретными инструкциями процессора?

Да. Детали очень специфичны для архитектуры. Все платформы, предназначенные для многозадачности, предоставляют по крайней мере один атомный примитив для синхронизации, такой как сравнение и обмен , тестовый и установочный , load-link + store-conditional и т. Д. Помимо использования правильного примитива, код может потребоваться позаботьтесь о том, чтобы использовать надлежащие барьеры памяти для многопроцессорных систем. Ядро Linux обеспечивает реализацию своих примитивов синхронизации для каждой поддерживаемой архитектуры, так что вам, в свою очередь, нужно будет использовать переносные примитивы ядра.

Я могу попытаться ответить 1,3 и 4.

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

Логический адрес : они включены в инструкции машинного языка для обращения к операции или инструкции. Разделен на сегмент и смещение.

Линейный адрес : модуль сегментации преобразует логические в линейные адреса. Это шестнадцатеричное число (по 32-битной архитектуре: 0x00000000-0xffffffff ), адресующее пространство в памяти.

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

Адрес шины : используется всеми аппаратными устройствами, кроме ЦП, для адресации ячеек памяти (DMA не требует CPU, но все еще адресации). Эти адреса в основном идентичны физическим, за исключением некоторых других архитектур, таких как SPARC и Alpha, которые включают в себя отдельный модуль управления памятью ввода-вывода.

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


Если процесс приближается к семафору со значением 0 или ниже, он приостанавливается до достижения значения 1 или более. Это происходит только для процессов, которые могут спать. Обработчик прерываний не может спать и поэтому запрещается использовать семафоры.


Атомные операции могут быть достигнуты с помощью инструкций на языке ассемблера, которые определяются:

  • Нулевой или один доступ к памяти
  • С LOCK_PREFIX

На уровне C ядро ​​предоставляет тип atomic_t и макросы с префиксом atomic_
(которые добавляют LOCK_PREFIX к инструкциям сборки).

  • поддержка ядра 3.1x и оптимизация
  • В Solaris 10 и 11 все еще используется распределение slab для их распределителя памяти ядра
  • Невозможно скомпилировать ядро ​​Linux для платы ARM
  • Заголовки ядра для ядра 3.10.0-229.el7.x86_64 не найдены
  • Ошибка: TCA_HTB_PAD не объявлен при создании ядра
  • Как обнаружить «движение» петли 2-в-1 в ноутбуке
  • Ccache попадает только один раз во время сборки ядра
  • В чем разница между всеми параметрами и значением по умолчанию в настройках ядра?
  • Каковы методы восстановления конфигурации ядра Linux?
  • Ошибка сборки драйвера устройства: неверный формат модуля insmod
  • Добавление файлов в образ initramfs - надежный?
  • Linux и Unix - лучшая ОС в мире.