5

既存の 64 ビット値内からメモリ アドレスを抽出する必要があり、このアドレスは 4K 配列を指しています。開始値は次のとおりです。

0x000000030c486000

必要なアドレスはビット 51:12 に格納されているため、次を使用してこれらのビットを抽出します。

address = start >> 12 & 0x0000007FFFFFFFFF

これにより、次のアドレスが残ります。

0x000000000030c486

ただし、私が読んでいるドキュメントには、アドレスに格納されている配列のサイズは 4KB であり、自然に整列されていると記載されています。

自然に整列するということが実際に何を意味するのかについて、私は少し混乱しています。ページ整列のものでは、アドレスは通常「000」で終わることを知っています(ただし、それについては間違っている可能性があります)。

開始値から取得したアドレスの長さはわずか 40 ビットであるため、追加のビットシフト操作を実行してビットを配置し、さらに正しく解釈できるようにする必要があると想定しています。

誰かがこれを行う上でアドバイスを提供できれば、私はそれを感謝します.

ありがとう

4

4 に答える 4

5

通常、「自然に整列」とは、アイテムが少なくともそれ自体のサイズの倍数に整列されることを意味します。たとえば、4 バイトのオブジェクトは 4 の倍数のアドレスにアラインされ、8 バイトのオブジェクトは 8 の倍数のアドレスにアラインされます。

配列の場合、通常は配列全体のサイズではなく、配列の要素のサイズを確認します。

同様に、structまたはunionの場合、通常、最大の要素のサイズを調べます。

于 2013-03-19T15:34:54.153 に答える
2

「自然に整列された」アドレスは、プロセッサのデータ型に適した値の倍数であるアドレスです。最も一般的なプロセッサのほとんどの基本データ型の場合、推奨される配置はデータのサイズと同じです。4バイト整数は4バイトの倍数に配置する必要があり、8バイト浮動小数点は8バイトの倍数に配置する必要があります。 、 等々。プラットフォームによっては位置合わせが必要なものもあれば、単にそれを好むものもあります。一部のタイプには、サイズとは異なる位置合わせ要件があります。たとえば、12バイトlong float4バイトのアラインメントが必要になる場合があります。特定の値は、ターゲットプラットフォームによって異なります。「自然に整列」は正式な用語ではないため、データサイズの倍数である優先整列としてのみ定義する人もいれば、プロセッサで優先される他の整列に使用できるようにする人もいます。

64ビット値からビットを取り出すことは、アドレスが何らかの方法で変換されたことを示しています。たとえば、アドレスのキービットはページテーブルエントリに格納されています。元のアドレスの再構築は、ビットを抽出して「右」(ローエンド)までシフトするのと同じくらい簡単な場合とそうでない場合があります。ただし、このようなビットが別の位置にシフトされることもよくあります(下位ビットにゼロが残っています)。ドキュメントを注意深く確認する必要があります。

4 KiBアレイ、4096バイトは、212バイトに対応することに注意してください。12と64ビット値の51:12フィールドが一致することは、40ビットをまったくシフトせずに抽出するだけでアドレスが取得される可能性があることを示しています。

于 2013-03-19T15:33:36.117 に答える
2

自然な位置合わせでは、すべてのNバイトアクセスをNのメモリアドレス境界に位置合わせする必要があります。これは、モジュラス演算子で表すことができます。addr%Nはゼロである必要があります。たとえば:

アドレス0x10004から4バイトのメモリへのアクセスが調整されます(0x10004%4 = 0)。

アドレス0x10005から4バイトのメモリにアクセスすることは調整されていません(0x10005%4 = 1)。

于 2013-03-19T15:34:29.830 に答える
2

ハードウェアの観点から見ると、メモリは通常、チャンク内の一部またはすべてのデータを 1 回の操作で読み書きできるように、ある程度のサイズのチャンクに分割されますが、1 回の操作は 1 つのチャンク内のデータにしか影響を与えません。

典型的な 80386 時代のシステムでは、メモリが 4 バイトのチャンクにグループ化されていました。1 つのチャンク内に完全に収まる 2 バイトまたは 4 バイトの値にアクセスするには、1 つの操作が必要です。値が 1 つのチャンクに部分的に保存され、別のチャンクに部分的に保存された場合、2 つの操作が必要になります。

何年にもわたって、チャンク サイズはデータ サイズよりも大きくなり、ほとんどのランダムに配置された 32 ビット値が完全にチャンク内に収まるようになりましたが、一部のプロセッサでは 2 つ目の問題が発生する可能性があります。 64 バイト) であり、32 ビット ワードは 4 バイト (32 ビット) の倍数でアラインされることが知られているため、ワードの各ビットのフェッチは 16 の場所のいずれからでも行うことができます。単語が整列されていることが知られていない場合、単語がチャンク内に完全に収まる場合、各ビットは 61 の場所のいずれかから来る可能性があります。61 の選択肢からすばやく選択する回路は、16 の選択肢から選択する回路よりも複雑であり、ほとんどのコードはアラインされたデータを使用するため、アラインされていないワードが単一のアクセス可能なチャンク内に収まる場合でも、ハードウェアはまだ少し余分に必要になる場合があります。それを抽出する時間。

于 2016-04-14T18:46:39.693 に答える