Aggiungerei che è fondamentale conoscere l'architettura dei calcolatori e poi quella del target ( x86, ARM o che altro ). Una conoscenza degli algoritmi e delle strutture dati tipici.
Infine tematiche dei sistemi operativi, tipo gestione della memoria, filesystem, ecc... quindi uno studio almeno basilare su un buon libro di sistemi operativi.
Poi c'è la possibilità di usare risorse più pratiche e studiare man mano. Tipo questa
https://www.amazon.it/dp/0136379508/?tag=tomsforum-21 o questa
https://github.com/AllenDowney/ThinkOS o ancora "Writing a Simple Operating System from Scratch"
Lo studio di un OS educativo tipo HelenOS o xv6. Quest'ultimo c'ha pure un libretto "xv6 a simple, Unix-like teaching operating system".
E ovviamente ci saranno delle cose che non capirai all'inizio, per cui sarebbe necessario approfondirle altrove. Per esempio io iniziai anni fa col libro "Programming the 8086/8088" di Coffron.
Ci sono delle cose dei computer che non sono affatto intuitive per i novizi. Per esempio il fatto che dati ed istruzioni siano praticamente la stessa cosa dal punto di vista del processore. Puoi benissimo fare un jump nel bel mezzo di un'array e il processore comincerà ad eseguire la roba che trova lì. Ovviamente al 99% si bloccherà perchè quei dati non contengono una sequenza di istruzioni che faccia qualcosa di sensato.
Oppure si parla tanto di file binari, ma non è che dentro c'è 0010111100.... quando lo apri vedi una sfilza di ghirigori in ASCII. Per chi programma solo ad alto livello, spesso è facile non considerare queste cose.
Tanto per dire, il libro di Coffron contiene le codifiche binarie delle istruzioni 8086. All'epoca ( non avendo un assemblatore, perchè costavano ) scrivevo programmi in assembly a mano, poi li trasformavo nelle giuste sequenze binarie, che poi traducevo in byte ( cioè il numeretto da 0 a 255 ) e le mettevo in un programma Basic sotto forma di Data e glieli facevo scrivere sul file binario ( .com, all'epoca non avevo informazioni sulla struttura degli .exe ).
E questa cosa mi aiutò a capire parecchio del concetto di codifica e del fatto che uno stesso oggetto può essere rappresentato in tanti modi diversi.
Però ripeto, sono quei dettagli talmente a basso livello, che il 99% dei programmatori non li considera e talvolta non li conosce.
Riguardo i libri ( e qualcuno sarà per forza necessario ) considera quelli accoppiati ad un OS realmente sviluppato. xv6, Mika, Xinu, Minix. Quest'ultimo è realizzato da Tanenbaum e i suoi studenti, è usato per davvero in molte applicazioni ( il management engine dei processori x86, ad esempio ) e l'autore ha un modo di spiegare le cose molto scorrevole e comprensibile.
Potresti semplificarti la vita con questo
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/
E' un corso molto ben fatto, sulla programmazione di un OS per Raspberry Pi 1. Il problema è che è fermo alla versione 1 del Raspberry e va modificato per essere usato con le ultime varianti. Il lato positivo è che è fatto apposta per insegnare i concetti fondamentali. Il vantaggio è che col RPi ci puoi giocare come ti pare, senza incasinare il pc ( ok oggi si usano le virtual machine per questo genere di cose ).