Вопросы по внутренним ядрам 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 к инструкциям сборки).

  • Это процесс, который очищает себя от завершения или ядра?
  • Что такое linux долгосрочные ядра поддержки?
  • Компилировать ядро ​​Linux с динамическим (Un) загружаемым usbserial модулем
  • debian не может установить исходный код ядра
  • Подписание модуля для предварительно созданного ядра
  • Как заставить параметр CONFIG_ оставаться включенным?
  • Виртуальная схема памяти ядра: отрицательные значения
  • Кнопка мыши перестает работать с перерывами
  • Что означает «системный вызов», если не реализация на языке программирования?
  • Работает ли MySQL в режиме пользователя или ядра?
  • Признание таблицы разделов GPT, созданной с разным размером логического сектора
  • Interesting Posts

    Я пытаюсь подсчитать и распечатать имена файлов песен, используя awk, следующим образом

    Sed: поиск и замена шаблона, который обертывается в следующую строку

    Использовать файл в каталоге как аргумент, но без расширения

    Что вызывает исключения ata в моем syslog и как их решить

    Утилита для получения двоичного представления из строки?

    Удалите определенное (известное) расширение из имени файла, если оно есть

    Как запустить процесс на ночь на удаленном сервере после выхода из системы ssh

    Постоянное изменение разрешений / var / run / postgresql

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

    Как связать файлы .doc с LibreOffice Writer

    Kali Linux: apt-get update возвращает ошибку «Ошибка хэш-суммы»

    Как я могу записать диск io на каждый процесс с течением времени

    ps aux: zero VSZ

    Обеспечьте надежную систему против неожиданных потерь мощности

    Почему количество грязных страниц всегда равно 0 на 2.6?

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