Se me ocurren múltiples formas en las que puedes trabajar en la interfaz de hardware y software:
1.) Escribir tu propio compilador o ensamblador para una determinada arquitectura de conjuntos de instrucciones (ISA)
Apuesto a que probablemente sabes lo que es la ISA, pero en caso de que no lo sepas, es -simplemente- un acuerdo entre el hardware y el software sobre lo que cada uno espera del otro.
Escribir un compilador o ensamblador requeriría entender una ISA determinada: tendría que aprender qué recursos de hardware e instrucciones de máquina están disponibles, cómo se manejan las interrupciones y las llamadas a funciones, cómo se almacenan los datos y mucho más (como se describe en la ISA). A continuación, aprovecharías esa información acumulada para tomar el código escrito y traducirlo a un código máquina equivalente y ejecutable.
2.) Emular un ordenador antiguo
Este es un proyecto en el que estoy trabajando. Este proyecto requeriría que hicieras un estudio en profundidad del ordenador: qué procesador y periféricos tenía, cómo funcionaba ese procesador y cómo funcionaban esos periféricos. Luego, utilizando esa comprensión, escribirías un programa que pudiera cargar con éxito las aplicaciones escritas para la máquina original y ejecutarlas de la misma manera que lo hacía la máquina original.
Sugeriría escribir un emulador para una vieja consola de videojuegos porque hay una gran cantidad de documentación para esas máquinas, y una vez que lo hayas construido, tendrías una razón para usar realmente el emulador (si resulta que te gustan los videojuegos antiguos).
3.) Hackear un Kernel
Tengo una comprensión muy vaga de lo que es esto, pero creo que es sobre todo escribir código que modifica el núcleo de un sistema operativo como Linux. Este núcleo -el kernel- es el que gestiona la ejecución de los programas y la interacción del software con la E/S y la memoria. Así que -al igual que escribir un compilador o ensamblador- hackear/desarrollar el núcleo te permitiría trabajar muy de cerca con el hardware de un ordenador de propósito general desde el lado del software y de una manera muy práctica.
4.) Construye tu propio ordenador
Si tienes los medios, podrías construir tu propio ordenador. Y no me refiero a comprar un procesador, memoria, carcasa y lo que sea y montarlo. No, me refiero a que te vuelvas loco y diseñes tu propia ISA, construyas un procesador basado en ella desde cero (usando microchips), y lo interconectes con la memoria y las E/S (también potencialmente construidas desde cero).