Ключ к ответу находится в протоколе, как вы намекаете. Это может быть не всегда красиво, и иногда вы замыкаетесь в дизайне.
Однако сама архитектура ПК является доказательством возможности прямого обнаружения.
Часто вполне возможно загрузить ядро Linux, скомпилированное, скажем, в 1996 году, на системе, купленной сегодня. Система Linux, возможно, не сможет использовать большую часть аппаратного обеспечения в этой системе, но обнаружит, что все подмножество остается тем же.
Требуется, однако, либо очень разумная схема обнаружения оборудования, либо готовность жить с ключами (см. Настройку линии A20 на ПК, изначально использующих контроллер клавиатуры) или и то и другое одновременно. (Например, сегодня почти все ПК имеют внутреннюю шину ISA для поддержки клавиатуры PS / 2, но также имеют протокол PCI.)
Для работы я разработал формат ID ROM для дочерних плат. У них была компактная двоичная XML или Lisp-подобная структура с несколькими обязательными полями, несколькими необязательными и номером версии. Любое совершенно новое оборудование может увеличивать номер версии и добавлять любые данные, необходимые для нового программного обеспечения, и в то же время сообщать старому программному обеспечению, что уместно в старых полях.
Так что, по крайней мере, старое программное обеспечение может определить идентификатор платы, назначение и затем сдаться. Вот как работают устройства USB. Все старое программное обеспечение может перечислять новые устройства, но далеко не очевидно, что старое программное обеспечение может управлять новым оборудованием любым значимым способом. Исключение составляют клавиатуры, мыши и карты памяти, где все придерживаются старого, так сказать, уровня приложений, протоколов.