Posso pensare a molteplici modi in cui puoi lavorare all'interfaccia dell'hardware e del software:
1.) Scrivere il proprio compilatore o assemblatore per una data Instruction Set Architecture (ISA)
Scommetto che probabilmente sai cos'è l'ISA, ma nel caso tu non lo sappia, è - in parole povere - un accordo tra l'hardware e il software su ciò che ciascuno si aspetta dall'altro.
Scrivere un compilatore o un assemblatore richiederebbe la comprensione di una data ISA: si dovrebbe imparare quali risorse hardware e istruzioni macchina sono disponibili, come vengono gestiti gli interrupt e le chiamate di funzione, come vengono memorizzati i dati, e molto altro (come descritto nell'ISA). Dovresti poi sfruttare queste informazioni accumulate per prendere il codice scritto e tradurlo in codice macchina equivalente ed eseguibile.
2.) Emulare un vecchio computer
Questo è un progetto a cui sto lavorando. Questo progetto richiederebbe uno studio approfondito del computer: quale processore e quali periferiche aveva, come funzionava quel processore e come funzionavano quelle periferiche. Poi, usando questa comprensione, si dovrebbe scrivere un programma che possa caricare con successo applicazioni scritte per la macchina originale ed eseguirle nello stesso modo della macchina originale.
Io suggerirei di scrivere un emulatore per una vecchia console per videogiochi perché c'è una grande quantità di documentazione per queste macchine, e una volta costruito, si avrebbe una ragione per usare effettivamente l'emulatore (se vi piacciono i vecchi videogiochi).
3.) Hack a Kernel
Ho una comprensione molto vaga di cosa sia questo, ma credo che sia soprattutto scrivere codice che modifica il nucleo di un sistema operativo come Linux. Questo nucleo - il kernel - è ciò che gestisce l'esecuzione dei programmi e l'interazione del software con l'I/O e la memoria. Quindi, proprio come scrivere un compilatore o un assemblatore, l'hacking/sviluppo del kernel ti permetterebbe di lavorare molto da vicino con l'hardware di un computer general purpose dal lato del software e in un modo molto pratico.
4.) Costruisci il tuo computer
Se hai i mezzi, potresti costruire il tuo computer. E non intendo comprare un processore, memoria, case e quant'altro e assemblarlo. No, intendo dire impazzire e progettare la propria ISA, costruire un processore basato su di essa da zero (usando microchip), e interfacciarlo con memoria e I/O (anch'essi potenzialmente costruiti da zero).