Um processo possui um PID (Process IDentificator), uma tabela de handles abertos (será explicado no capÃtulo sobre a Windows API), um espaço de endereçamento virtual, e outras informações associadas a ele.
Para ver os processos ativos no seu sistema Windows neste momento, você pode usar o Gerenciador de Tarefas (experimente apertar Ctrl+Shift+ESC) ou o comando tasklist:
Na saÃda do comando tasklist, a coluna Image Name mostra o nome do arquivo executável (o arquivo no disco) associado ao processo. Perceba que há vários processos do svchost.exe por exemplo. É normal.
Para impedir que os programas do usuário acessem ou modifiquem dados crÃticos do sistema operacional, o Windows suporta dois nÃveis de execução de código: modo usuário e modo kernel, mais conhecidos por seus nomes em inglês: user mode e kernel mode.
Os programas comuns rodam em user mode, enquanto os serviços internos do SO e drivers rodam em kernel mode.
O linker serve para juntar todos os objetos num único arquivo, realocar seus endereços e resolver seus sÃmbolos (nomes de função importadas, por exemplo).
O executável vai depender de bibliotecas externas (DLLs, no caso do Windows) para funcionar e fará uso da Import Table conforme estudamos no capÃtulo anterior.
Como exemplo, vamos checar as dependências do binário da calculadora:
Mas e as DLLs, como "rodam"? Vejamos agora.
dumpbin /nologo /dependents c:\windows\system32\calc.exe
Dump of file c:\windows\system32\calc.exe
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
SHELL32.dll
KERNEL32.dll
msvcrt.dll
ADVAPI32.dll
api-ms-win-core-synch-l1-2-0.dll
api-ms-win-core-processthreads-l1-1-0.dll
api-ms-win-core-libraryloader-l1-2-0.dll
Este programa utiliza a função printf(), que não precisou ser implementada por quem o programou. Quem escreveu o código só precisou chamar a função, já que esta está definida no arquivo stdio.h.
Quando compilado, este programa terá uma dependência da biblioteca de C (arquivo msvcrt.dll no Windows) pois o código da printf() está nela.
Esta arquitetura garante que diferetens programadores e programadoras usem tal função e que ela terá sempre o mesmo comportamento se usada da mesma forma. Mas você já parou para pensar como a função printf() de fato escreve na tela? Como ela lidaria com as diferentes placas de vÃdeo, por exemplo?