Книга: Разработка ядра Linux
Потоки в пространстве ядра
Потоки в пространстве ядра
Часто в ядре полезно выполнить некоторые операции в фоновом режиме. В ядре такая возможность реализована с помощью потоков пространства ядра (kernel thread) — обычных процессов, которые выполняются исключительно в пространстве ядра. Наиболее существенным отличием между потоками пространства ядра и обычными процессами является то, что потоки в пространстве ядра не имеют адресного пространства (значение указателя mm
для них равно NULL
). Эти потоки работают только в пространстве ядра, и их контекст не переключается в пространство пользователя. Тем не менее потоки в пространстве ядра планируются и вытесняются так же, как и обычные процессы.
В ядре Linux потоки пространства ядра выполняют определенные задания, наиболее часто используемые, — это pdfush и ksoftirq. Эти потоки создаются при загрузке системы другими потоками пространства ядра. В действительности поток в пространстве ядра может быть создан только другим потоком, работающим в пространстве ядра. Интерфейс для запуска нового потока в пространстве ядра из уже существующего потока следующий:
int kernel_thread(int (*fn)(void*), void* arg, unsigned long flags);
Новая задача создается с помощью обычного системного вызова clone()
с соответствующими значениями флагов, указанными в параметре flags. При возврате из системного вызова родительский поток режима ядра завершается и возвращает указатель на структуру task_struct
порожденного процесса. Порожденный процесс выполняет функцию, адрес которой указан в параметре fn
, в качестве аргумента этой функции передается параметр arg
. Для указания обычных флагов потоков пространства ядра существует флаг CLONE_KERNEL
, который объединяет в себе флаги CLONE_FS
, CLONE_FILES
и CLONE_SIGHAND
, так как большинство потоков пространства ядра должны указывать эти флаги в параметре flags
.
Чаще всего поток пространства ядра продолжает выполнять свою функцию вечно (или, по крайней мере, до перегрузки системы, но когда она произойдет в случае ОС Linux- неизвестно). Функция потока обычно содержит замкнутый цикл, в котором поток пространства ядра по необходимости возобновляет выполнение, исполняет свои обязанности и снова переходит в приостановленное состояние.
В следующих главах более детально будут рассмотрены конкретные примеры потоков пространства ядра.
- Структура mm_struct и потоки пространства ядра
- Удаленные потоки
- Облегченные потоки
- 4.2.1. Синхронные и асинхронные потоки
- 10.4 ПОТОКИ
- Глава 31 Потоки (STREAMS)
- Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
- 1.1 Режимы ядра и пользователя Windows
- 1.2 Процесс, контекст процесса и потоки
- 3.8. Обновление ядра
- 3.8.2. Обновление ядра из RPM-пакета
- 3.8.3. Компиляция ядра