2017-07-31 5 views
0

usermode x64には、コンパイラからの明示的なインストルメンテーションなしに、各メモリのロードとストアで境界チェックを自動的に適用するための仕組みはありますか?私はOSのサポート(例えばmprotectシステムコール)に頼ることも望まない。自動境界チェックのためのx86-64メカニズム

<begin: enforce all accesses within 0x10000000-0x10000100> ... mov ___, ___ #hardware automatically performs range check ... <end enforcement>

私の知る限りでは、インテルMPXは、各メモリアクセスをチェックする前に、明示的なbndcl/bndcu命令が必要です。 CPUは境界がどこかから来ているしているもの水晶玉や情報ていないという単純な理由のために

+0

デバッガのように悪いアドレスを間接的に参照しようとすると、信号を処理できます。しかし、私はこれが愚かであることを保証します –

+0

どのような範囲で、単に「有効なメモリ」または「それが存在するはずのオブジェクトの中に」ですか? – harold

+0

私は上下の仮想アドレスを計算する方法を持っており、保護されたコードにその範囲内でのアクセスのみを強制したいと考えています。 – rsinha

答えて

3

号。 「何」がで、「どこかに」であることを決定するのはプログラムの作業です。

+0

私は理解しています。私は保護されたコードの前に境界を提供したいと思います。私はちょうど保護されたコード内の各メモリアクセスを計測したくないです。 – rsinha

+0

@rsinha:コンピュータは決定論的です。境界からインデックスが生成される数式と境界を知っている場合は、数式でその数式を指定し、その範囲外の境界が生成されないことを証明する必要があります。そのような証拠を手に入れれば、OOBアクセスが発生しないことを100%保証することができます。この種の証明は、Rust、Haskellなどのプログラミング言語のメモリ安全性の中心にあり、厳密に型チェックされています。コンパイラがコンパイル時にメモリアクセスが境界内に留まることを証明できれば、境界チェックを省略します。 – datenwolf

+0

このような解析のための型システムは優れています---確かに、Rustはメモリアクセスが配列の境界内にあることを強制できます。しかし、(実行時に)メモリ操作が配列の上半分(基本的に細かい制御)にしかアクセスしないことを証明または強制したい場合、依存型などのより重い校正技術が必要になります。 – rsinha

関連する問題