Quali driver di dispositivo sono integrati nel kernel?


14

Di recente ho installato un fornitore di Linux incorporato su un dispositivo hardware. Quando ho eseguito lsmodsulla riga di comando del dispositivo la risposta era vuota. Sono stato portato a credere che questo significhi che i driver per l'hardware in esecuzione sul dispositivo erano stati integrati nel kernel anziché come file .ko. La mia domanda è questa: come avviene questo processo?

Il supporto per l'hardware popolare viene gradualmente integrato nel kernel nelle versioni successive sostituendo così i file .ko? Il file .ko viene semplicemente utilizzato per supportare il nuovo hardware che non ha il supporto del driver integrato del kernel al momento del rilascio? Per quanto ne sapessi, pensavo che tutti i driver hardware fossero in forma di file .ko ma chiaramente questo è sbagliato.

Sono un po 'confuso dall'intero processo e sarei grato per chiarimenti poiché ho la sensazione che potrei guardare la situazione nel modo sbagliato.


Risposte:


10

I driver core considerati critici per il caricamento del kernel sono generalmente integrati nel kernel, mentre altri driver hardware, ecc. Sono costruiti come moduli o file .ko .

I moduli .ko vengono generalmente archiviati nella /libdirectory della partizione di root. Per usare uno di questi, il kernel deve prima essere in grado di rilevare e accedere al dispositivo di archiviazione sottostante e quindi accedere al suo filesystem. Quindi è lecito ritenere che un kernel privo di supporto SATA / SCSI e ext2 / 3/4 integrato non si avvierà realmente;)

Puoi scegliere di cambiare la maggior parte dei driver del kernel incorporati nel modulo. Il team del kernel Ubuntu decide se modificare la configurazione predefinita del team del kernel Linux e includere / escludere driver integrati aggiuntivi per le immagini del kernel stock scaricate.

Se compili il tuo kernel, puoi fare lo stesso:

inserisci qui la descrizione dell'immagine

  • Nella schermata sopra, *indica un driver integrato, mentre Mindica un modulo.
  • Il supporto dei dispositivi di loopback, che è spesso essenziale per l'avvio di un sistema, è integrato per impostazione predefinita.
  • Anche il driver USB a bassa velocità (USB 1.0) è integrato per impostazione predefinita per consentire l'avvio da una chiavetta USB, ma qui l'ho modificato in un modulo.

Grazie che aiuta molto. Immagino che avrò una migliore comprensione di questo quando alla fine eseguirò da zero una build del kernel.
matematico,

3

Quando si compila un kernel , si arriva a configurare quali componenti sono installati. Non solo, ma puoi scegliere se sono integrati nel kernel o se sono un modulo .

Ad esempio, molte persone usano il filesystem ext2 sulla loro partizione / boot . Per questo motivo, il kernel deve essere in grado di leggere i filesystem ext2 all'avvio. Per fare ciò, il modulo ext2 è integrato nel kernel stesso.

Ora, immagina la quantità di moduli disponibili. Non avrebbe senso averli tutti integrati nel tuo kernel, vero? Questo è il motivo per cui puoi costruirli come moduli .ko separati e caricarli a piacimento.


1
Sì, il tuo ultimo paragrafo è ciò che ha motivato la mia domanda a essere onesti. Grazie per la risposta
matematico

1

Dipende da come hai configurato la tua build del kernel linux.

All'interno di un processo di compilazione di solito puoi:

  • compilare il kernel con o senza il supporto del modulo (spesso viene fornito con il supporto del modulo)
  • compilare un driver come modulo o come parte integrante del software direttamente nel kernel

per capire cos'è un file .ko per /programming/10476990/difference-between-o-and-ko-file

Il motivo per cui hai un output vuoto lsmodè perché hai un kernel monolitico.

Un modo rapido per elencare tutti i moduli (se presenti) è eseguendo questo comando

find /lib/modules/*/ -type f -iname '*.ko' | less

notare l'uso di less, è possibile utilizzare ogni cercapersone che si desidera o reindirizzare l'output dove si desidera.


Quindi su un kernel configurato senza il supporto del modulo (come il mio sembra essere) non sarei in grado di installare alcun driver sotto forma di file .ko per usare hardware aggiuntivo?
matematico,

sì, in pratica devi ricompilarlo dal sorgente, se vuoi modificare e / o aggiungere driver devi ricostruirlo, magari usa lo stesso .config file e modificalo di cui hai bisogno.
user827992,

Quindi per fare questo avrei bisogno di ottenere il sorgente del kernel dal fornitore, compilarlo io stesso con le modifiche corrette al file .config, quindi sarò buono per installare altri driver?
matematico,

dipende, se ha usato un kernel vanilla (senza nient'altro che il codice sorgente originale) stai bene solo con .config e puoi riprodurre lo stesso kernel solo con il tuo pc, tuttavia se ha usato un kernel vanilla + alcune patch o modifiche hai bisogno di queste informazioni extra, un Makefile personalizzato potrebbe anche essere considerato come una variabile rilevante come qualsiasi altra modifica alla toolchain standard e in generale al processo di compilazione standard.
user827992,

La mia esperienza è che i moduli sono disabilitati per Linux incorporato, per motivi di velocità e dimensioni, e che i kernel di tali dispositivi spesso contengono driver out-of-tree e sono costruiti su PC di alcuni dipendenti casuali senza il vantaggio del controllo del codice sorgente. Buona fortuna.
Stephen M. Webb,

0

Vedi il contenuto del file / lib / modules / $ (uname -r) /modules.builtin

ad es. per cercare un modulo specifico

grep <module> /lib/modules/$(uname -r)/modules.builtin

Documentazione / kbuild / kbuild.txt

modules.builtin
--------------------------------------------------
This file lists all modules that are built into the kernel. This is used
by modprobe to not fail when trying to load something builtin.

??? Non sono sicuro di cosa dovrebbe fare l'OP. Dovrebbe eseguire la prima linea nel terminal? Questa potrebbe essere la risposta, ma ti prego di elaborare un po '?
anonymous2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.