Pesquisar no blog

quarta-feira, 16 de setembro de 2009

XNU - Kernel do Iphone

INTRODUÇÃO

Muitas palavras-chaves estão associadas com o Mac OS X: Mach kernel, microkernel, kernel FreeBSD, C++, 64 bits, UNIX... mas tudo isto se aplica ao "XNU". O Mac OS X não é nem kernel Mach, nem baseado em FreeBSD, não é um microkernel, não é escrito em C++ e não é de 64 bits.

Diferentemente de muitos SO’s o MAC OS X não foi planejado e implementado a partir do zero, ele foi desenvolvido a partir da combinação de vários outros SO’s. Ele é um Kernel híbrido com características de microkernel e monolítica, buscando tirar proveito das vantagens de cada tecnologia.

O coração do Mac OS X é o kernel XNU. XNU é composto basicamente de um Núcleo Mach, com características complementares previstos do Berkeley Software Distribution (BSD). Além disso, o XNU é responsável por proporcionar um ambiente de drivers do kernel chamado de I / O Kit. XNU tem todo o código fonte disponível livremente.

Arquitetura Mac OS X:

HISTÓRICO DO MAC OS X

O MAC OS iniciou em 1984 em um Macintosh 128KB, porém devido às limitações da memória, não suportava multitarefa. Como a Apple estava com a necessidade de conseguir um sucessor para o MAC OS, eles decidiram comprar outro SO e construir um MAC OS compatível com as máquinas multitarefa da época. A Apple resolveu então comprar a NEXT, convertendo o NEXTSTEP/OpenStep no: MAC OS X.

O NEXTSTEP era fortemente baseado no Mach. O Mach foi desenvolvido em resposta ao aumento da complexidade dos kernels do UNIX e do BSD. Com um dos primeiros microkernels, ele apenas incluía gerenciamento de memória, scheduling e IPC (Comunicação entre Processos) e todas as outras funcionalidades encontradas nos outros SO’s. Uma das vantagens do Mach era que ele poderia rodar aplicações de SO’s diferentes ao mesmo tempo. Ele utilizava algo parecido com virtualização.

O problema do kernel do Mach era que ele era muito mais lento do que um kernel monolítico tradicional por causa da lentidão na troca de contexto entre usuário e o kernel, quando um servidor comunicava-se com o próprio kernel. O código de gerenciamento de memória do Mach, que era muito eficiente, foi posteriormente integrado no BSD.

O NEXTSTEP era uma combinação de BSD com o Mach. Dessa forma, o NEXT ficou muitos anos à frente da concorrência com o NEXTSTEP sendo o primeiro SO com suporte a multitarefa preemptiva, proteção de memória e compatibilidade com o Unix. Com a aquisição do NEXTSTEP pela Apple, muitas mudanças foram feitas, entre elas a introdução do novo I/O - Kit, a atualização do código-base do Mach para o 3.0, e a atualização de parte do BSD para o 4.4BSD e o FreeBSD, além da inclusão de um suporte pra sistemas de arquivos HFS e protocolos de redes para o kernel.

IPHONE

O sistema operacional Mac OS X é o SO do iPhone, porém as diferenças entre o sistema operacional (OS X) executado nos computadores Macintosh e no iPhone não foram oficialmente explicadas. O iPhone possui uma CPU ARM, sendo a versão do OS X que é executada no iPhone diferente da versão de desktop pelo fato que ela foi escrita para as instruções de arquitetura ARM ao invés de x86 e PowerPC ISA na qual a versão do OS X para Mac foi escrita. O sistema operacional ocupa aproximadamente 300MB do total do dispositivo de 8 ou 16 gigabytes.

A Arquitetura ARM (primeiramente Acorn RISC Machine, atualmente Advanced RISC Machine) é uma arquitetura de processador de 32 bits e é usada principalmente em sistemas embarcados. Seu desenvolvimento se deu visando obter o melhor desempenho possível, com a limitação de ser simples, ocupar pouca área e ter baixo consumo de energia. Os processadores ARM são conhecidos pela sua versatilidade, pois possuem poucas instruções para programação.

Segue abaixo algumas caracteristicas dessa Arquitertura:

· Arquitetura Load-Store: as instruções somente processarão valores que estiverem nos registradores e sempre armazenarão os resultados em algum registrador.

· Instruções fixas de 32 bits de largura (com exceção das instruções Thumb compactas de 16 bits) alinhadas em 4 bytes consecutivos da memória, com capacidade da ULA executar uma única instrução num ciclo de clock.

· Formato de instruções de 3 endereços (isto é, os dois registradores operandos e o registrador de resultado são independentemente especificados)

· 15 registradores de 32 bits para uso geral

· Manipulação de periféricos de I/O como dispositivos mapeados na memória com suporte à interrupções.

· Conjunto de instruções aberto a extensões através de co-processador, incluindo a adição de novos registradores e tipos de dados ao modelo do programador.

· Pipelines de 3 e 5 estágios

ARQUITETURA XNU

O kernel do Mac OS X, chamado "XNU" ("X não é UNIX") é constituído por três componentes principais: Mach, BSD e I / O – Kit.


MACH

Um pouco de historia

O XNU contém o código baseado no Mach, SO que surgiu como um projeto da universidade de Rochester em 1975 e se chamava RIG. Ele tinha como objetivo demonstrar que sistemas operacionais poderiam ser construídos de forma modular, como uma coleção de processos se comunicando com trocas de mensagens. Quando um dos engenheiros do projeto mudou-se para universidade de Carnegie-Mellon continuou com o projeto de desenvolver tais sistemas. O projeto do Mach foi impulsionado pela agencia de defesa americana, DARPA. A primeira versão do sistema ficou pronta em 1986 e rodava em uma maquina com quatro CPU’s. Como o sistema UNIX estava ganhando espaço gradativamente foi necessária a criação da nova versão do sistema agora chamado de Mach.

O sistema Mach era compatível com o UNIX e, portanto, a maioria dos softwares poderiam ser aproveitados. Alem disso o Mach possuía alguns recursos a mais que o UNIX, tais como threads e suporte a multiprocessadores.

Sistemas operacionais baseados no MACH

· Mac OS X

· GNU Hurd/GNU Mach

· Lites

· MkLinux

· mtXinu

· MachTen

· MacMach

· NEXTSTEP

· OSF/1 (Tru64)

· Workplace OS

· xMach

· UNICOS MAX

Funcionalidade MACH no XNU

O componente Mach do XNU é baseado na versão 3.0 do Mach, mas não é usado como um microkernel. O Mach é um subsistema de parte do kernel como também são vários outros subsistemas que são tipicamente implementados nos sistemas microkernel. O Mach do XNU é responsável por vários aspectos de baixo nível do sistema, tais como:

· Proteção de memória;

· Gerenciamento de memória virtual;

· Comunicação inter-processos;

· Gerenciamento de interrupção;

· Suporte real-time;

· Console I/O

· Multitarefa preemptiva, incluindo threads de kernel;

· Suporte a depuração do kernel.

BSD

Histórico do BSD

O BSD é um SO Unix desenvolvido pela Computer Systems Research Group da Universidade da Califórnia, em Berkeley, em 1977. A sigla BSD significa Berkeley Software Distribution.

O BSD tem sido considerado um marco do UNIX porque ele compartilhava o código base inicial com o design original do Sistema Operacional AT&T UNIX.

O BSD foi pioneiro em muitos dos avanços da computação moderna. Foi o primeiro a incluir bibliotecas de apoio ao Protocolo de Internet: os soquetes Berkeley.

Hoje o BSD continua a ser usado para testes de dispositivos tecnológicos de organizações acadêmicas. A qualidade geral do seu código fonte, bem como a sua documentação, torná-lo adequado para vários propósitos.

O BSD contém uma camada de compatibilidade binária que pode executar softwares nativos de vários outros sistemas operacionais na mesma arquitetura. Muito mais simples e mais rápido que a emulação, o que permite, por exemplo, aplicações previstas para o Linux ser executado em altíssima velocidade.

Isso também permite que aos administradores a migrarem aplicações legadas comercialmente, que pode ter suporte apenas às variantes comerciais do Unix, para um sistema operacional mais moderno, mantendo a funcionalidade de tais aplicações, até poder ser substituído por uma alternativa melhor.

BSD no XNU

O componente do BSD que está no XNU usa boa parte do código-base do FREEBSD como referencia principal (embora alguns códigos possam ser atribuídos a outros BSD’s). Esse código é executado como parte do kernel juntamente com Mach e usando o mesmo espaço de endereço. O código do FreeBSD no XNU pode diferir significantemente a partir do código original do FreeBSD, já que mudanças tiveram que ser feita para ele coexistir com Mach. Abaixo segue a lista de componentes com o qual o BSD é responsável:

· Processos;

· Signals;

· Permissões e políticas de segurança;

· Pilhas TCP/IP, sockets BSD, firewall;

· VFS e Sistemas de Arquivos;

· Estrutura para Chamadas do Sistema;

· Diferentes Mecanismos de Sincronização.

O XNU tem um buffer de cache unificado. Ele utiliza uma abstração sincronizada chamada funnels para serializar o acesso à parte do kernel do BSD. As variáveis do kernel que apontam para esses funnels têm o sufixo _flock, como kernel_flock e network_flock. Quando Mach inicializa o subsistema BSD através de uma chamada para bsd_init (), a primeira operação executada é a atribuição de funnels. Posteriormente:

· O locador de memória do kernel é inicializado;

· A "Plataforma Expert" é chamada para ver se há quaisquer argumentos de boot para BSD;

· Os Buffers do VFS/Tabelas Hash são alocados e inicializados;

· Os processos relacionados às estruturas são inicializados. Isso inclui a lista de todos os processos, a lista de processos zumbis, as tabelas hash para IDs de processo e os grupos de processo;

· O processo 0 é criado e inicializado e a variável kernproc aponta para processo 0;

· O buffer da cache Unificado é inicializada;

· Várias estruturas do VFS são inicializadas. Cada sistema de arquivos presente também é inicializado;

· Subsistemas, tais como syslog e audit são inicializadas;

· A MIB do Kernel é inicialziada;

· A camada de interface de ligação de dados é inicializada;

· Sockets e protocolos são inicializados;

· O perfil do Kernel é inicializado, e o BSD é "publicado" como um recurso no I/O Kit;

· Dispositivos Ethernet são inicializados;

· BSD tenta montar o sistema de arquivos raiz;

· Um novo processo é criado do kernproc (processo 0). Este processo recém-criado tem PID 1, e está prestes a ser inicializado.

Existem basicamente dois kernels na XNU: Mach e BSD com dois tipos de sistemas de chamadas do sistema distintos. Embora ambos utilizassem um único ponto de entrada inteiro 0x80/sysenter/sc, sistemas de chamadas com números negativos são encaminhados para o Mach e os positivos para o BSD.

Para se ter uma idéia da complexidade da interação entre esses dois conjuntos de código pode-se considerar a idéia da unidade fundamental de execução. No BSD a unidade fundamental é o processo, já no MACH é a thread. A disparidade é resolvida associando cada processo BSD com uma Tarefa MACH consistindo exatamente de uma única thread. Quando a chamada do sistema BSD fork() é feita, o codigo BSD no kernel usa a chamada MACH para criar uma tarefa e uma thread. Além disso, é importante notar que tanto as camadas do MACH e do BSD têm modelos de segurança distintos. O modelo de segurança do BSD é baseado nas portas, enquanto do MACH é baseado nos processos.

I/O Kit

O I/O Kit é um framework (estrutura) de código aberto dentro kernel XNU que auxilia no gerenciamento dos dispositivos de drivers. O framework do I/O Kit foi originalmente introduzido como parte do sistema operacional Rhapsody da Apple que depois se tornou Mac OS X, e não compartilhava semelhanças nem com o framework de dispositivo de drivers do Mac OS 9 nem com o do BSD.

O framework do I/O Kit é implementado em um subconjunto de C++ que omite características que a Apple sente como sendo inseguras para usar no kernel com suporte a multithreads.

A integração de C++ foi escolhida em parte porque os desenvolvedores da Apple acreditavam que seria mais confortável ter drivers escritos em uma linguagem mais comumente usada do que o Objective-C, enquanto continua ainda a fornecer uma estrutura orientada a objetos permitindo que o desenvolvedor de drivers de dispositivo focasse na codificação de recursos específicos para o hardware em vez de re-implementar características comuns a qualquer dispositivo dado.

Quando o NEXTSTEP foi portado para arquiteturas diferentes e foi renomeado para OpenStep ele adquiriu um novo modelo de drivers chamado DriverKit, que foi baseado na linguagem de programação Objective C e, portanto foi orientado a objetos.

Como foi dito anteriormente, "I/O Kit" é a mais alta re-implementação de desempenho do DriverKit em um subconjunto de C++. I/O Kit suporta algumas classes de drivers no modo usuário. Esse framework orientado a objetos do kernel XNU é radicalmente diferente da dos tradicionais sistemas.

Como dito, o I/O Kit usa um subconjunto restrito de C++ (baseado em C++ embarcado) como sua linguagem de programação. Tal sistema é implementado pela biblioteca LIBKERN. Algumas características do C++ que não são permitidas neste subconjunto incluem:

· exceções

· herança múltiplas

· templates

· RTTI (informações sobre tipos de dados em tempo de execução) apesar do I/O Kit ter seu próprio sistema de tipagem em tempo de execução

Além de fornecer o código comum para os drivers de dispositivo, este framework fornece configuração automática. O modelo do dispositivo de drivers fornecido pelo I/O Kit tem muitas características úteis:

· numerosas famílias de dispositivos (ATA/ATAPI, FireWire, Graphics, HID, Network, PCI, USB, HID,…)

· abstrações de orientação a objetos de dispositivos que podem ser compartilhados

· plug-and-play("ligar e usar") and hot-plugging("ligamento a quente")

· gerenciamento de energia

· multitarefa preemptiva, uso de thread, multiprocessamento simétrico, proteção de memória e gerenciamento de dados

· carregamento e combinação dinâmica de drivers (múltiplos tipos de barramento)

· um banco de dados para monitoramento e manutenção de informações detalhadas sobre objetos instanciados (o registro de I/O)

· um banco de dados de todas as classes do I/O Kit avaliadas num sistema (o catálogo de I/O)

· uma API extensa

· interfaces para aplicações e drivers de espaço de usuário para comunicação com o I/O Kit

· drivers de empilhamento

Além da biblioteca libkern, a implementação do I/O Kit consiste de mais duas bibliotecas de C++ que estão presentes no kernel e disponíveis para drivers carregáveis: IOKit.framework e Kernel/IOKit.

CONCLUSÃO

O XNU é um Kernel composto de algumas componentes essências, como: Mach, BSD e I/O Kit, por isso o XNU não pode ser considerado um Mach nem um BSD.

O Kernel do OS X não possui microkernel, apesar de o Mach ser utilizado em outros projetos com esta finalidade. XNU é um kernel monolítico muito tradicional com BSD e drivers em modo kernel.

Parte do I/O Kit foi escrito em um subconjunto em C++ e o BSD e Mach foi escrito em C. Apesar de suportar aplicações de 64 bits em modo usuário o kernel roda em seu próprio modo em 32 bits.

Autores

  1. Leandro Luiz
  2. Victor Guedes
  3. Júlio Holanda