sexta-feira, 12 de junho de 2009

Por baixo dos panos: O Windows e Você!

Eu novamente com mais uma série de tutos, mas dessa vez explorando o windows completamente.
Você vai traçar APIs nativas, aventurar-se no ring 0 e eu prometo.. que se uma tela azul aparecer no seu computador por conta de qualquer erro, no final desse tuto você vai depura-la e saber o que causou esse erro.

Você pra ler esse tuto precisa de conhecimentos intermediário de C e se possível conhecimentos básicos de assembly.
Não tem?
Não leia.
Preguiça de ler?
Não leia pois eu acredito que o tuto todo possa formar mais de 2 ou 3 mil páginas de livro.

Avisos dados então..
Let's rock! =]

\---(BASEADO NO WINDOWS XP)---/



A primeira parte é sempre teórica.. vo mandar braza.. mora?
Então ta supimpa.

Um micro-processador possui básicamente quatro estágios.
O windows se aproveita de dois desses estágios.
O primeiro chamado de ring 0(zero) e o quarto chamado de ring 3.
Ao ring0 damos o nome de kernel-mode.
Ao ring3 damos o nome de user-mode.
O windows é um kernel-sided operational system, ou seja, o seu "código principal" está todo em kernel-mode(ring0).
O kernel do windows é o seu núcleo e ele é o dito "código principal" do sistema operacional.

O que está em user-mode não pode tocar nem ver o que está em kernel mode.
É um conceito bem antigo chamado de sand-box que impede que aplicações usuário danifiquem qualquer componente vital para o funcionamento do sistema. Por isso, se o seu programa der um erro, parar de responder ou qualquer outra coisa.. o sistema operacional será capaz de se recuperar e fechá-lo.

O micro-processador mantém-se alterando de tempo em tempo entre user-mode e kernel-mode.
Hora executa um trexinho de código daqui e hora executa um trecho de código dali.
O windows usa uma interrupção especial que força o processador a entrar no ciclo de kernel-mode.(ela é usada nas APIs por exemplo)

Mas o que são APIs?
Vamos voltar ao mundo real um pouquinho e deixar o ring0 e o ring3 de lado por um instante.

Você tem seu programa codado em C.
O compilador já passou pelos três estágios e gerou seu executável e vamos imaginar que ele só exiba a string "ola mundo!" na tela.
Mas me diga.. como seu programa sabe mostrar na tela as letras que você escreve?
Qual a resolução do seu monitor?
Quais pixels devem ser ascesos?(finjamos que pixels sejam mini-lampadas que ficam na tela do seu pc e que tudo seja tão simples assim)

É ai que entra o sistema operacional.
Ele faz todo o trabalho de se comunicar com o hardware por você.

VOCÊ --> HARDWARE --> WINDOWS -> SEU PROGRAMA

Você não precisa saber qual tipo de monitor está instalado e nem como "ligar" os pixels certos.
Você só diz o que quer escrever e manda o windows fazer o trabalho sujo por você.
Pros oriundos da programação orientada à objetos(POO), isso chama-se encapsulamento.
É a capacidade que um certo componente te dá de trabalhar com ele e com outros meios através dele, sem necessáriamente saber o funcionamento dele ou dos outros meios.

Pra quem já programou na IDE delphi sabe muito bem que você não precisa saber como a TForm aparece la ou aqueles componentes de envio de email.
Você só envia e ele encapsula toda a forma como as smtp requests são geradas e etc.

Mas apartir de agora, o que vai nos interessar, é justamente saber o que acontece por baixo dos panos do windows.

Então, como o printf do seu programa em C chega no hardware de vídeo?
Existem duas metades que se unem para isso acontecer.
O user-mode e o kernel-mode.
Vamos começar entendendo o user-mode.

O windows disponibiliza essas tais APIs.
Elas fazem várias operações e muitas vezes terminam levando as informações que você passa pra elas pra outras APIs que tratam as informações e por final, levam pra uma ultima API nativa da ntdll que chamará por fim a interrupção que fará o processador passar para ring0(kernel-mode).

Existem no entanto, algumas APIs que realizam todas as suas operações em user-mode mesmo.(que não acessam o hardware)
Nós conheceremos algumas delas no decorrer do tuto.

Então, levando em consideração o diagrama anterior, podemos muda-lo mais um pouco para:

VOCÊ <--> HARDWARE <--> WINDOWS <---> APIs <---> SEU PROGRAMA




Bem, eu vou ficar por aqui porque se não o pessoal fica com preguiça de ler..

O windows possui muitas coisas interessantes que poucas pessoas sabem, como um sub-sistema que por exemplo, é feito para permitir a compatibilidade com programas nix like.(interoperabilidade)

Vamos com o tempo conhecer isso tudo e entender porque no meu ponto de vista, o windows ainda é o sistema operacional mais completo existente.

Cya'round. =]

5 comentários:

  1. API do windows é um erro quando se fala de portabilidade prefiro usar WxWidgets,Tk,GTK,QT,alegro,SDL pois rodam em qualquer plataforma desde *BSD até Linux e windows..

    ResponderExcluir
  2. Essas libs são para fazer programas padronizados multi-plataforma.

    Se você um dia precisar usar um recurso do sistema operacional que seja específico, como alterar a frequencia de uma onda elétrica, então provavelmente você vai precisar usar APIs e syscalls.

    Depois é só encapsular tudo em uma DLL(não me refiro à .dll) e fazer uma para cada sistema operacional... é assim que essas libs que você citou funcionam.

    ResponderExcluir
  3. Interessante Sergio, tambem trabalho na area de T.I, mas só em administração de redes. Sempre admirei meus amigos desenvolvedores pela complexidade que eles lidam no dia dia.


    Um Abraço.

    ResponderExcluir
  4. Gostou do artigo do Fergo sobre segurança do windows... ^^,

    ResponderExcluir
  5. Muito interessante a forma como você coloca as coisas, isso de "levar para o real" facilita de mais o entendimento. Com esse seu jeito descontraido de escrever então , fecho rsrs.

    Parabens gostei muito.

    ResponderExcluir

><))).>