2006年06月21日

奇数アドレス

奇数アドレスにワードやロングワードではアクセスできません。
これはアーキテクチャ上の問題で、CPUから例外割り込み(バスエラー)が起きます。
試してみましょう。

下記のコードを実行してみましょう。


#include <stdio.h>

int main(void)
{
char* p = (char*)malloc(100);
int* ip;
printf("p = %p\n",p);
ip = (int*)(p+1);
printf("p+1 = %p\n",(p+1));
*ip = 0;
*(ip+1)=0;
free(p);
}



ではコンパイルして実行してみます。
VS2.png

あれ…?アクセスで、できる( ゚д゚;)ヤン
Win2.png


俺の記憶は間違いだったのか?
昔組み込みのヤツやってたとき誤って奇数アドレスに
配置したら吹っ飛んだ記憶があるんだが…。

以下、調べた結果

Pentium4の資料に下記の下りがある。


4.1.1 Alignment of Words, Doublewords,
Quadwords, andDouble Quadwords

Words, doublewords, and quadwords do not need
to be aligned in memory on natural boundaries.

The natural boundaries for words, double words,
and quadwords are even-numbered addresses, addresses
evenly divisible by four, and addresses evenly
divisible by eight, respectively.

However, to improve the performance of programs,
data structures (especially stacks)should be
aligned on natural boundaries whenever possible.
The reason for this is that the processor requires
two memory accesses to make an unaligned memory access;
aligned accesses require only one memory access.
A word or doubleword operand that crosses a 4-byte
boundary or a quadword operand that crosses an
8-byte boundary is considered unaligned and requires two
separate memory bus cycles for access.
Some instructions that operate on double quadwords
require memory operands to be aligned on a natural
boundary. These instructions generate a
general-protection exception (#GP) if an unaligned
operand is specified. A natural boundary for a
double quadword is any address evenly divisible
by 16. Other instructions that operate on double
quadwords permit unaligned access (without
generating a general-protection exception).
However, additional memory bus cycles are
required to access unaligned data from memory.


ヘー(´ν_.`)ソウナンダ
おじさん知らなかったよ。組み込みやってたときに奇数アドレスアクセスやっちゃったときは
電源切れたり、暴走したりして吹っ飛んだけどナァ。

とは言っても、境界を跨いだメモリアクセスなど出来るわけなく、実際には2回メモリアクセスしてるだけですって。
キイタ?( ゚д゚)オクサン(゚д゚ )アラヤダワァ


どうもモトローラ系というか古いRISC系のCPUでのみの問題らしい(?)
試しにRISC系である PowerPCでも試してみた。

PowerPC2.png
にゃんと! PowerPCも動く( ゚д゚;)ヤン
IBMのサイトでマニュアルとにらめっこしてみたら
下記の下りがあった

The 604e supports misaligned memory operations,
although their use may substantially degrade performance.

Misaligned memory transfers address memory that is not
aligned to the size of the data being transferred
(such as, a word read of an odd byte address).

Although most of these operations hit in the primary
cache (or generate burst memory operations if they miss),
the 604e interface supports misaligned transfers
within a word (32-bit aligned) boundary, as shown in
Table 8-5. Note that the four-byte transfer in Table 8-5
is only one example of misalignment.
As long as the attempted transfer does not cross a
word boundary, the 604e can transfer the data on
the misaligned address (for example, a half-word
read from an odd byte-aligned address).

An attempt to address data that crosses a word
boundary requires two bus transfers to access the data.
Due to the performance degradations associated with
misaligned memory operations, they are best avoided.

In addition to the double-word straddle boundary condition,
the address translation logic can generate substantial
exception overhead when the load/store multiple and
load/store string instructions access misaligned data.
It is strongly recommended that software attempt
to align code and data where possible.

ふむふむ、pentiumとかわらんねぇ。
サポートしてるけど、ちゃんとAlignedしてないと遅いよ、ってことだね。
いやはや、技術の進歩はすばらしいですなぁ。


posted by koteitan at 18:06| Comment(0) | TrackBack(0) | プログラム全般 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック