Zum Hauptinhalt springen

Ich habe kürzlich eine Frage von einem VOS-Kunden erhalten, der wissen wollte, wie er seine gemeinsam genutzten virtuellen Speicherbereiche zwischen seinen legacy Nicht-POSIX-Programmen und seinen neuen, POSIX-basierten Programmen angleichen kann.

Dieser Kunde hatte den Befehl create_data_object verwendet, um mehrere verschiedene gemeinsame virtuelle Speicherbereiche zu erstellen. Er hatte dann eine Bindungssteuerungsdatei verwendet, um sicherzustellen, dass jedes Programm die Regionen in der gleichen Reihenfolge und an der gleichen virtuellen Adresse referenziert. Das Problem war, dass er, egal wie er den gcc-Befehl zum Binden seiner neuen, POSIX-basierten Programme verwendete, die SVM-Regionen nicht ausrichten konnte. Die neuen Programme setzten die SVM-Regionen an unterschiedliche Adressen. Selbst die Verwendung einer Bind-Datei mit gcc half nicht.

Die Bind-Map (oder die Ausgabe des Befehls display_program_module) zeigt, dass POSIX-Programme immer mit den Objektmodulen "s_start_c_program" und "crti" beginnen. Das Objektmodul "s_start_c_program" erscheint erst später im Programm legacy , und das Objektmodul "crti" taucht überhaupt nicht auf. Durch das Vorhandensein dieser beiden Objektmodule werden alle nachfolgenden Objektmodule in der Datei nach unten verschoben, was zu dem Versatz führt.

Es gibt keine Möglichkeit, gcc daran zu hindern, diese beiden Objektmodule zuerst in das Programmmodul zu setzen. Die Lösung besteht also darin, die Art und Weise zu ändern, wie die legacy Programme gebunden werden. Da SVM-Regionen auf einer Seitengrenze beginnen müssen und die Größe der s_start_c_program- und crti-Code-Regionen zusammen weniger als eine Seite beträgt, müssen wir lediglich eine zusätzliche, unbenutzte Seite am Anfang der legacy -Programme zuweisen. Verwenden Sie den Befehl create_data_object, um ein 4096-Byte-Datenobjekt zu erstellen und es als erstes Objektmodul in die Bindungssteuerungsdatei einzufügen.

Wir haben uns darauf geeinigt, die Größe dieser beiden Programme auf 1 Seite (4096) Bytes oder weniger zu beschränken, so dass diese Lösung auch in Zukunft funktionieren wird.

Wenn Sie Fragen zu dieser Technik haben, stellen Sie sie bitte unten.

© 2024 Stratus Technologies.