Обычно вы должны делать это в пользовательском пространстве - реализовать протокол вашего устройства в обычной пользовательской программе.
Возможно, но определенно не рекомендуется делать эти вещи в ядре. Например, драйвер ppp реализует сетевой драйвер поверх последовательного драйвера. Я не знаю, как это работает в этом случае, но я ожидаю, что вспомогательная программа в пространстве пользователя откроет устройство, инициализирует его параметры и т. Д., А затем передаст дескриптор файла в ядро с помощью какого-либо системного вызова.
Вы не можете вызывать произвольные библиотечные функции из ядра или вообще любые библиотечные функции (кроме библиотек, которые фактически поставляются как часть ядра). Это включает системные вызовы ядра. Существуют эквивалентные функции, которые можно вызывать, например, filp_open.
В большинстве случаев вы не можете просто вызвать нормальный системный вызов из ядра, так как они ожидают, что указатели будут указывать на данные пространства пользователя, но в вашем ядре (выделенном через kalloc и т. Д.) Обычно указывается на данные пространства ядра. Эти два не могут быть свободно смешаны.