Драйвер устройства - это фрагмент кода, который реализует интерфейс между устройством и (обычно) ядром операционной системы. В связи с этим оно обязательно зависит от операционной системы, для которой оно предназначено - это является основной целью, чтобы эта операционная система знала об устройстве и позволяла ему использовать его функции.
Это не означает, что код для драйвера устройства не может быть общим в разных ОС. Некоторые их части могут быть переносимыми (сторона устройства), но сторона интерфейса (которая взаимодействует с ОС) зависит от API, который определяет / предоставляет ОС.
Расположение в памяти полностью зависит от системы. Не должно быть никаких особых политик расположения памяти для драйверов по сравнению с другими службами ядра. Само устройство вполне может накладывать ограничения на расположение памяти, но это уже другая тема.
ОС определяет, как она взаимодействует с драйверами устройств через API. У вас есть документация о том, как Linux делает это в этой (замечательной) книге. Другие ОС могут сделать это по-другому - разработчики ОС устанавливают правила. Если вы создаете ядро, вы определяете API.
Горячая замена не легка. Один из способов сопоставления состоит в том, чтобы использовать некоторую форму справочной таблицы с информацией от устройства в качестве «ключа» и подходящей структурой / указателем драйвера устройства / любым другим в качестве значения, или наоборот (с API в ваших драйверах). это позволяет узнать, какие идентификаторы устройств могут обрабатывать). Идентификаторы устройств могут быть идентификаторами устройств PCI, USB-идентификаторами, ... в зависимости от шины и типа устройства.