• 検索結果がありません。

バイト オーダー

ドキュメント内 WinDriver V10.10 ユーザーズ ガイド (ページ 106-109)

第 8 章 特定のチップ セットの拡張サポート

9.7 バイト オーダー

9.7.1 エンディアンネスとは

メモリストレージを処理するには主に 2 つのアーキテクチャがあります。ビッグエンディアンとリトルエンディ アンと呼ばれ、メモリに格納されるバイトの順番を表します。

z ビッグ エンディアンとは、最下位メモリ アドレスにマルチ バイト データ フィールドの最上位バイトか ら順番に格納します。

これは、0x1234 のような 16 進文字列を (0x12 0x34) としてメモリに格納します。ビッグ エンドまた は上位エンドを初めに格納します。4 バイトの値について次のことが同じように当てはまります。た とえば、0x12345678 は、(0x12 0x34 0x56 0x78) と順番に格納されます。

z リトルエンディアンとは、最下位メモリアドレスにマルチバイトデータフィールドの最下位バイトか ら順番に格納します。

これは、0x1234 のような 16 進文字列を (0x34 0x12) としてメモリに格納します。リトル エンドまたは 下位エンドを初めに保存します。4 バイトの値について次のことが同じように当てはまります。たと えば、0x12345678 は、(0x78 0x56 0x34 0x12) と順番に格納されます。

すべてのプロセッサはビッグエンディアンまたはリトルエンディアンのいずれかでデザインされています。

Intel x86 系プロセッサはリトルエンディアンを採用しています。Sun SPARC、Motorola 68K および PowerPC

ファミリはすべてビッグエンディアンを採用しています。

エンディアンネスの違いによって、コンピュータが異なるフォーマットで記述されたバイナリ データを共有メモ リまたはファイルから読み込む場合に、問題が発生する場合があります。

ビッグエンディアンとリトルエンディアンの名前の由来は、小説「ガリバー旅行記」(Jonathan Swift 1726) の 小人国の話から来ており、ゆで卵を小さい方から割るか、大きい方から割るかの対立を描いています。

9.7.2 WinDriver のバイト オーダー マクロ

x86 アーキテクチャに対応するようにリトルエンディアンとして PCI バスをデザインしています。PCI バスと

SPARC、PowerPC のアーキテクチャ間のバイトオーダーの違いから問題が生じないように、WinDriver に

は、リトル エンディアンとビッグ エンディアン間でデータを変換するマクロ定義が含まれています。

WinDriver を使用してドライバを開発した場合、これらのマクロ定義によって、クロスプラットフォーム間で互

換性が有効になります。これらのマクロを使用することによって、安全に x86 アーキテクチャにドライバを配 布できます。

以下のセクションでは、そのマクロの説明と使用方法を紹介します。

9.7.3 PCI ターゲット アクセスのマクロ

PCI デバイスのメモリ マップされた領域を使用する PCI カードから読み込みまたは PCI カードへ書き込みを 行う際に、エンディアンネスを変換するために PCI ターゲット アクセスの WinDriver のマクロを使用します。

注意: これらのマクロ定義は Linux PowerPC アーキテクチャに当てはまります。

z dtoh16 - WORD (device to host) 変換用のマクロ定義 z dtoh32 - DWORD (device to host) 変換用のマクロ定義

z dtoh64 - QWORD (device to host) 変換用のマクロ定義 以下の場合に WinDriver のマクロ定義を使用します。

1. メモリマップされた領域を使用してカードへ直接書き込みアクセスをする場合、デバイスへ書き込む データにマクロを適応する場合。

たとえば:

DWORD data = VALUE; *mapped_address = dtoh32(data);

2. メモリ マップされた領域を使用してカードから直接読み込みアクセスをする場合、デバイスから読み込 むデータにマクロを適応する場合。

たとえば:

WORD data = dtoh16(*mapped_address);

注意: WinDriver API (WDC_Read/WriteXXX()関数、WDC_MultiTransfer()関数、低レ ベル WD_Transfer()関数および低レベル WD_MultiTransfer() 関数は必要なバイト オーダー変換を実行するため、これらの API を使用してメモリ アドレスの読み取り/書き込みを行う 場合は、dtoh16/32/64() マクロを使用してデータを変換する必要はありません (I/O アドレス についても同様)。

9.7.4 PCI マスター アクセスのマクロ

PCI マスタデバイスがアクセスするホストメモリ内のデータのエンディアンネスを変換するために PCI マスタ アクセスの WinDriver のマクロを使用します。つまり、ホストではなくデバイスからアクセスする場合。

注意: これらのマクロの定義は Linux PowerPC と SPARC アーキテクチャの両方に当てはまります。

z htod16 - WORD (host to device) 変換用のマクロの定義 z htod32 - DWORD (host to device) 変換用のマクロ定義 z htod64 - QWORD (host to device) 変換用のマクロ定義 以下の場合に WinDriver のマクロ定義を使用します。

カードで読み込み/書き込みを行うホストメモリ上で準備したデータにマクロを適応する場合。そのような場合 の例は、スキャッタ / ギャザー DMA 用の一連のディスクリプタです。

以下の例は、WinDriver ライブラリ (WinDriver/plx/lib/plx_lib.c を参照) の PLX_DMAOpen() 関数から抜粋したサンプルです:

/* setting chain of DMA pages in the memory */

for (dwPageNumber = 0, u32MemoryCopied = 0;

dwPageNumber < pPLXDma->pDma->dwPages;

dwPageNumber++) {

pList[dwPageNumber].u32PADR = htod32((UINT32)pPLXDma->pDma->

Page[dwPageNumber].pPhysicalAddr);

pList[dwPageNumber].u32LADR =

htod32((u32LocalAddr + (fAutoinc ? u32MemoryCopied : 0)));

pList[dwPageNumber].u32SIZ =

htod32((UINT32)pPLXDma->pDma->Page[dwPageNumber].dwBytes);

pList[dwPageNumber].u32DPR =

htod32((u32StartOfChain + sizeof(DMA_LIST) * (dwPageNumber + 1))

| BIT0 | (fIsRead ? BIT3 : 0));

u32MemoryCopied += pPLXDma->pDma->Page[dwPageNumber].dwBytes;

}

pList[dwPageNumber - 1].u32DPR |= htod32(BIT1); /* Mark end of chain */

10

パフォーマンスの向上

ドキュメント内 WinDriver V10.10 ユーザーズ ガイド (ページ 106-109)