ErmesPalinsesto Di base, qualsiasi sistema operativo (inteso come pacchetto software che sovraintende i vari programmi) è programmato in C (anche in assembler ma non mi dilungo su questo) essendo il linguaggio "moderno" (aggiornato/supportato sarebbe quasi più consono) più vicino al linguaggio macchina. Una volta che hai creato le tue syscalls (ed una API facendo in modo di controllare meglio come esse vengono usate) puoi svilupparci sopra utilizzando linguaggi più ad alto livello.
Ovviamente un router è, nella maggioranza dei casi d'uso domestici, un dispositivo a bassa potenza che richiede un sistema operativo leggero in quanto la maggior parte del tempo CPU deve essere assegnata al routing dei pacchetti.
Detto questo, quando hai finito di scrivere un firmware (che includa algoritmi altamente efficienti, specie se si parla di un router con poca potenza) puoi svilupparci sopra un web server o qualsivoglia tipo di interfaccia (telnet, ssh, ecc...) utilizzando linguaggi ad alto livello.
E questo non tiene conto delle varie architetture diverse per le CPU usate nei ruoter (x86/x64, ARM, MIPS, ecc...) e dei vari compilatori, dei driver per i vari chip che, specialmente se parti da zero, dovrai scrivere te. E' un lavoro incredibilmente complicato, che un solo sviluppatore potrebbe impiegarci anni per finire.
Se vuoi programmare qualcosa su un router, prendilo bello potente e con software basati su soluzioni con una fondazione solida, altrimenti meglio non cimentarsi in queste operazioni...
Ovviamente non mi sono soffermato sui dettagli, ma come generalizzazione credo vada bene.