Depois de executar o fork(), duas copias do mesmo programa estão rodando. Uma delas usualmente executa – exec() – outro programa. A chamada a sistema exec() deve localizar a imagem binária do arquivo executável, carrega-lo e executa-lo. "Carrega-lo" não significa, necessáriamente, copiar na memória a imagem binária do arquivo, para que,assim, o Linux possa atender a demanda de programas a serem executados.

A implementação Linux do exec() suporta formatos binários diferentes. Isto é dotado através da estrutura linux_binfmt, a qual embute dois ponteiros para funções – um para carregar o executável e o outro para carregar a "library" associada, cada formato binário deve conter, portanto, o executável e sua "library".

O sistema UNIX prove, ao programador, seis formas para a função exec(). Quase todos podem ser implementados como uma "library" de funções, e o kernel do Linux implementa sys_execve() independentemente das providas pelo UNIX.

Ele executa uma única tarefa: carregar o cabeçalho do executável, e tenta executa-lo. Se os dois primeiros bytes são "#!", então a primeira linha é ignorada e um interpretador é invocado, caso contrário o formato binário, registrado, é executado seqüencialmente.

O formato nativo do Linux é suportado diretamente por fs/exec.c, e as funções relevantes são load_aout_binary e load_aout_library. Assim como para os binários a função de carregamento "a.out" é invocada, e a função mmap() (memory map – memória virtual ) aloca espaço em disco (no caso da memória real estar cheia) para o processo, ou invoca read_exec(), caso haja espaço em memória. "The former way uses the Linux demand loading mechanism to fault-in program pages when they're accessed, while the latter way is used when memory mapping is not supported by the host filesystem (for example the "msdos" filesystem)".

A partir da versão 1.1 do kernel, o Linux embutiu um sistema de arquivos (filesystem) revisado do msdos, que suporta mmap() (memory map -memória virtual). Além disso a estrutura linux_binfmt é uma "lista ligada" e não um array, para permitir carregar um novo formato binário como um módulo do kernel. Finalmente a estrutura, por si mesma, foi estendida para acessar rotinas com o formato relativo à core-dump.
 

Fonte:
http://www.openline.com.br/linux-br/ – Home Page do Linux no Brasil
http://www.linux.org – Home page da Linux Organization, site oficial do Linux

Páginas: 1 2 3

Páginas ( 3 de 3 ): « Previous12 3