Acesso ao Kernel
O kernel do OpenSolaris permite dois modos de execução no processador. O modo não-privilegiado, no qual são executados os processos de usuário, e o modo privilegiado, no qual somente os processos do kernel são executados.
No modo não-privilegiado o processo tem acesso somente a sua parcela de memória de sistema, enquanto que no modo privilegiado o processo têm-se acesso à todas as estruturas de dados do kernel, assim como a todo o hardware do sistema.
Existem três formas de entrar em modo privilegiado:
- Através de uma system call;
- Através de uma interrupção;
- Através de traps.
Processos
A principal tarefa do kernel de um sistema operacional (SO) é permitir a execução de aplicações e dar suporte a elas através de camadas de abstração sobre o hardware. Para executar uma aplicação, o kernel precisa carregar na memória o arquivo que contém o código executável da aplicação (e eventualmente inicializar o seu próprio espaço de endereçamento), inicializar a pilha de execução do programa e assim iniciar a sua execução.
Um kernel multitarefa é preparado para dar ao usuário a ilusão que o número de processos em execução simultânea no computador é maior que o número máximo de processos que o computador é capaz de executar simultaneamente. Tipicamente, o número de processos que um sistema pode executar simultaneamente é igual ao número de CPUs instaladas.
Em um sistema multitarefa, o kernel dá a cada programa uma fatia do tempo e alterna de processo para processo tão rapidamente que o usuário pensa que estes processos são executados simultaneamente. O kernel utiliza algoritmos de agendamento para determinar qual processo será executado na seqüência e quanto tempo ele terá, ele também considera que um processo pode ter uma prioridade maior em relação aos outros.
Os sistemas operacionais modernos devem suportar multi-processamento. Neste caso, programas diferentes e threads de programas podem ser executados em diferentes processadores. Para que um kernel suporte este tipo de sistema, ele deve ser amplamente modificado para ser "re-entrante" e "interruptível", o que significa que ele pode ser interrompido no meio da execução de uma tarefa. Se esta funcionalidade estiver presente, os programas executados ao mesmo tempo em processadores diferentes podem chamar o kernel de maneira segura. O kernel também deve disponibilizar um modo de sincronizar o acesso à memória em processadores diferentes, fazendo com que o gerenciamento de memória e de processos sejam tópicos altamente relacionados.
Inicialmente, quando se dá a ativação do sistema, é criado o processo 0, que por sua vez cria o processo 1, conhecido como init. Este é o ancestral de todos os outros processos.
Os processos são criados pela primitiva de sistema fork. Essa função, ao ser chamada por um processo em execução (processo-pai), cria uma cópia igual desse processo (processo-filho) - um processo-pai pode ter vários processos-filhos e estes também podem ter seus processos-filhos. A partir daí, tanto o processo-pai quanto o processo-filho têm seu próprio espaço de endereçamento. Dessa forma, as variáveis de um não são visíveis ao outro e vice-versa.
Os processos são identificados mediante um código de identificação, pid , que é fornecido pelo processo-pai ao processo-filho.
Os processos no OpenSolaris possuem duas estruturas-chave: a tabela de processos, que contém informações como número do processo, modo e prioridade. E a estrutura de usuário, contendo informações que não são necessárias quando o processo não estiver fisicamente na memória principal.
2. Pid: do Inglês, process identification ou identificador de processo.