メモリアドレスが整列しているか整列していないかを知る

メモリアドレスが整列しているか整列していないかを知る

ppp ドライバーが非整列アドレスにアクセスしようとしているため、カーネル エラーが発生します (非整列アドレスを指すポインターがあります)。非整列アドレスの意味がよくわかりません。倍数でも 4 でも RAM スコープ外でもないという意味ですか? システムに 32 ビット幅のバスがある場合、アドレスが与えられたときに、それが整列されているか、整列されていないかをどのように知ることができますか?

答え1

簡単に言うと、非整列アドレスとは、(通常は) 1 バイトよりも大きく、読み取ろうとするデータ型のサイズで均等に割り切れない単純な型 (整数または浮動小数点変数など) のアドレスです。

Address % Size != 0

次のメモリ範囲があり、4 バイトを読み取るとします。

                           +---------- 8 % 4 = 0, OK
                           |
                     ______+______
                    |             |
 ... 4   5   6   7   8   9   10  11  12  13  14  15  16  17 ...
 --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--
 * | @ | @ | @ | @ | * | * | * | * | @ | @ | @ | @ | * | * | *
 --+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--
                            |_______.______|
                                    |
                                    +--- 10 % 4 = 2, Unaligned

この問題の詳細についてはドキュメント/非整列メモリアクセス.txt

関連情報