"Монолитное ядро", между прочим, таки более гибкое, чем многие
"типа-ООП" системы. 1. Клиенту файловых устройств пофигу, как оно реализовано за read()/write()/ioctl()
2. Замечательная вещь ioctl - код обработчика имеет право реагировать на любые данные, переданные в аргументе. Это очень похоже на тот самый "обмен сообщениями" из реального ООП