メインコンテンツへ移動

先日、VOSをご利用のお客様から、レガシーの非POSIXプログラムと新しいPOSIXベースのプログラムの間で、共有仮想メモリ領域の位置を一致させる方法について質問を受けました。

この顧客は、create_data_object コマンドを使用して、いくつかの異なる共有仮想メモリ領域を作成していました。その後、bind コントロールファイルを使用して、各プログラムがそれらの領域を同じ順序で、かつ同じ仮想アドレスで参照するようにしていました。  問題は、gccコマンドを使用して新しいPOSIX準拠のプログラムをバインドしても、SVM領域の位置合わせがうまくいかないことでした。新しいプログラムでは、SVM領域が異なるアドレスに配置されてしまっていたのです。gccでバインドファイルを使用しても、状況は改善されませんでした。

bindマップ(またはdisplay_program_moduleコマンドの出力)を見ると、POSIXプログラムは常に「s_start_c_program」および「crti」オブジェクトモジュールから始まることがわかります。s_start_c_programオブジェクトモジュールはレガシープログラムの後半に現れますが、crtiオブジェクトモジュールはまったく現れません。  これら2つのオブジェクトモジュールが存在することで、後続のすべてのオブジェクトモジュールがファイル内で下方に押し下げられ、その結果、アライメントのずれが生じます。

gccがこれら2つのオブジェクトモジュールをプログラムモジュールの先頭に配置するのを防ぐ方法はありません。したがって、解決策は、レガシープログラムの結合方法を変更することです。  SVM領域はページ境界から開始する必要があるため、またs_start_c_programとcrtiコード領域の合計サイズが1ページ未満であるため、必要なのはレガシープログラムの先頭に余分な未使用ページを割り当てることだけです。create_data_objectコマンドを使用して4096バイトのデータオブジェクトを作成し、それをバインド制御ファイルの最初のオブジェクトモジュールとして配置します。

この2つのプログラムのサイズを1ページ(4096バイト)以下に抑えることで合意したため、この解決策は今後も有効です。

この手法についてご質問がある場合は、以下に投稿してください。

© 2024 Stratus Technologies.