"Если драйвер / модуль предоставляет API-интерфейсы пользовательского пространства для связи с устройством, означает ли это, что системные вызовы, такие как чтение / запись в файл устройства, являются избыточными?"
Что вы здесь указываетеочень похож на драйвер режима опроса, предоставляемый библиотекой DPDK.https://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html Если драйвер предоставляет API-интерфейсы пользовательского пространства, системные вызовы read / write, send / recv станут избыточными.Вы должны использовать API, предоставленные драйвером, для чтения и записи на устройства NIC.Однако, если вы все еще хотите использовать системные вызовы Linux, такие как чтение / запись или отправка / запись, вы можете спроектировать свое приложение таким образом, чтобы после чтения необработанных данных из API драйвера вы «внедрили» необработанные данные в ядро Linux,Вы можете добиться этого, записав необработанные данные в устройство tun / tap и попросив приложение прочитать данные с помощью системных вызовов linux с устройства tun / tap.
"Где именно tcpdump получает свои данные?"
Большинство приложений для отслеживания пакетов обнаруживают пакеты с помощью необработанных сокетов, открытых на уровне l2.https://www.unix.com/programming/229235-raw-socket-programming-efficient-packet-sniffer.html
Найден пост, связанный с tcpdump, который дает более подробное объяснение: https://unix.stackexchange.com/questions/23060/what-level-of-the-network-stack-does-tcpdump-get-its-info-from