読み取りデータとアドレスの位置合わせ
読み取りデータとアドレスの位置合わせ
chinaunixに長く滞在して、ここでいくつかの考えを記録したいと思って、以前のばらばらな記録も整理して、みんなと一緒に進歩することを望んでいます.この文章も開博第1回としましょう.
今日は本をめくって、コード移植に注意しなければならないいくつかの問題を見て、その中でデータの位置合わせに言及して、私に出会ったx 86とARMプラットフォームのいくつかの小さな違いを思い出しました.
私たちが望むデータを得るために、タイプを強制的に変換する必要がある場合があります.例えば、
linuxカーネルにget_がありますUnialigned()マクロ定義は、プラットフォーム間で使用できるようにします.この関数はどのような役割を果たしますか?定義を見てみましょう
また見る_get_unaligned_le:
また見る_get_unaligned_4_le:
X 86プラットフォームは簡単で、ポインタ操作です.armプラットフォームはバイトシフトで相乗する必要がある.理由は簡単で、ARMは整列を要求して、そのアーキテクチャと関係があります.正しいデータをmemcpyまたはバイトシフトで相乗する方法を得たい.私たちはプログラミング中にポインタでデータを読み取ることが多いと思いますが、注意しないとわけのわからない現象が発生することがあります.
要するに、コードを異なるプラットフォームに移植する場合は、この点に注意する必要があります.
以前の日記をめくると、ADS 1.2での試験結果が表示されます.
chinaunixに長く滞在して、ここでいくつかの考えを記録したいと思って、以前のばらばらな記録も整理して、みんなと一緒に進歩することを望んでいます.この文章も開博第1回としましょう.
今日は本をめくって、コード移植に注意しなければならないいくつかの問題を見て、その中でデータの位置合わせに言及して、私に出会ったx 86とARMプラットフォームのいくつかの小さな違いを思い出しました.
私たちが望むデータを得るために、タイプを強制的に変換する必要がある場合があります.例えば、
char data[10]= {1,2,3,4,5,6,7,8,9,0};
unsigned int d[4];
d[0] = *(unsigned int *)&data[0];
linuxカーネルにget_がありますUnialigned()マクロ定義は、プラットフォーム間で使用できるようにします.この関数はどのような役割を果たしますか?定義を見てみましょう
asm-i386/unaligned.h:
#define get_unaligned(ptr) (*(ptr))
asm-arm/unaligned.h:
183 #ifndef __ARMEB__
184 #define get_unaligned __get_unaligned_le
185 #define put_unaligned __put_unaligned_le
186 #else
187 #define get_unaligned __get_unaligned_be
188 #define put_unaligned __put_unaligned_be
189 #endif
また見る_get_unaligned_le:
54 #define __get_unaligned_le(ptr) \
55 ({ \
56 __typeof__(*(ptr)) __v; \
57 __u8 *__p = (__u8 *)(ptr); \
58 switch (sizeof(*(ptr))) { \
59 case 1: __v = *(ptr); break; \
60 case 2: __v = __get_unaligned_2_le(__p); break; \
61 case 4: __v = __get_unaligned_4_le(__p); break; \
62 case 8: { \
63 unsigned int __v1, __v2; \
64 __v2 = __get_unaligned_4_le((__p+4)); \
65 __v1 = __get_unaligned_4_le(__p); \
66 __v = ((unsigned long long)__v2 << 32 | __v1); \
67 } \
68 break; \
69 default: __v = __bug_unaligned_x(__p); break; \
70 } \
71 __v; \
72 })
また見る_get_unaligned_4_le:
48 #define __get_unaligned_4_le(__p) \
49 (__p[0] | __p[1] << 8 | __p[2] << 16 | __p[3] << 24)
X 86プラットフォームは簡単で、ポインタ操作です.armプラットフォームはバイトシフトで相乗する必要がある.理由は簡単で、ARMは整列を要求して、そのアーキテクチャと関係があります.正しいデータをmemcpyまたはバイトシフトで相乗する方法を得たい.私たちはプログラミング中にポインタでデータを読み取ることが多いと思いますが、注意しないとわけのわからない現象が発生することがあります.
要するに、コードを異なるプラットフォームに移植する場合は、この点に注意する必要があります.
以前の日記をめくると、ADS 1.2での試験結果が表示されます.
char data[10]= {1,2,3,4,5,6,7,8,9,0};
unsigned int d[4];
d[0] = *(unsigned int *)&data[0];
d[1] = *(unsigned int *)&data[1];
d[2] = *(unsigned int *)&data[2];
d[3] = *(unsigned int *)&data[3];
printf("d[0] is 0x%08x
", d[0]);
printf("d[1] is 0x%08x
", d[1]);
printf("d[2] is 0x%08x
", d[2]);
printf("d[3] is 0x%08x
", d[3]);
:
d[0] is 0x04030201
d[1] is 0x01040302
d[2] is 0x02010403
d[3] is 0x03020104