Все зависит от того, что вы подразумеваете под «взаимодействовать с ядром». Пользовательский интерфейс ядра, наиболее часто используемый в мире UNIX, - это основные системные вызовы (открытие, чтение, запись), работающие с файлами (включая узлы устройств в /dev
и «специальные файлы» в /proc
и /sys
в Linux ) и они доступны практически на любом языке (cat /dev/random
- это взаимодействие с ядром, поэтому оболочка «достаточно хороша для взаимодействия с ядром»).
Кроме того, большинство системных вызовов более низкого уровня доступны непосредственно на большинстве языков: ioctl
, fcntl
, API сокетов и т. Д., Но их использование может оказаться сложным, когда внутренние структуры (изначально определенные в языке C) используется.
Если вы хотите вызывать системные вызовы напрямую (а не обертками libc), вы обычно выбираете C, C ++ (даже не связываясь со стандартной библиотекой) или ассемблер. Но идти по этому пути не имеет смысла даже в качестве упражнения, если только вы не хотите написать собственный libc или что-то в этом роде.
Сначала решите, каковы ваши цели и какое именно «взаимодействие» вы хотите, затем выберите самое простое решение (язык высокого уровня, который вы знаете). Я часто использую Python для «взаимодействия с ядром».