Ha spiegato il file del kernel di Linux

Ha spiegato il file del kernel di Linux
Nello sviluppo del software, il processo di creazione e gestione di repository di codice di grandi dimensioni può diventare facilmente molto complesso.

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:

  1. Makefile: Questo è il file make top situato nella radice di origine.
  2. Arch/$ (arch) makefile: Questo è l'arco makefile; Agisce come un supplemento al massiccio.
  3. .Config: Questo è il file di configurazione del kernel.
  4. Script/Makefile.*: Questo definisce le regole impostate per tutti i makefiles kbuild.
  5. Kbuild Makefiles: Ci sono circa 500 kbuild makefiles e non sono molto facili da leggere. Considera un file come:

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:

  • Config: Questo viene utilizzato per aggiornare il file di configurazione del kernel utilizzando il programma di riga.
  • Menuconfig: Questa è una funzione o un meccanismo KConfig che offre l'accesso basato sui menu alle opzioni del kernel. Per lanciare MenuConfig e altre funzionalità KConfig, dovresti essere all'interno della directory del progetto della piattaforma. È possibile utilizzare quanto segue per avviare la funzione KConfig Menuconfig. Tuttavia, puoi anche lanciare MenuConfig con altre funzionalità di configurazione del kernel Linux GUI come XConfig e GConfig.
  • Crea linux-windriver.Menuconfig - Esegue MenuConfig in una sessione di terminale separata.
  • GConfig e XConfig: GConfig attiva le caratteristiche del kernel Linux basate su GUI. GConfig impiega l'interfaccia utente basata su GTK o (X). D'altra parte, XConfig utilizza l'interfaccia utente basata su QT. Utilizzare i seguenti comandi per avviare GConfig e XConfig, rispettivamente:
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.

  • Nconfig: La funzione NConfig esegue la configurazione corrente (buildtools) e si applica al programma basato sul menu NCURSES. Ciò consente di selezionare i pacchetti da costruire, come CPU, driver e filesystem durante la costruzione del kernel. Usa il comando: fare nconfig.
  • OldConfig: La funzione OldConfig ti consente di applicare più nuove .File di configurazione su file di configurazione del kernel più vecchi. Ad esempio, un vecchio .File di configurazione e un nuovo .Il file di configurazione (versione del kernel più recente) avrà differenze, il che significa che è necessario aggiornare la configurazione corrente prima della build del kernel. È possibile utilizzare Make OldConfig per aggiornare la vecchia configurazione in modo interattivo applicando le opzioni mancanti nel vecchio file di configurazione.
  • Defconfig: Questa funzione consente al sistema di build del kernel di aggiungere una nuova configurazione fornita da DEFConfig a .File di configurazione. Più precisamente, il sistema KBuild controlla tutti i file KConfig. Se DefConfig specifica un'opzione nel file, il sistema KBuild utilizza il valore specificato per aggiungere l'opzione a .configurazione. Se il DEFConfig non menziona l'opzione, Kbuild utilizza i valori predefiniti nel .configurazione.

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.
  • SaveDefConfig: Questa regola salva la corrente .config in forma di ./defconfig, che è considerato un file di configurazione minimo. Usa il comando: Make SaveDefConfig
  • ListNewConfig: Questo viene utilizzato per elencare nuove opzioni.
  • Kvmconfig: Ciò consente le opzioni per il supporto KVM. Usa il comando: crea kvm_guest.configurazione
  • AllyesConfig: Questo crea un nuovo file di configurazione del kernel con tutte le opzioni impostate su Sì. È l'opposto di Allnoconfig.
  • AllModConfig: Questo crea una nuova configurazione del kernel con cui i moduli sono abilitati per impostazione predefinita.
  • RandConfig: Questo crea un nuovo file di configurazione del kernel con risposte casuali a tutte le opzioni.
  • TinyConfig: Questo rende possibile il kernel più piccolo.

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:

  • autoconf.H: Questo viene utilizzato per i file di origine della lingua C.
  • auto.conf e tristate.Conf: Questi sono usati per l'elaborazione del testo makefile.
  • /include/config: Questi sono file di intestazione vuoti utilizzati nel monitoraggio della dipendenza.

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.