Я не уверен, нужен ли вам вообще необработанный сокет в ядре. Внутри ядра вы можете добавить ловушку netfilter или зарегистрировать что-то еще (???), которое будет принимать все пакеты; это может быть то, что вы хотите.
Если вы использовали DID-сокет внутри ядра, то вам, вероятно, понадобится поток ядра (то есть запущенный kernel_thread) для вызова read (). Но это не обязательно должен быть поток ядра, это может быть поток пользовательского пространства, который только что совершил специальный системный вызов или вызов устройства для вызова нужной подпрограммы режима ядра.
Если у вас зарегистрирован хук, контекст, в котором он вызывается, вероятно, не должен выполнять слишком много обработки; Я точно не знаю, что это может быть, это может быть «обработчик нижней половины» или «тасклет», какими бы они ни были (эти типы управляющих структур постоянно меняются от одной версии к другой). Я надеюсь, что на самом деле это не процедура обработки прерываний.
В ответ на ваш оригинальный вопрос:
- Да, sys_read заблокирует вызывающий поток, будь то поток ядра или пользовательский. Система не будет зависать. Однако, если вызывающий поток не находится в состоянии, когда блокировка имеет смысл, ядро будет паниковать (планируя прерывание или что-то в этом роде)
Да, вам нужно будет сделать это в отдельном потоке, нет, это не приведет к зависанию системы. Однако выполнение системных вызовов в режиме ядра очень сомнительно, хотя и работает (вроде).
Но если вместо этого вы установили какой-то хук, вам не нужно будет ничего этого делать.