だから、私はそうする:最大スタックサイズ、ulimit -s、segfault 11 - これはどのように機能しますか?
$ ulimit -s
8192
素晴らしい。私が理解しているように、どのプロセスのスタックセグメントも8192キロバイトを超えることはできません。今
、それに挑戦する...コンパイル
#include <stdio.h>
void over_8k(void) {
char buf[1024*1024*20];
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
。蘭問題はありません。まあこれは正しくないのですか? over_8k
だけでは、20メガバイトを超えるスタックフレームが必要です。さて、この20万のバイトにアクセスしてみましょう:
#include <stdio.h>
#include <string.h>
void over_8k(void) {
char buf[1024*1024*20];
memset(buf, 'A', sizeof(buf));
}
int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}
...ドラムロール...グレート
Segmentation fault: 11
。しかし、それは私が期待しているエラーではない?無効なメモリアクセスですか?
なぜセグメンテーションが発生し、以前にエラーが発生していませんか?おそらくover_8k
への電話で?これはどのように作動しますか?私はすべてを知りたい。
私の推測:スタック割り当ては、しばしばスタックポインタの増分/減分です。それ自体はセグメンテーションされません。データにアクセスしようとすると、マップされていないメモリに入ってクラッシュします。 – Mysticial
@神秘的な:まあまあ。コンパイラがアセンブリコードを提供するのは簡単です。 – maverik
上記のコードをコンパイルしてテストするためにどのコンパイラとフラグを使用していますか? – Matt