{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
}
{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
{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
}
{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 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
}
{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
\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}
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
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}}
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 è
\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}