:) 一部のレガシー コード (大規模なプログラム) を CentOS 7 に移植しようとしていますが、問題が発生しています。コードのコアは、ハードコードされたアドレスを割り当て、ファイルをそれにマップするために mmap を使用して構築された、やや厄介な構造です。このファイルはデータベースのように機能し (データベースによって構築されます)、マップされたメモリのさまざまなセクションへのハードコーディングされたポインターが含まれています。非常に醜いですが、それはそれです。プログラム全体はこの構造を中心に構築されており、誰も書き直しに資金を提供するつもりはありません。
問題は mmap 行にあります。これは以前は機能していましたが、CentOS 7 では機能しなくなりました。
mmapAddr = mmap ((void *) SMAddr, SMA_WINDOW_SIZE, PROT_READ | (readOnly ? 0 : PROT_WRITE),MAP_FILE | MAP_FIXED | MAP_SHARED, SMFileDesc, 0);
...SMAddr
は0x8000000
、SMA_WINDOW_SIZE
は127926272
、readOnly
は false です。0x8000000
つまり、基本的には、ファイルをサイズ 122MBのアドレスにマップしようとしています。
バージョン間で何が変わったのか、私にはわかりません。ただし、マッピングするファイルはわずか 1.5 MB であることに注意してください。なぜファイルサイズよりも多くをマップする必要があるのか 正確にはわかりませんが、それが必要であることはわかっています.
実際のファイル サイズと割り当てられたサイズの不一致は、以前は問題ありませんでしたが、今は問題ありませんか? SIGBUS
これは、無効なメモリ領域にアクセスしようとしていることを意味します。mmap が割り当てられたポインターをまったく使用しないことを考えると、これは内部で行っているものでなければなりません。
キャッチしてブロックしようとしSIGBUS
ましたが(無視できるのではないかと思いますか?)、プログラムはまだSIGBUS
同じ場所でクラッシュしました。多分私はそれを間違った。
考え?