2

私は C でメモリ アドレスをいじっていて、unaligned memory accessという名前のこのトピックについて疑問に思っています。

私は現在、Linux カーネルを搭載した x86 Intel を使用していますが、アーキテクチャと OS にとらわれない精神でトピックを尋ねます。ただし、以下はLinuxとハードウェアに固有のものです。


アラインされていないアドレスとの間で単純型を読み書きすると、エラーは発生しません。ログなどにメッセージはありません。私も試しました:

perf top -e alignment-faults
# And with PID
perf top -p NNN -e alignment-faults

しかしヒットなし。

次の方法で位置合わせチェックをオンにします。

__asm__("pushf\norl $0x40000,(%esp)\npopf");

「必要な」結果が得られます。

Bus error (core dumped)

(しかし、まだメッセージはありませんperf。)


私の質問は、これがハードウェア + OS によってどのように処理され、何が最適かということです。私の考えや質問はいたるところにありますが、いくつかの具体的なポイントを表現しようとします。

  1. CPU はデフォルトでアラインメント チェックをオンにしていますが、カーネルはオフがサポートされていることを検出し、チェックしないように指示しますか?
  2. カーネルとして、少なくとも私は他のハードウェアでこれを経験しましたが、アライメントされていないメモリにアクセスしようとするドライバーが原因でエラーが発生する可能性があります。カーネルはアライメントチェックモードで実行されますか? それとも、おそらくコードの特定の部分だけでしょうか?
  3. アライメントされていないメモリへのアクセスには、より多くのリソースが必要です。ソフトウェアのテスト段階で、たとえばアセンブリ ラインの上などでアライメント チェックを有効にすることは良い考えですか? これにより、携帯性も向上しますか?

この件に関しては他にもたくさん質問がありますが、とりあえずこれで置いておきます。

4

1 に答える 1