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を追加します メッセージ内)