Per gestire e ridurre questa complessità, gli sviluppatori di software organizzano codice in piccoli file che si collegano a moduli specifici. Gli sviluppatori possono compilare ciascuno di questi file separatamente e quindi collegarli insieme per creare un software finale eseguibile.
Un esempio di ciò sono i progetti C costituiti da file di codice sorgente in .C ESTENZIONI E INFERFAZIONI DI SOFTURA IN .estensioni h. Ogni file di origine viene compilato insieme ai file di intestazione da creare. o Oggetti collegati insieme usando le librerie, creando così file eseguibili.
Per eseguire questo processo, gli sviluppatori di software utilizzano strumenti, come fare, per automatizzare il processo di build e le dipendenze dei file richieste. Make usa makefiles per gestire il comportamento del processo di compilazione.
Gli strumenti GNU Make forniscono una serie di regole e convenzioni utilizzate per creare makefile e ridurre la complessità nel migliorare l'efficienza.
In questo tutorial, discuteremo dei makefile del kernel Linux, in particolare Kconfig E Kbuild.
Prima di iniziare, è bene notare che questo articolo non finge di insegnare tutto sul sistema di costruzione del kernel. Tuttavia, forniamo una panoramica di alto livello della costruzione di un'immagine e dei moduli VMLinux.
Se desideri informazioni oltre lo scopo di questo tutorial, ti consigliamo la seguente risorsa per informazioni migliori:
https: // linkfy.a/gomakefilesdocs
https: // linkfy.a/gnumake
Kernel Makefiles: una panoramica
Il sistema di build del kernel, chiamato anche il sistema di configurazione, è uno strumento essenziale per coloro che ne hanno bisogno-che è in circolazione da un po '. Tuttavia, non tutti useranno questo sistema; Anche i driver e altri sviluppatori di software di basso livello lo usano raramente. Dato che stai leggendo questo, significa che vuoi saperne di più sul sistema di build del kernel.
Pertanto, discuteremo di come viene compilato il kernel e discuteremo il sistema Kbuild e KConfig in modo da poterli capire meglio.
Il Kernel Makefile ha cinque componenti principali:
https: // elisir.Bootlin.com/linux/ultimo/source/scripts/kbuild.includere
Kconfig
Il file kconfig contiene moduli che aiutano quando si utilizzano *config. Aiuta il kernel a fare configurazioni selettive, creando modularità e personalizzazione per il processo di costruzione del kernel.
Esistono vari obiettivi di configurazione specificati dal sistema KConfig. È possibile utilizzare l'aiuto per visualizzare gli obiettivi disponibili. Questi obiettivi sono elaborati da vari programmi forniti dal kernel durante il processo di build.
Alcuni obiettivi KConfig includono:
Crea linux-windriver.Menuconfig - Esegue MenuConfig in una sessione di terminale separata.
Crea linux-windriver.gconfig
Crea linux-windriver.XConfig
NOTA: Per utilizzare GConfig e XConfig, è necessario avere gli strumenti di sviluppo QT installati sul sistema host.
Considera quanto segue:
DEFConfig Code Snapshot dalla seguente risorsa:
https: // elisir.Bootlin.com/linux/v5.9/Source/Scripts/KConfig/MakeFile#L98
1. defconfig: $ (obj)/conf
2. ifneq ($ (wildcard $ (srctree)/arch/$ (srcarch)/configs/$ (kbuild_defconfig)),)
3. @$ (kecho) "*** La configurazione predefinita si basa su" $ (kbuild_defconfig) ""
4. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. altro
6. @$ (kecho) "*** La configurazione predefinita si basa su Target '$ (kbuild_defconfig)'" "
7. $ (Q) $ (make) -f $ (srctree)/makefile $ (kbuild_defconfig)
8. finisci se
9.
10. %_DefConfig: $ (OBJ)/conf
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configFiles = $ (wildcard $ (srctree)/kernel/configs/$@ $ (srctree)/arch/$ (srcarch)/configs/$@)
14.
15. %.config: $ (obj)/conf
16. $ (se $ (chiama configfiles) ,, $ (errore non esiste alcuna configurazione per questo obiettivo su questa architettura)
17. $ (Q) $ (config_shell) $ (srctree)/scripts/kconfig/marge_config.sh -m .config $ (configfiles)
18. $ (Q) $ (make) -f $ (srctree)/makefile olddefconfig
OldConfig Code Snapshot dalla seguente risorsa:
https: // elisir.Bootlin.com/linux/v5.9/Source/Scripts/KConfig/Conf.C#L694
1. Case olddefconfig:
2. predefinito:
3. rottura;
4.
5.
6. if (input_mode == savedefconfig)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (Stderr, "N *** Errore durante il salvataggio di DefConfig a: %s \ n \ n",
9. defconfig_file);
10. Ritorno 1;
11.
12. else if (input_mode != listNewConfig && input_mode != helpnewconfig)
13. Se (!no_conf_write && conf_write (null))
14. fprintf (stderr, "\ n *** Errore durante la scrittura della configurazione.\ n \ n ");
15. uscita (1);
16.
17.
18. /*
19. * Crea auto.Conf Se non esiste.
20. * Questo impedisce a GNU fare 4.1 o più di emissione
21. * "Includi/config/auto.Conf: nessun file o directory di questo tipo "
22. * Nel makefile di alto livello
23. *
24. * SyncConfig crea sempre o aggiorna automaticamente.conf perché lo è
25. * usato durante la build.
26. */
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (Stderr,
29. "\ n *** Errore durante la sincronizzazione della configurazione.\ n \ n ");
30. Ritorno 1;
31.
32.
33. restituzione 0;
34.
Ci sono molti obiettivi nel sistema KConfig. Alcuni comuni includono config e menuconfig.
Come accennato, gli obiettivi vengono elaborati da vari programmi nei sistemi host, fornendo una GUI o una riga di comando. È possibile trovare strumenti KConfig in /Scripts /KConfig nella sorgente del kernel.
https: // elisir.Bootlin.com/linux/ultimo/source/scripts/kconfig
https: // elisir.Bootlin.com/linux/ultimo/source/scripts/kconfig/makefile
Il primo processo è di solito a leggere il file KConfig nella directory root, che viene utilizzato per creare un database di configurazione iniziale. Mentre il processo continua, il database viene aggiornato quando si legge i file nel seguente ordine:
.configurazione
/lib/moduli/$ (shell, uname-r)/.configurazione
/etc/kernel-config
/boot/config-$ (shell, uname-r)
Arch_defconfig
Arch/$ (arch)/defconfig
.Il file di configurazione viene quindi rilasciato su SyncConfig, che accetta il .File di configurazione come input. Elabora i file di file e emette, che vengono quindi classificati in varie categorie come:
File kbuild
Quasi tutti i file del kernel sono makefile Kbuild che utilizzano l'infrastruttura KBuild, che è una funzione di creazione ricorsiva. La marca ricorsiva è un modo di utilizzare lo strumento Make come comando in un makefile. La ricorsione è molto utile quando si compila un grande progetto.
Kbuild funziona facendo riferimento a tutti i file che abbiamo menzionato nella sezione sopra.
Il sistema KBuild crea i suoi componenti utilizzando il makefile superiore che include Arch MakeFiles con il nome Arch/$ (Arch)/Makefile nei file di configurazione. Scende ricorsivamente in sottodirectory che invocano i componenti usando le routine negli script/makefile.*. Kbuild quindi si basa sull'oggetto adiacente e li collega agli oggetti, creando vmlinux.
Per saperne di più sulla sintassi utilizzata in Kbuild Makefiles, fare riferimento alla documentazione.
Considera il seguente script.
https: // github.com/torvalds/linux/blob/master/scripts/link-vmlinux.sh
I file Object O utilizzati per creare VMLinux sono compilati per primi nei rispettivi integrati .Un file come var kbuild_vmlinux_init, main, libs. Questi sono composti in vmlinux.
https: // github.com/torvalds/linux/blob/master/scripts/makefile.costruire
Conclusione
In questa guida, abbiamo dato un'occhiata ai sistemi KBuild e KConfig nel sistema di build del kernel e come funziona. Come abbiamo detto all'inizio del tutorial, gli argomenti discussi sono ampi e non possono essere coperti in un singolo tutorial.