UNALIGNED(3) — NEWS-OS Programmer’s Manual
名称
una_lw, unaligned_load_word, una_lh, unaligned_load_half, una_lhu, unaligned_load_uhalf, una_lf, unaligned_load_float, una_ld, unaligned_load_double, una_sw, unaligned_store_word, una_sh, unaligned_store_half, una_sf, unaligned_store_float, una_sd, unaligned_store_double − 整列でないデータ参照
形式
long una_lw(addr)
long unaligned_load_word(addr)
char ∗addr;
long una_lh(addr)
long unaligned_load_half(addr)
char ∗addr;
long una_lhu(addr)
long unaligned_load_uhalf(addr)
char ∗addr;
float una_lf(addr)
float unaligned_load_float(addr)
char ∗addr;
double una_ld(addr)
double unaligned_load_double(addr)
char ∗addr;
void una_sw(addr, value)
void unaligned_store_word(addr, value)
char ∗addr;
long value;
void una_sh(addr, value)
void unaligned_store_half(addr, value)
char ∗addr;
long value;
void una_sf(addr, value)
void unaligned_store_float(addr, value)
char ∗addr;
float value;
void una_sd(addr, value)
void unaligned_store_double(addr, value)
char ∗addr;
double value;
解説
RISC NEWS のハードウェアでは、整列なデータしか参照できません。 すなわち、ロード/ストア操作において、そのアドレスが(ロード/ストアの) 対象とするバイト数の倍数でなければなりません。 整列でないデータを参照するとトラップを引きおこします。 このトラップがおこるとデフォルトでは、カーネルは SIGBUS シグナルを そのプロセスへ送り、デバッギングのためのコアを生成します。
MC68000 系列などの、整列制約のないシステム上で開発されたプログラムは、 整列でないデータを参照することがあります。 そのようなプログラムを RISC NEWS ハードウェアに移植するには、 データが整列するようにそのプログラムを書き直す必要があります。
しかし、すべてのデータを整列できない場合や、整列でないデータを 参照する箇所をすべて変更できない場合は、 sysnews(2) [NEWS_FIXADE] システムコールが便利です。 ただし、このシステムコールを使用した場合、整列でないデータを参照するたびに トラップをおこすため、高速度が要求されるプログラムにはここに上げた ルーチン群を使用します。
このルーチン群は、指定されたアドレスに、示されたデータタイプをロードまたは ストアします。 アドレスは、正規の整列制約に合わせる必要はありません。 たとえば、
n = ∗(long ∗)addr;
が整列でないデータ参照であった場合、次のようにします。
n = una_lw(addr);
ここで、unaligned_load_word(addr) は、una_lw(addr) と全く同じです。
これらのルーチンに対する Fortran エントリが存在するので、 ここで記述した名前で Fortran から直接呼び出すことができます。
診断
これらのルーチンが、プログラムのアドレス空間外のアドレスにロードや ストアを試みた場合、SIGSEGV 信号が生成されます。 しかし、プログラムがこれらのルーチンを使用せずに、しかも アドレスが整列されていない場合は、プログラムは SIGBUS 信号を生成します。 なぜならば、整列に対するチェックは、アドレスがそのプログラムのアドレス 空間にあるかどうかチェックする前に行われるからです。
関連事項
dbx(1), sysnews(2) [NEWS_FIXADE], signal(2), sigset(2)
NEWS-OSRelease 4.2.1R