From 7ba960f89ca7e8a78332c9cd7ce76d5b85f7a8eb Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 23 Mar 2012 10:51:27 +0000 Subject: [PATCH] Materiale treno --- listati/kexec_segment.h | 6 ++ system.tex | 144 +++++++++++++++++++++++++++++++++------- 2 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 listati/kexec_segment.h diff --git a/listati/kexec_segment.h b/listati/kexec_segment.h new file mode 100644 index 0000000..54e50ca --- /dev/null +++ b/listati/kexec_segment.h @@ -0,0 +1,6 @@ + struct kexec_segment { + void *buf; /* Buffer in user space */ + size_t bufsz; /* Buffer length in user space */ + void *mem; /* Physical address of kernel */ + size_t memsz; /* Physical address length */ + }; diff --git a/system.tex b/system.tex index c5bcd09..1ea7b2c 100644 --- a/system.tex +++ b/system.tex @@ -748,7 +748,7 @@ relative ad un utente si possono usare due funzioni, \funcd{getpwuid} e {Le funzioni ritornano il puntatore alla struttura contenente le informazioni in caso di successo e \val{NULL} nel caso non sia stato trovato nessun utente corrispondente a quanto specificato, nel qual caso \var{errno} - assumerà il valore riportato dalle funzioni sottostanti.} + assumerà il valore riportato dalle funzioni di sistema sottostanti.} \end{funcproto} Le due funzioni forniscono le informazioni memorizzate nel registro degli @@ -791,7 +791,8 @@ i cui prototipi sono: } {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà il valore riportato dalle funzioni sottostanti.} + caso \var{errno} assumerà il valore riportato dalle di sistema funzioni + sottostanti.} \end{funcproto} In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare @@ -831,7 +832,7 @@ i loro prototipi sono: {Le funzioni ritornano il puntatore alla struttura contenente le informazioni in caso di successo e \val{NULL} nel caso non sia stato trovato nessun utente corrispondente a quanto specificato, nel qual caso \var{errno} - assumerà il valore riportato dalle funzioni sottostanti.} + assumerà il valore riportato dalle funzioni di sistema sottostanti.} \end{funcproto} Come per le precedenti per gli utenti esistono anche le analoghe versioni @@ -849,7 +850,8 @@ estensione \code{\_r}; i loro prototipi sono: } {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà il valore riportato dalle funzioni sottostanti.} + caso \var{errno} assumerà il valore riportato dalle funzioni di sistema + sottostanti.} \end{funcproto} @@ -1033,7 +1035,7 @@ scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent}, {Le funzioni ritornano il puntatore ad una struttura \struct{utmp} in caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà - il valore riportato dalle funzioni sottostanti.} + il valore riportato dalle funzioni di sistema sottostanti.} \end{funcproto} Tutte queste funzioni fanno riferimento ad una struttura di tipo @@ -1147,7 +1149,8 @@ aggiuntivi, i rispettivi prototipi sono: } {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà il valore riportato dalle funzioni sottostanti.} + caso \var{errno} assumerà il valore riportato dalle funzioni di sistema + sottostanti.} \end{funcproto} Le funzioni si comportano esattamente come le precedenti analoghe non @@ -1190,20 +1193,22 @@ argomento. \label{sec:sys_reboot} Una delle operazioni di gestione generale del sistema è quella che attiene -alle modalità con cui se ne può gestire lo spegnimento ed il riavvio. Perché +alle modalità con cui se ne può gestire lo spegnimento ed il riavvio. Perché questo avvenga in maniera corretta, in particolare per le parti che comportano lo spegnimento effettivo della macchina, occorre che il kernel effettui le opportune operazioni interagendo con il BIOS ed i dispositivi che controllano -l'erogazione della potenza. +l'erogazione della potenza. -La funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri +Ia funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri aspetti della relativa procedura) è \funcd{reboot},\footnote{la funzione illustrata è quella fornita dalla \acr{glibc} che maschera i dettagli di - basso livello della \textit{system call} la quale richiede quattro - argomenti, di cui due \textit{magic number} interi che possono assumere solo - alcuni valori predefiniti, un comando, corrispondente all'unico argomento - della funzione della \acr{glibc} e un puntatore generico ad ulteriori dati.} -il cui prototipo è: + basso livello della \textit{system call} la quale richiede attualmente tre + argomenti; fino al kernel 2.1.30 la \textit{system call} richiedeva un + ulteriore quarto argomento, i primi due indicano dei \textit{magic number} + interi che possono assumere solo alcuni valori predefiniti, il terzo un + comando, corrispondente all'unico argomento della funzione della \acr{glibc} + ed il quarto argomento aggiuntivo, ora ignorato, un puntatore generico ad + ulteriori dati.} il cui prototipo è: \begin{funcproto}{ \fhead{unistd.h} @@ -1216,7 +1221,7 @@ il cui prototipo è: errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EFAULT}] c'è un indirizzo non valido nel passaggio degli - argomenti con il comando \const{LINUX\_REBOOT\_CMD\_RESTART2}. + argomenti con il comando \const{LINUX\_REBOOT\_CMD\_RESTART2} (obsoleto). \item[\errcode{EINVAL}] si sono specificati valori non validi per gli argomenti. \item[\errcode{EPERM}] il chiamante non ha i privilegi di amministratore (la @@ -1229,13 +1234,13 @@ La funzione, oltre al riavvio ed allo spegnimento, consente anche di controllare l'uso della combinazione di tasti tradizionalmente usata come scorciatoia da tastiera per richiedere il riavvio (\texttt{Ctrl-Alt-Del}, denominata in breve nella documentazione CAD) ed i suoi effetti specifici -dipendono dalla architettura hardware. - - - +dipendono dalla architettura hardware. Se si è richiesto un riavvio o uno +spegnimento in caso di successo la funzione, non esistendo più il programma, +ovviamente non ritorna, pertanto bisogna avere cura di aver effettuato tutte +le operazioni preliminari allo spegnimento prima di eseguirla. Il comportamento della funzione viene controllato dall'argomento \param{cmd} -che deve assumere indicato con una delle costanti seguente elenco, che +e deve assumere indicato con una delle costanti seguente elenco, che illustra i comandi attualmente disponibili: \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} @@ -1252,8 +1257,17 @@ illustra i comandi attualmente disponibili: messaggio ``\textit{System halted.}'' l'esecuzione viene bloccata immediatamente ed il controllo passato al monitor nella ROM (se esiste e l'architettura lo consente). Se non si è eseguita una sincronizzazione dei - dati su disco con \func{sync} questo saranno perduti. -\item[\const{LINUX\_REBOOT\_CMD\_KEXEC}] + dati su disco con \func{sync} questi saranno perduti. +\item[\const{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo + kernel che è stato opportunamente caricato in memoria da una + \func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La + funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel + corrente è stato compilato inlcudendo il relativo supporto.\footnote{deve + essere stata abilitata l'opzione di compilazione \texttt{CONFIG\_KEXEC}.} + Questo meccanismo consente di eseguire una sorta di riavvio rapido che evita + di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del + kernel attraverso un bootloader. Se non si è eseguita una sincronizzazione + dei dati su disco con \func{sync} questi saranno perduti. \item[\const{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il messaggio ``\textit{Power down.}'' l'esecuzione viene bloccata immediatamente e la macchina, se possibile, viene spenta. Se non si è @@ -1266,14 +1280,94 @@ illustra i comandi attualmente disponibili: \item[\const{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata immediatamente la procedura di riavvio usando il comando fornito - nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'}. Se - non si è eseguita una sincronizzazione dei dati su disco con \func{sync} - questi saranno perduti. + nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'} + (veniva usato per lanciare un altro programma al posto di \cmd{init}. Nelle + versioni recenti questo argomento viene ignorato ed il riavvio può essere + controllato dall'argomento di avvio del kernel \texttt{reboot=...} Se non + si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi + saranno perduti. \end{basedescript} % TODO trattare reboot, kexec_load, ... +Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si +può eseguire un riavvio immediato pre-caricando una immagine del kernel, che +verrà eseguita direttettamente. Questo meccanismo consente di evitare la +reinizializzazione della macchina da parte del BIOS, ed oltre a velocizzare un +eventuale riavvio, ha il vantaggio di non modificare lo stato della macchina e +della memoria, per cui viene usato spesso per installare un kernel di +emergenza da eseguire in caso di crollo del sistema per recuperare il maggior +numero di informazioni possibili. + +La funzione di sistema che consente di caricare questa immagine del kernel è +\funcd{kexec\_load}, la funzione non viene definita nella \acr{glibc} e deve +pertanto essere invocata con \func{syscall}, il suo prototipo è: + +\begin{funcproto}{ +\fhead{linux/kexec.h} +\fdecl{long kexec\_load(unsigned long entry, unsigned long nr\_segments, + struct kexec\_segment *segments, unsigned long flags)} + +\fdesc{Carica un kernel per un riavvio immediato.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EBUSY}] c'è già un caricamento in corso, o un altro kernel è + già stato caricato. + \item[\errcode{EINVAL}] il valore di \param{flags} non è valido o si è + indicato un valore eccessivo per \param{nr\_segments}. + \item[\errcode{EPERM}] il chiamante non ha i privilegi di amministratore (la + \textit{capability} \const{CAP\_SYS\_BOOT}). + \end{errlist} +} +\end{funcproto} + +Il primo argomento indica l'indirizzo fisico di esecuzione del nuovo kernel +questo viene caricato usando un vettore di strutture \struct{kexec\_segment} +(la cui definizione è riportata in fig.~\ref{fig:kexec_segment}) che +contengono i singoli segmenti dell'immagine. L'argomento \param{flags} è una +maschera binaria che contiene i flag che consentono di indicare alcune +specifiche relative alle modalità con cui dovrà essere eseguito il nuovo +kernel. La parte meno significativa viene usata per impostare l'architettura +di esecuzione + + +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{0.8\textwidth} + \includestruct{listati/kexec_segment.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{kexec\_segment} per il caricamento di un + segmento di immagine del kernel.} + \label{fig:kexec_segment} +\end{figure} + + + + +\begin{table}[htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Valore} & \textbf{Significato}\\ + \hline + \hline + \const{KEXEC\_ON\_CRASH} & \\ + \const{KEXEC\_PRESERVE\_CONTEXT}& \\ + \hline + \const{KEXEC\_ARCH\_DEFAULT} & \\ + \const{} & \\ + \hline + \end{tabular} + \caption{Valori per l'argomento \param{flags} di \func{kexec\_load}.} + \label{tab:kexec_load_flags} +\end{table} -- 2.30.2