Die Abschottung gilt nicht "allen anderen Dingen im Speicher" sondern
anderen Prozessen.
Beim Kompiliervorgang wird zum Schluß der Linker aufgerufen, welcher
die Bibliotheken (*.dll/*.so/*.dylib - je nach Betriebssystem) mit der
ausführbaren Datei verlinkt. Beim statischen Linken wird der Code der
gebrauchten Funktionen aus den Bibliotheken direkt in das endgültige
Programm kopiert. Dynamisch verlinkte Programme beinhalten eine Art
Tabelle mit Verweisen, welche Bibliotheken zur Laufzeit gebraucht
werden. Diese Tabelle wird beim Starten des Programms ausgewertet, und
der dynamische Linker lädt dann die gewünschten Bibliotheken in den
virtuellen Speicher des Programms nach. Das Resultat in beiden Fällen:
Die gewünschten Funktionen sind im Adreßraum des Prozesses gemappt.
Die Aufrufe erfolgen somit "lokal" im virtuellen Speicher des
Programms. Damit ein eventuell fehlerhaftes Programm keinen Unsinn mit
dem Speicherbereich der dynamischen Bibliotheken treibt, wird dieser
gegen Schreibzugriffe geschützt. Vorteil von dynamischen Bibliotheken
ist, daß sie in viele virtuellen Speicherbereiche (d.h. viele Prozesse)
eingeblendet werden können, während sie nur ein Mal im physischen
Speicher exisiteren.
Zugriff auf alles, was "außerhalb" liegt, erfolgt wie schon oben
beschrieben über Interrupts, System-Calls, jedoch in der Regel nicht
direkt, sondern eben über die Funktionen der verfügbaren Bibliotheken.
Erst so kann der Kernel-Modus erreicht werden, welcher unbegrenzten
Zugriff auf alle Resourcen hat. Darin wird die gewünschte Operation
ausgeführt (z.B. Laden einer Datei in den Speicher), beim Beenden des
Interrupts/System-Calls wird der priviligierte Modus wieder verlassen
und das Programm fortgeführt.
Das ist nur eine grobe Beschreibung und jedes Betriebssystem verhält
sich hier in den Details anders. Für einen Überblick sollte es trotzdem
reichen.