Perché Linux è chiamato kernel monolitico?


208

Ho letto che Linux è un kernel monolitico. Il kernel monolitico significa compilare e collegare l'intero codice del kernel in un eseguibile?

Se Linux è in grado di supportare i moduli, perché non suddividere tutti i sottosistemi in moduli e caricarli quando necessario? In tal caso, il kernel non deve caricare inizialmente tutti i moduli e potrebbe mantenere un indice delle funzioni nel modulo e caricarle quando necessario.

Risposte:


290

Un kernel monolitico è un kernel in cui tutti i servizi (file system, VFS, driver di dispositivo, ecc.), Nonché le funzionalità di base (pianificazione, allocazione della memoria, ecc.) Sono un gruppo affiatato che condivide lo stesso spazio. Questo si oppone direttamente a un microkernel .

Un microkernel preferisce un approccio in cui la funzionalità principale è isolata dai servizi di sistema e dai driver di dispositivo (che sono fondamentalmente solo servizi di sistema). Ad esempio, VFS (file system virtuale) e file system dispositivo a blocchi (ad es. Minixfs) sono processi separati che vengono eseguiti al di fuori dello spazio del kernel, utilizzando IPC per comunicare con il kernel, altri servizi e processi utente. In breve, se è un modulo in Linux, è un servizio in un microkernel, che indica un processo isolato.

Non confondere il termine kernel modulare come tutt'altro che monolitico. Alcuni kernel monolitici possono essere compilati per essere modulari (ad es. Linux), ciò che conta è che il modulo sia inserito e gira dallo stesso spazio che gestisce le funzionalità di base (spazio del kernel).

Il vantaggio di un microkernel è che qualsiasi servizio fallito può essere facilmente riavviato, ad esempio, non vi è alcuna interruzione del kernel se il file system radice genera un interruzione. Questo può anche essere visto come uno svantaggio, perché può nascondere bug piuttosto critici (o farli sembrare non così critici, perché il problema sembra risolversi continuamente). È visto come un grande vantaggio in scenari in cui semplicemente non è possibile riparare comodamente qualcosa una volta che è stato distribuito.

Lo svantaggio di un microkernel è che la messaggistica IPC asincrona può diventare molto difficile da eseguire il debug, specialmente se le fibrille sono implementate. Inoltre, semplicemente rintracciare un problema di FS / scrittura significa esaminare il processo dello spazio utente, il servizio del dispositivo a blocchi, il servizio VFS, il servizio del file system e (possibilmente) il servizio PCI. Se si ottiene uno spazio vuoto su questo, è tempo di guardare il servizio IPC. Questo è spesso più facile in un kernel monolitico. GNU Hurd soffre di questi problemi di debug ( riferimento ). Non ho nemmeno intenzione di andare al checkpoint quando ho a che fare con code di messaggi complessi. I microgranelli non sono adatti ai deboli di cuore.

Il percorso più breve verso un kernel stabile e funzionante è l'approccio monolitico. Entrambi gli approcci possono offrire un'interfaccia POSIX, in cui la progettazione del kernel diventa di scarso interesse per qualcuno che vuole semplicemente scrivere codice da eseguire su qualsiasi progetto.

Uso Linux (monolitico) in produzione. Tuttavia, la maggior parte del mio apprendimento, hacking o armeggiare con lo sviluppo del kernel va in un microkernel, in particolare HelenOS .

modificare

Se sei arrivato così lontano dalla mia lunghissima risposta, probabilmente ti divertirai un po 'a leggere il " Grande dibattito Torvalds-Tanenbaum sul design del kernel ". È ancora più divertente da leggere nel 2013, oltre 20 anni dopo che è trapelato. La parte più divertente è stata la firma di Linus in uno degli ultimi messaggi:

Linus "my first, and hopefully last flamefest" Torvalds

Ovviamente, ciò non si è avverato non più della previsione di Tanenbaum secondo cui x86 sarebbe presto obsoleto.

NB:

Quando dico "Minix", non intendo Minix 3. Inoltre, quando menziono The HURD, mi riferisco (principalmente) al microkernel Mach. Non è mia intenzione denigrare il recente lavoro di altri.


5
È interessante notare che Linus Torvalds è stato fortemente influenzato dal MINIX di Andew Tanenbaum quando ha creato Linux. Tuttavia, MINIX si basa su un progetto di micro kernel mentre Linux utilizza un kernel monolitico.
Martin Liversage,

2
@Martin Liversage: più frustrato che influenzato :) Ho modificato la mia risposta per riflettere questo.
Tim Post

25
@DigitalRoss: dovresti vedere la mia casella di posta dopo aver risposto, Linus è docile rispetto agli appassionati di Minix e Mach.
Tim Post


3
@p_l Penso che sia abbastanza vicino al momento in cui dobbiamo parlare delle differenze tra micro, monolitico e ibrido. Potrebbe essere una bella domanda :)
Tim Post

15

Kernel monolitico significa che l'intero sistema operativo funziona in modalità kernel (ovvero altamente privilegiato dall'hardware). Cioè, nessuna parte del sistema operativo viene eseguita in modalità utente (privilegio inferiore). Solo le applicazioni nella parte superiore del sistema operativo vengono eseguite in modalità utente.

Nei sistemi operativi del kernel non monolitici, come Windows, gran parte del sistema operativo stesso viene eseguito in modalità utente.

In entrambi i casi, il sistema operativo può essere altamente modulare.


9
Windows è sicuramente un kernel monolitico.
Adam Rosenfield,

7
@Adam: non sono d'accordo. Il vecchio Windows a 16 bit era un kernel monolitico, così come Windows 95 e simili. Ma le edizioni di Windows basate su NT, incluse tutte le versioni Server più Vista e 7, sono chiaramente microkernel o forse ibride, a seconda della definizione di "microkernel" che usi.
CesarGon,

8
Solo perché i driver della stampante non funzionano in ring0 non lo rendono un microkernel :)
caf

7
@caf: ti suggerisco di dare un'occhiata a en.wikipedia.org/wiki/Windows_NT_kernel e en.wikipedia.org/wiki/Comparison_of_operating_system_kernels . Vedrai che Windows NT e i loro successori, incluso Vista, 7 e i Server, sono descritti come "kernel ibrido". Due grandi sottosistemi del sistema operativo funzionano completamente in modalità utente, non solo un driver di stampa. :-)
CesarGon

7
Il mio commento è stato un po 'ironico: la designazione "ibrida" sembra così priva di informazioni da essere inutile.
Caf

10

; tl-dr - No, Linux è sempre monolitico.

Moduli Linux possono significare modulari in un certo senso. Come altri hanno notato, il monolitico di solito rappresenta un microkernel contro un kernel monolitico . Un microkernel tradizionale ha solo queste funzionalità,

  1. programmazione
  2. Gestione della memoria
  3. Comunicazioni tra processi

Non ci sono driver hardware , stack di protocolli , filesystem , suspend / resume , clock management , ecc. Nel kernel principale. Queste cose sono identiche a qualsiasi attività dell'utente (sebbene possano avere privilegi diversi tramite MMU / scheduler).


Le previsioni di Tanenbaum

  1. I microkernels sono il futuro
  2. x86 si estinguerà e le architetture RISC domineranno il mercato
  3. (Tra 5 anni) tutti eseguiranno un sistema operativo GNU gratuito

I programmatori di PC e server possono ridere, ma due e tre sono certamente veri per la maggior parte dei telefoni cellulari esistenti. Tanenbaum avrebbe ragione su tutti i conti se BlackBerry QNX avesse avuto successo.

Inoltre, molti hypervisor L1 hanno un micro kernel sotto. Questo perché un hyper-visor di solito non fa molto oltre al cambio di contesto .

Apparentemente tre predice il successo di Linux. ;-)


Un argomento per i microkernels è che tutti i sottosistemi monolitici devono sincronizzare più valori contemporaneamente. Per fare ciò, devono usare le serrature e soffriranno per la legge di Amdahl una volta estesi alle architetture parallele. Il contatore è che i microkernels generano molti messaggi IPC.

Uno sviluppo importante è l'uso della programmazione senza lock per evitare contese in un kernel monolitico. Ciò evita il blocco in un kernel monolitico riducendo al contempo l'overhead IPC. Recentemente tutte le CPU hanno esteso il proprio ISA per includere primitive migliori per algoritmi senza blocco . Quindi Linux rimarrà probabilmente un kernel monolitico per qualche tempo.


1
Sì, so che Tanenbaum significava Hurd. Ma GNU è passato a Linux, quindi la formulazione è divertente.
rumore senza

Perché manca l'uso di x86 per i dispositivi mobili? Cosa rende vantaggiose le altre architetture?
Abdul,


Sì, quelli sono importanti. È difficile creare un SOC x86 (system-on-chip). Non esiste un codice HDL standard per creare un x86 che un venditore SOC (Broadcom, Freescale, ecc.) Possa acquistare.
rumore senza arte

9

Da Wikipedia :

Un kernel monolitico è un'architettura del kernel in cui l'intero sistema operativo funziona nello spazio del kernel e da solo come modalità supervisore. A differenza di altre architetture, il kernel monolitico definisce da solo un'interfaccia virtuale di alto livello sull'hardware del computer, con una serie di primitive o chiamate di sistema per implementare tutti i servizi del sistema operativo come gestione dei processi, concorrenza e gestione della memoria stessa e uno o più driver di dispositivo come moduli.

Le versioni recenti di Windows invece usano un kernel ibrido .

Un kernel ibrido è un'architettura del kernel basata sulla combinazione di aspetti del microkernel e architetture monolitiche del kernel utilizzate nei sistemi operativi dei computer. La categoria è controversa a causa della somiglianza con il kernel monolitico; il termine è stato respinto da alcuni come semplice marketing. Le categorie di kernel tradizionali sono kernel monolitici e microkernels (con nanokernels ed exokernels visti come versioni più estreme di microkernels).


7
Se dovessi mai fare qualcosa nello spazio del kernel, devo ricordare di usare "ibrido kerkel" da qualche parte. SCNR ;-)
Jürgen A. Erhard il

1
Windows NT è sempre stato un sistema ibrido. Il kernel potrebbe non essere esattamente ibrido, ma ti viene in dubbio ciò che conti come parte di esso (winapi, ad esempio, è implementato come servizio spazio utente)
p_l

5

"Monolitico" in questo contesto non si riferisce al fatto che esiste un unico eseguibile di grandi dimensioni e, come dici tu, Linux supporta il caricamento dinamico dei moduli del kernel in fase di esecuzione. Quando si parla di kernel, "monolitico" significa che l'intero sistema operativo funziona in modalità "privilegiata" o "supervisore", al contrario di altri tipi di sistemi operativi che usano un tipo di kernel come un "microkernel", dove solo un minimo set di funzionalità viene eseguito in modalità privilegiata e la maggior parte del sistema operativo viene eseguita nello spazio utente.

I sostenitori dei microkernel affermano che ciò è meglio perché un codice più piccolo significa meno bug e i bug in esecuzione in modalità supervisore possono causare problemi molto maggiori rispetto al codice dello spazio utente (come una maggiore possibilità di avere vulnerabilità di sicurezza o crash totali del sistema sotto forma di un 'kernel panic'). Alcuni micro-kernel sono sufficientemente minimali da poter essere "formalmente verificati", il che significa che puoi dimostrare matematicamente che il kernel è "corretto" secondo una specifica. L4 ne è un buon esempio.


Controlla le tue fonti. Il wikipage non è unito. www2.cs.uh.edu/~rzheng/course/COSC6397sp2008/…
monksy

2

Il kernel monolitico è un singolo grande processo eseguito interamente in un unico spazio di indirizzi. È un singolo file binario statico. Tutti i servizi del kernel esistono ed eseguono nello spazio degli indirizzi del kernel. Il kernel può richiamare direttamente le funzioni. Gli esempi di sistemi operativi monolitici basati su kernel sono Linux, Unix.

Penso che questo post ti aiuterà di più a capire il concetto.

http://learnlinuxconcepts.blogspot.in/2014/03/what-are-monolithic-and-micro-kernels.html


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Scott,
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.