2016-06-24 5 views
0

正しい答えを見つけるためにquestiongを正しく検索していない可能性がありますので、私が何をしようとしているのかを簡単に教えてくださいどのような質問を私は答えを見つけることを求めている必要があります。x86ベースのプラットフォーム上でLinuxを使用しているC言語の構造を持つハードウェアテーブルにアクセスする

私はそれにメモリのチャンクを持つハードウェアデバイスを持っています。メモリ内の16バイトごとに、HWベースのリンクされたコントローラへのエントリが表示されます。そして、私は多くの多くのエントリのために十分なメモリを持っています。

以下のような構造で各エントリを表現したいと思います。

struct entry_desc { 
    /* Address */ 
    uint64_t addr; 
    /* Length. */ 
    uint32_t len; 
    /* Some flags. */ 
    uint16_t flags; 
    /* Next pointer */ 
    uint16_t next; 
}; 
構造内の要素を定義した順序が同じ順序でメモリにマップされる保証はありますか?

リトルエンディアン性を前提とすると、メモリオフセット0のLSB "addr"とメモリオフセット7の "addr"のMSBで、 "addr"はバイト0と7の間の最下位メモリアドレスに配置されます。 あれは正しいですか?それが他のコンパイラではなく、一部のコンパイラで本当であるかどうかわかります。

+1

Cは、構造体のメンバの順序を保証しますが、それはサイズ/アラインメントについては何も言いません。そして、各structメンバーの後に任意のパディングを許します。 – melpomene

+1

*使用できるパディングやアライメントを制御する言語コンパイラ固有の拡張機能があります。それ以外の場合は、静的アサーションを使用して、実際の配置を目的の配置と照合することができます。 –

答えて

0

Cでは、構造体内の項目の順序が重要です。リトルエンディアンは単にメモリ内の特定の値/変数のために配列されたバイトを参照します。あなたのマシンのメモリでは、変数の場所は、構造体定義にリストされている順序と同じです。

限りパディングが行くように、あなたはそれがどのように機能するかについての詳細を見つけ、そしてなぜ受注案件ができ、here

また、あなたは、構造体の上にtypedefを使用して検討する必要があります。それはプログラムの残りの部分で少し面倒をコーディングします。あなたの構造体定義内のtypedefで

//always have to type "struct" 
struct entry_desc* x= (struct entry_desc)malloc(sizeof(struct entry_desc)*blah); 

なしのtypedef

typedef struct entry_desc { 
    /* Address */ 
    uint64_t addr; 
    /* Length. */ 
    uint32_t len; 
    /* Some flags. */ 
    uint16_t flags; 
    /* Next pointer */ 
    uint16_t next; 
}entry; 

entry* x =(entry)malloc(sizeof(entry)*blah)

+0

それは質問とはほとんど関係がありません。ちょうどリンク、おそらく.. –

関連する問題