google-code-prettify

ラベル CPU の投稿を表示しています。 すべての投稿を表示
ラベル CPU の投稿を表示しています。 すべての投稿を表示

2009-12-10

x86のmisalignアクセス時に例外を起こす方法

x86ではmisalignアクセス時でも、例外を起こさずにアクセスする事ができる。
例えば次のコード

long *p;
char buf[32];
p = (long*)&buf[1];

*p = 0;

は、misalignアクセスであり、多くのプロセッサでは例外が発生する。

x86でも同様に例外を発生させてやるには、EFLAGSレジスタのbit18、AC(Alignment Check)ビットを1にしてやれば良い。

gccのインラインアセンブラの例。

__asm__ __volatile__ (
"pushf\n"
"\tpopl %%eax\n"
"\tor $0x00040000, %%eax\n"
"\tpushl %%eax\n"
"\tpopf\n"
:::"%eax");


これが何の役に立つかと言うと、
・misalignアクセスで例外が発生するプロセッサ上で動作させるコードを作成したい。
・でも、そのテストはx86(Linuxなど)上で行いたい。
という場合。

参考:
X86 Assembly/X86 Architecture
Mis-aligned pointers on x86
GCC Inline Assembler


09/12/11 追記:
この機能、実はあまり使えないような気がしてきた。
なぜなら、glibcはACが0である事を期待したコードになっていて、ACを1にするとglibcの関数で落ちるから。

2007-12-19

mprotectでPROT_WRITEした領域へのmemsetができない場合がある

NetBSDのcompat-linuxな環境で、以下のコードが動作しないらしい。
mprotect(buf, len, PROT_WRITE);
memset(buf, 0, len);
原因は、glibcがmemset時にリードアクセスを行う事があるためらしい。

memset時にリードアクセスをすると速くなる(事がある)理由は、以下の通り。
・アーキテクチャによっては、read時のキャッシュミスではキャッシュをfillし、write時のキャッシュミスではfillしない物がある。
・そのようなアーキテクチャの場合、4バイト毎に実メモリへの書き込みが発生してしまう。
・事前に一回空readをしてキャッシュラインをfillしておくと、writeアクセスは実メモリではなくキャッシュに対して行われるようになり、高速に書き込みが行われる。

via current-users@netbsd

2007-01-18

同じコアのCPUでも、機器ごとに命令セットを変える

組み込み機器にもLinuxが普及すると、組み込みLinuxを狙ったウィルスが増えてくると予想される。
一つウィルスプログラムを作れば、同じコア、同じバージョンのLinux全てを一つのウィルスで攻撃できる可能性があるからだ。

そこで、同じコアのCPUでも機器ごとに命令セットのビットを変える事ができるCPUというのはどうだろう。
この機能があれば、バッファオーバーフローによるのっとりなどの攻撃がかなり防げるのではなかろうか。