specificato il flag \texttt{-static} durante la compilazione, tutti i
programmi in Linux sono incompleti e necessitano di essere \textsl{collegati}
alle librerie condivise quando vengono avviati. La procedura è controllata da
-alcune variabili di ambiente e dal contenuto di \file{/etc/ld.so.conf}. I
-dettagli sono riportati nella man page di \cmd{ld.so}.
+alcune variabili di ambiente e dal contenuto di \conffile{/etc/ld.so.conf}. I
+dettagli sono riportati nella pagina di manuale di \cmd{ld.so}.
Il sistema fa partire qualunque programma chiamando la funzione \func{main};
sta al programmatore chiamare così la funzione principale del programma da cui
Oltre alla conclusione ``\textsl{normale}'' esiste anche la possibilità di una
conclusione ``\textsl{anomala}'' del programma a causa della ricezione di un
-segnale (si veda cap.~\ref{cha:signals}) o della chiamata alla funzione
-\func{abort}; torneremo su questo in sez.~\ref{sec:proc_termination}.
+segnale (tratteremo i segnali in cap.~\ref{cha:signals}) o della chiamata alla
+funzione \func{abort}; torneremo su questo in sez.~\ref{sec:proc_termination}.
Il valore di ritorno della funzione \func{main}, o quello usato nelle chiamate
ad \func{exit} e \func{\_exit}, viene chiamato \textsl{stato di uscita} (o
viene il nome \itindex{stack} \textit{stack}) in sequenza uno sull'altro; in
questo modo le funzioni possono essere chiamate ricorsivamente. Al ritorno
della funzione lo spazio è automaticamente rilasciato e
- ``\textsl{ripulito}''. La pulizia in C e C++ viene fatta dal
- chiamante.\footnote{a meno che non sia stato specificato l'utilizzo di una
- calling convention diversa da quella standard.}
-% TODO verificare le modalità di cambiamento della calling convention
+ ``\textsl{ripulito}''.\footnote{il compilatore si incarica di generare
+ automaticamente il codice necessario, seguendo quella che viene chiamata
+ una \textit{calling convention}; quella standard usata con il C ed il C++
+ è detta \textit{cdecl} e prevede che gli argomenti siano caricati nello
+ stack dal chiamante da destra a sinistra, e che si il chiamante stesso ad
+ eseguire la ripulitura dello stack al ritorno della funzione, se ne
+ possono però utilizzare di alternative (ad esempio nel pascal gli
+ argomenti sono inseriti da sinistra a destra ed è compito del chiamato
+ ripulire lo stack), in genere non ci si deve preoccupare di questo
+ fintanto che non si mescolano funzioni scritte con linguaggi diversi.}
La dimensione di questo segmento aumenta seguendo la crescita dello
\itindex{stack} \textit{stack} del programma, ma non viene ridotta quando
\begin{figure}[htb]
\centering
- \includegraphics[height=12cm]{img/memory_layout}
+% \includegraphics[height=12cm]{img/memory_layout}
+ \begin{tikzpicture}
+ \draw (0,0) rectangle (4,1);
+ \draw (2,0.5) node {text};
+ \draw (0,1) rectangle (4,2.5);
+ \draw (2,1.75) node {dati inizializzati};
+ \draw (0,2.5) rectangle (4,5);
+ \draw (2,3.75) node {dati non inizializzati};
+ \draw (0,5) rectangle (4,9);
+ \draw[dashed] (0,6) -- (4,6);
+ \draw[dashed] (0,8) -- (4,8);
+ \draw (2,5.5) node {heap};
+ \draw (2,8.5) node {stack};
+ \draw [->] (2,6) -- (2,6.5);
+ \draw [->] (2,8) -- (2,7.5);
+ \draw (0,9) rectangle (4,10);
+ \draw (2,9.5) node {environment};
+ \draw (4,0) node [anchor=west] {\texttt{0x08000000}};
+ \draw (4,5) node [anchor=west] {\texttt{0x08xxxxxx}};
+ \draw (4,9) node [anchor=west] {\texttt{0xC0000000}};
+ \end{tikzpicture}
\caption{Disposizione tipica dei segmenti di memoria di un processo.}
\label{fig:proc_mem_layout}
\end{figure}
\itindend{memory~locking}
+
% TODO documentare \func{madvise}
% TODO documentare \func{mincore}
% \subsection{Gestione avanzata dell'allocazione della memoria}
% \label{sec:proc_mem_malloc_custom}
+
% TODO: trattare le funzionalità avanzate di \func{malloc}
+% TODO: trattare \func{memalign}
+% TODO: trattare \func{valloc}
+% TODO: trattare \func{posix\_memalign}
% LocalWords: clearenv libc value overwrite string reference result argument
% LocalWords: socket variadic ellipsis header stdarg execl self promoting last
% LocalWords: float double short register type dest src extern setjmp jmp buf
-% LocalWords: env return if while sottoprocesso Di
+% LocalWords: env return if while Di page cdecl
+% LocalWords: environment
%%% Local Variables:
%%% mode: latex