Я думаю, что сначала вам нужно выяснить, как работает отображение памяти. Что такое адресное пространство и как оно связано с физической памятью. Затем вы можете прочитать о том, как аппаратное обеспечение отображается в адресном пространстве и как получить к нему доступ. Это большое количество документов для чтения. Часть этой информации содержится в Linux Проекте документации.
Кроме того, некоторые знания об электронике c будут полезны.
В целом - Linux для связи с устройствами нужен какой-то «канал» связи. Этот канал может быть, например, ISA, PCI, USB и др. c шина. Например, устройства PCI являются устройствами отображения памяти, и ядро Linux связывается с ними через доступ к памяти. Поэтому сначала Linux необходимо увидеть данное устройство в некоторой области памяти, а затем он может сконфигурировать это устройство и установить с ним связь.
В случае USB-устройств это немного сложно, потому что USB-устройства не отображены в памяти. Сначала необходимо настроить USB-хост, чтобы иметь возможность общаться с USB-устройствами. Каждая связь с USB-устройством осуществляется через USB-хост.
Есть также устройства, которые не подключены через ISA, PCI или USB. Они подключены напрямую к процессору и видны под некоторым адресом памяти. Это решение обычно реализуется во встроенных устройствах. Например, процессоры ARM используют этот подход.
Что касается udev - это приложение пользовательского пространства, которое прослушивает события из ядра Linux и помогает другим приложениям распознавать добавление и настройку устройства.