Por que execve e brk (NULL) são sempre as duas primeiras chamadas do sistema?

1

Quando eu tento

strace ping google.com

ou

strace ls 

ou

even strace curl <domain>

As duas primeiras chamadas do sistema são sempre

execve("/usr/bin/curl", ["curl", "google.com"], 0x7ffecf1bc378 /* 61 vars */) = 0
brk(NULL)                               = 0x55f553c49000

Alguém pode me dizer se o execve sempre será o primeiro systemcall quando eu executar alguma coisa?

Eu li esta página de manual, link Mas não entendi se execve é realmente uma chamada de sistema ou um programa executável?

    
por MaverickD 27.08.2018 / 00:39

1 resposta

2

No Linux, um novo processo é criado via fork() , o que torna um processo filho quase idêntico para o processo pai. Para criar um novo processo cujo programa é diferente do que o programa do processo original, o novo processo filho chama imediatamente execve() , que é basicamente o processo que diz "substitua meu programa atual por outro programa". .

brk(NULL) é o processo perguntando onde está memória de heap termina. Muitos programas chamam isso como sua primeira chamada de sistema (que será exibida logo após execve() ) porque eles usam malloc() imediatamente (ou uma chamada de biblioteca que usam usa malloc() internamente). Se o programa e suas chamadas de biblioteca não precisarem chamar malloc() por algum tempo, algo além de brk(NULL) será a segunda chamada de sistema.

    
por 27.08.2018 / 02:38