私は、Raspberry PIを含む組み込みシステムでRedisが正常に動作するように一連の作業を行っています。アライメントの合っていないメモリアクセスが実行されるRedisの特定のコードパスを修正するために(私はRedis 3.2で導入された変更のために)PIがアライメントされていないメモリアクセスでメッセージを記録するようにするか、これが起こる。このようにして、私は、非境界整列のアクセスが違反である場合、Redisがうまく動作し、代わりにそのようなアクセスを実行することができますが、遅いプラットフォームではより高速に動作することを確認できます。 ARM v6の、PI v1のに使用されるものは、明らかに非整列メモリに対処することが可能である私は、Linuxを設定するには、次のコマンドを使用しますので、もし、アクセスするために、非整列アクセスを実行するプロセスにシグナルを送っしますラズベリーPIバージョン1でアライメントされていないアクセスが検出されない
echo 4 > /proc/cpu/alignment
をその後、
そして、次のプログラムを実行します。私は/proc/cpu/alignment
インクリメントの処理で受信した信号、またはカウンタを見ることができない
#include <stdio.h>
#include <stdint.h>
int main(int argc, char **argv) {
char *buf = "foobareklsjdfklsjdfslkjfskdljfskdfjdslkjfdslkjfsd";
uint32_t *l = (uint32_t*) (buf+1);
printf("%p\n", l);
printf("%d\n", (int)*l);
return 0;
}
を。
これは、指定されたCPU構成フラグが設定されていると、アライメントされていないアドレスを自動的に処理するためのARM v6の能力によるものです。私の疑問は、私の仮説は正しいのですか?もしそうなら、/ proc/cpu/alignmentに従って、Linuxカーネルがそれをトラップしてシグナルを送信したり、アクセスを記録したりすることができるように、PIバージョン1に実際にアライメントの合っていないアクセスが発生した場合に例外を発生させる設定?
EDIT:ARMv6でもすべての命令がアラインされていないアクセスを実行できるわけではありません。たとえば、STMDB、STMFD、LDMDB、LDMEAなどの複数ワード命令は、実際には例外を発生させ、Linuxカーネルにトラップされます。私は最終的に私の答えを見つけたと思う
ARMv4とv5でも境界整列されていないアクセスが許可されていますが、一部のアームコアではデフォルトで有効になっています。どちらの場合でも有効または無効にすることができます。アライメントのとれていないアクセスの古いコアの動作は、期待通りのものとは異なる/奇妙でした。次のアドレスに落ちるのではなく、ワード内のバイトを回転させます。それはバイトアクセス(またはハーフワード)のためのゼロバイトレーン上の正しいバイトを得る方法であり、その猫をスキンするための複数の方法です。 –
ARMの場合ではなく、ソフトウェアで一般的に整列していないアクセスを検出したい場合は、x86環境でLinux上の整列していないアクセスをトラップすることができます。 – EOF
EOFはい私はあなたがACレジスタを参照していることを発見しました。しかし、gdb setコマンドでなければ、私のプログラムでそれを有効にする信頼できる方法を見つけられませんでした。 – antirez