Tuesday, April 17, 2018

Criando e executando um processo


** Criando e executando um processo **


Há muitas formas de criar e executar um processo.Nessa postagem vou pontuar alguns rumos pra nossa conversa.


[ visão geral ]

Dentro do kernel você vai ter uma função que cria um processo e esse processo terá uma thread primária e seu próprio diretório de páginas. Você poderá chamar essa função para criar um processo.


[fork malandro]

A função fork é só um jeito malandro de criar um novo processo, pois ao invés de criar um novo diretório de páginas para o novo processo, é apenas clonado provisoriamente o diretório de páginas do processo pai. Herdando também outros recursos como o fluxo padrão.


[threads]

+Existem threads criadas pelo kernel para rodarem em kernel mode e threads para rodarem em user mode. Um aplicativo em user mode pode chamar o kernel para criar threads.

+Existem threads criadas e gerenciadas pelos aplicativos. Essas threads precisarão de uma thread criada pelo kernel para rodarem. Ou seja, um gerenciador de threads que fica em user mode pode criar threads, mas para que suas threads rodem ele precisa de threads correspondentes criadas pelo kernel.


[criando o processo]

O kernel pode criar processos.O aplicativo em user mode pode chamar o kernel para criar processos.


[executando um processo]

O kernel pode executar um processo. Um aplicativo em user mode pode chamar o kernel para executar um processo.


[...]

Wednesday, March 14, 2018

Can't Take My Eyes Off You

You're just too good to be true
I can't take my eyes off you
You'd be like heaven to touch
I wanna hold you so much
At long last love has arrived
And I thank God I'm alive
You're just too good to be true
Can't take my eyes off you

Pardon the way that I stare
There's nothing else to compare
The sight of you leaves me weak
There are no words left to speak
But if you feel like I feel
Please let me know that is real
You're just too good to be true
I can't take my eyes off you

I love you baby
And if it's quite all right
I need you baby
To warm the lonely nights
I love you baby

Trust in me when I say

...

Can't Take My Eyes Off You - (Frank Valli)

Friday, March 9, 2018

files

Eu acredito que uma boa parte de vocês encontrem problemas com a inicialização, assim como eu. Por isso proponho uma discussão sobre o assunto.
No meu sistema o boot funciona assim:
>> O primeiro arquivo é o MBR, ele carrega o arquivo BM.BIN na memória e passa o comando para ele, além de passar como argumentos alguns parâmetros de disco. O MBR encontra o BM.BIN do diretório raiz de uma partição formatada em fat16. Isso é feito em 16bit usando recursos do BIOS.
>> O segundo arquivo é BM.BIN, Boot Manager, ele é feito em assembly 16/32bit. Já de cara, ainda em 16bit, usando recursos do BIOS, ele carrega na memória o arquivo BL.BIN, depois faz algumas inicializações em 16bit, muda para o modo protegido, de 32bit, e entra em um mini-shell feito em assembly 32bit, de onde eu posso efetuar comandos para verificar as propriedades de disco e outras coisas. Um dos comandos é o comando 'boot', que retorna para o modo real, muda para o modo gráfico usando VESA e depois comuta para o modo protegido e passa o comando para o arquivo BL.BIN. Além de passar um monte de argumentos para ele como parâmetros do sistema.
>> O terceiro é o BL.BIN, Boot Loader. Ele é feito em C e Assembly 32bit. Quando ele inicializa ele recebe e salva os argumentos, que são muito impotantes. Em seguida passa o comando para a parte em C 32bit, que carregará o KERNEL.BIN e vários outros arquivos, que estejam em um disco IDE formatado em fat16. Faz algumas inicializações de paginação e passa o comando para o Kernel.
>> O quarto é o kernel em si. Falarei detalhadamente sobre ele em outro post. Mas ele é feito em C e Assembly 32 bit. É do tipo híbrido, e contém quatro camadas. Chamadas /hal /microkernel / executive /gramado. A camada /hal é para abstrações de hardware, é a única camada e mexe diretamente com o hardware. A camada /microkernel, faz a inicialização, a comunicação entre processos, o dma e principalmente o gerenciamento de processos e threads. A camada /executive são rotinas de nível superior, longe do hardware, ela oferece rotinas mais elaboradas, principalmente para gerenciamento do sistema. Por último e acima de todas, está a camada /gramado, nela estão os recursos gráficos, as primitivas de suporte para logon, logoff e gerenciamento de usuário.
Por fim, o kernel irá passar o comando para os threads dos processos que estão em user mode e fica rodando esses threads dos processos, seguindo uma ordem de prioridades, ele intercala entre eles, deixando cada thread usar o processador na média por 8 ciclos do timer, cada ciclo tem 10 milisegundos. O thread com mais prioridade fica mais tempo.


Timer

** Timer **
Quanto tempo um thread deve ficar utilizando o processador até que seja substituido por esgotamento de tempo ??
Eu programo meu PIT para operar no modo 3, (geredor de ondas quadradas), gerando uma interrupção a cada 10 milissegundos, ou seja, 100Hz.
Eu troco de thread, na média, a cada 9 interrupções de timer. Dependendo da prioridade do thread. Ou seja, a cada 90 milissegundos.
Eu já vi que um time-slice padrão é 100 ms, mas que pode variar muito dependendo da prioridade.
Quanto tempo devo deixar um thread usando o processador antes de efetuar preempção por tempo ??

Janelas

** Janelas **
Bom, todo mundo aqui sabe que um sistema operacional pode funcionar sem interface gráfica. Não é isso o que eu quero discutir.
***
Pode parecer que lidar com janelas é uma coisa fácil mas não é.
Pra mim, o maior problema em lidar com janelas são as mensagens, isso mesmo, janelas recebem mensagens e são afetadas por essas mensagens e o que afeta a janela pode afetar o processo ao qual ela pertence.
Essas mensagens podem vir de vários lugares. Podem vir do teclado, do mouse, de um toque na tela ou simplesmente enviadas por rotinas de envio de mensagens.
Uma mensagem afeta uma janela específica que normalmente é a janela com o foco de entrada.
Um procedimento de janela é a rotina que recebe essas mensagens e efetua alguma ação de acordo com o número da mensagem.
Desde o começo do projeto é bom que saibamos que os dispositivos de entrada enviarão mensagens que afetarão as janelas. Não importa o tamanho do seu projeto, a questão é que se ele for usar interface gráfica, precisa se preocupar com essa transferência de mensagem entre o driver de dispositivo e o procedimento de janela que irá receber essa mensagem.
Para 'facilitar' a coisa criamos filas de mensagens. A mensagem que saiu do teclado vai parar em alguma fila de mensagens, e as vezes digitamos mais rápido do que a capacidade do aplicativo de processar essas mensagens, então as mensagens vão se enfileirando, esperando cada uma a sua vez.
***
A parte divertida é pintar as janelas, mover as janelas ... isso é mais simples de entender e mais divertido, mas também não é fácil.
Quando o assunto é janela, devemos lembrar que elas consomem muita memória e tempo de processamento.
O tempo que os elementos gráficos demoram para aparecerem na tela é o ponto chave. Esse tempo é afetado por inúmeras variáveis.
Quem deseja fazer um sistema operacional com interface gráfica deve se preocupar com ela desde o início do projeto.

Equilíbrio

** Equilíbrio **
Você não conseguirá fazer um equilíbrio da utilização dos recursos de processamento sem a contagem ...
É preciso contar todo tipo de evento relativo a utilização de recursos de processamento. Coisas como quantos ticks to timer uma thread rodou até ceder a vez para outra thread ou quantos ticks de timer o thread ficou rodando até terminar a execução.
Um aplicativo em user mode pode fazer uma análise dessas estatísticas sobre utilização de recursos de processamento. Para levar o sistema a um equilíbrio.
O primeiro objetivo é conseguir esse equilíbrio ... qualquer problema faz o sistema sair do equilíbrio desejado ... Então o sistema deverá reagir a essa saída do equilíbrio e voltar para o equilíbrio.
Quem será responsável por isso serão serviços utilitários de análise de utilização de recursos de processamento.

Criando e executando um processo

** Criando e executando um processo ** Há muitas formas de criar e executar um processo. Nessa postagem vou pontuar alguns rumos pra ...