Diferença entre programas compilados para diferentes sistemas operacionais

7

Em um ponto de vista de código compilado, qual é a diferença entre um programa compilado para um sistema operacional versus outro (Linux versus Windows, por exemplo). O programa não roda diretamente na CPU? Ou é porque o programa precisa referenciar bibliotecas específicas do SO?

    
por agz 30.01.2013 / 00:39

3 respostas

5

Programas compilados comuns "rodam diretamente" na CPU, mas um programa não roda no vácuo:

  1. Muitos programas dependem de bibliotecas externas carregadas dinamicamente ( DLLs ou .so libraries). A maneira de vinculá-los é com o compilador / linker, e cada sistema operacional tem padrões diferentes. No entanto, existem também programas "estaticamente vinculados" que fornecem todo o seu próprio código.

  2. Um sistema operacional moderno não oferece controle total do computador para um programa em execução. Os programas dependem de "chamadas de sistema" para E / S, acesso a hardware e coisas como sinais e entrar em um estado de suspensão. Os serviços e interface disponíveis são definidos pelo sistema operacional. O sistema operacional também controla quais partes do sistema (memória, registros, interrupções) o programa pode usar.

  3. Um programa GUI também deve funcionar através do ambiente gráfico do usuário para se desenhar na tela. Mas você provavelmente já pensou sobre isso.

Por esses motivos, os aplicativos independentes do sistema operacional devem contar com uma "máquina virtual" de algum tipo, como a fornecida pelo Java Runtime. Crucialmente, uma VM fornece uma interface padrão para recursos do sistema operacional (E / S, sinais, etc). É claro que java ou python também interpretam "bytecode" em vez de lidar com as peculiaridades do conjunto de instruções da Intel; mas essa é uma história diferente.

    
por 30.01.2013 / 01:12
4

Diferentes sistemas operacionais também têm funcionalidades diferentes. O Windows tem portas de conclusão de E / S, o Linux não. O FreeBSD tem o kqueue, o Linux não. Linux tem futexes, o Windows não. Eles também têm maneiras diferentes de fazer a mesma coisa - quais parâmetros você passa para abrir um arquivo? Em que ordem eles entram? Como especificamente você invoca a função "abrir um arquivo" do sistema operacional?

    
por 30.01.2013 / 00:41
4

Em geral, os programas não são compatíveis devido às diferenças em sua interface binária do aplicativo (ABI) .

Doesn't the program run directly on the CPU?

NÃO ! Esse é o trabalho do sistema operacional, para impedir que os aplicativos sejam executados "diretamente" na CPU. Normalmente, no nível mais baixo (ou seja, aquele em que a API do SO é construída), um aplicativo faz interface com o kernel do sistema operacional. .

Is it because the compiled program itself needs to reference OS specific libraries?

Sim . Muitas bibliotecas de SO são escritas para facilitar a interface com o sistema operacional em si, mas há tantas que são escritas para serem de plataforma cruzada. Eles ocultam a interface do sistema operacional de baixo nível do desenvolvedor e presume que a versão compilada para esse SO estará disponível em tempo de execução (veja abaixo).

Embora as bibliotecas possam ser escritas de maneira multi-plataforma, quando compiladas elas não podem ser executadas entre plataformas. Eles ainda precisam ser recompilados para o sistema operacional de destino específico, novamente para utilizar os componentes subjacentes específicos do sistema operacional (kernel).

What is the difference between a compiled program for one OS vs another?

Por fim, os próprios arquivos executáveis geralmente contêm cabeçalhos de carregamento binários muito específicos e assim por diante (por exemplo, o formato de arquivo PE Executable [.exe, .dll, etc ...] para Windows, ou ELF para Linux [nenhum, .o,. então, etc ...]). Eles também podem incluir código para carregar os binários específicos do sistema operacional compilados para uma biblioteca de software específica.

Por último, do ponto de vista de um programador: convenção de convocação . Código compilado passa variáveis para funções de uma determinada maneira (ou seja, através de registros, ou na pilha) em uma ordem muito particular. Mesmo assim, também é necessário concordar com quem é responsável por "limpar" as chamadas de função (o chamador ou o chamado). Embora existam diversas convenções de chamada x86 padrão e amplamente usadas, algumas podem não ser suportadas por certos sistemas operacionais (isso faz parte ABI).

    
por 30.01.2013 / 01:31