Come effetto collaterale di un progetto incorporato su cui ho lavorato, ho sviluppato un piccolo sistema operativo per un processore ARM. Mentre il sistema operativo e il mio codice utente sono in directory separate e hanno dei confini puliti tra di loro, sono integrati in una singola immagine utilizzando un singolo Makefile.
Mi piacerebbe rilasciare il sistema operativo come open source. Consiste in una libreria di driver exokernel e userland.
Quello che sto cercando di decidere è come un utente di questo sistema operativo dovrebbe combinarlo con il proprio codice in fase di compilazione in modo da avere una singola immagine da far lampeggiare. Posso pensare a tre possibilità:
1) L'utente include i file sorgente del SO come parte del loro progetto. Stanno ricreando il setup che ho attualmente, ed è come FreeRTOS, ad esempio, sembra farlo (anche se ha solo tre file).
2) Avere il sistema operativo si costruisce in un file .a con cui il codice utente può collegarsi. Ciò consentirebbe all'utente di controllare completamente il posizionamento della memoria utilizzando il proprio script linker (e consentire al linker di dirgli quando un testo combinato, una sezione BSS o dati supera il suo spazio).
3) Avere il sistema operativo si costruisce in un binario non elaborato che si aspetta di avere il codice utente concatenato alla fine di esso. Il codice utente inizierebbe con una piccola intestazione (posizionata dallo script del linker) che aveva l'indirizzo della funzione principale. Il codice utente si collegherebbe anche con un file .a dei soli driver userland, non del kernel.
(1) renderebbe più facile sviluppare il sistema operativo e il mio codice utente parallelamente alla sottostruttura di git. (2) sembra avere il processo di collegamento più utile. (3) dà la più grande separazione.
Se lo stavi usando, quale preferisci e perché?