sudoer にとって、それがいかに簡単であるかが突然私に思い浮かびます。 カーネルをクラッシュさせるために、私は次のようなことを試みました:
#include<stdio.h>
int main(){
printf("hello world");
int a;
printf("%p", &a);
int *p = (int*)0xffff000000000000; //x86_64, somewhere in the kernel space
printf("%p:%d", p,*p);
*p = 1;
printf("%p:%d", p,*p);
}
当然のことながら、sudo
なし 、プログラムを実行すると、セグメンテーション違反が発生します。 ただし 、何もありません sudo ./a.out
を介して実行する場合 ! hello world
でさえ 最初の行は、エラーや警告なしで抑制されます。
誰かが何が起こっているのか説明できますか?
承認された回答:
もちろん、カーネルがクラッシュすることはありません。real
ではなく、独自のプログラムの仮想メモリ空間に書き込んでいます。 カーネルメモリスペース。
仮想メモリの詳細については、こちらをご覧ください
追伸:
なぜprintf
何も印刷しませんか?デフォルトでは、標準出力はラインバッファリングされ、hello world
行区切り文字は含まれていません。
したがって、プログラムがクラッシュした場合、その出力は観察されません(puts
を使用してみてください または\n
を追加します メッセージ内)