Najednou mi přijde, jak snadné to pro sudoera bude k pádu jádra, tak jsem zkusil něco takového:
#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);
}
Pochopitelně bez sudo
, spuštění programu ukáže chybu segmentu. Nicméně , nemám NIC když jej spustíte pomocí sudo ./a.out
! Dokonce i hello world
v prvním řádku je potlačeno bez jakékoli chyby nebo varování.
Může někdo vysvětlit, co se děje?
Přijatá odpověď:
Samozřejmě to nezničí jádro, zapisujete do virtuálního paměťového prostoru vašeho vlastního programu, nikoli do real
paměťový prostor jádra.
Další informace o virtuální paměti naleznete zde
P.S:
Proč printf
nic netiskne? Standardně je standardní výstup ukládán do vyrovnávací paměti a váš hello world
neobsahuje oddělovač řádků.
Pokud se tedy program zhroutil, nebudete tento výstup pozorovat (zkuste použít puts
nebo přidáním \n
ve vaší zprávě)