2 pontos por GN⁺ 2025-04-06 | Ainda não há comentários. | Compartilhar no WhatsApp
  • O sistema operacional Darwin da Apple é a base central, da família Unix, por trás dos sistemas modernos da Apple, como macOS e iOS
  • O núcleo é o kernel XNU, um kernel híbrido cujo nome significa "X is Not Unix"
  • Ele combina a estrutura do microkernel Mach com elementos do BSD Unix para equilibrar desempenho e modularização
  • Este artigo explica o processo de evolução estrutural do Darwin e do XNU, desde as raízes do Mach e do BSD até a evolução mais recente no Apple Silicon
  • Analisa os componentes centrais do kernel (IPC, escalonamento, gerenciamento de memória, virtualização etc.) e sua adaptação ao hardware moderno

A origem do microkernel Mach (1985–1996)

  • O Mach começou em 1985 na Carnegie Mellon University por Richard Rashid e Avie Tevanian
  • Foi projetado como um microkernel que fornecia apenas as funções essenciais para reduzir a complexidade do kernel UNIX
  • Oferecia apenas funções de baixo nível, como gerenciamento de memória, escalonamento baseado em threads e IPC baseado em mensagens; já sistema de arquivos, rede etc. eram separados em servidores em espaço de usuário
  • O Mach 2.5 executava parte do código do kernel BSD junto no espaço de kernel para compensar desempenho
  • O Mach 3.0 fez a transição para um microkernel de fato e também influenciou o gerenciamento de memória do BSD
  • O Mach introduziu os conceitos de Task e Thread e implementou um modelo eficiente de memória virtual
  • A NeXT (fundada por Steve Jobs em 1985) desenvolveu o sistema operacional NeXTSTEP com base em Mach 2.5 + 4.3BSD
  • O kernel do NeXTSTEP combinava Mach e BSD no espaço de kernel, formando uma estrutura híbrida
  • Os drivers eram desenvolvidos com o DriverKit baseado em Objective-C, adotando uma abordagem orientada a objetos
  • A Apple adquiriu a NeXT em 1996 e trouxe o NeXTSTEP e o kernel XNU baseado em Mach/BSD
  • As primeiras versões do Mac OS X (Rhapsody) foram desenvolvidas com base na estrutura de kernel da NeXT

A evolução inicial do Mac OS X (1997–2005)

  • A Apple integrou ao XNU o código Mach 3.0 baseado no OSFMK 7.3 e atualizou a camada BSD com código do FreeBSD e do 4.4BSD
  • Manteve uma estrutura híbrida com funções de BSD e Mach embutidas para melhorar o desempenho e ampliar o suporte a hardware
  • Introdução do novo framework de drivers I/O Kit: base em C++ em vez de Objective-C para otimização de desempenho e suporte a hot-plug
  • Resumo das principais características por versão:
    • 10.1 Puma (2001): suporte a threads em tempo real, melhorias de desempenho
    • 10.2 Jaguar (2002): introdução de IPv6, IPSec, Bonjour e journaling no HFS+
    • 10.3 Panther (2003): melhorias no kernel com base no FreeBSD 5, introdução de fine-grained locking para suporte a multicore
  • O XNU tinha suporte principal a PowerPC, mas também mantinha código de suporte a x86 para preparar a transição futura
  • 10.4 Tiger (2005): certificação UNIX 03, base para a transição para Intel, introdução do sistema de eventos kqueue/kevent

Era de 64 bits, multicore e iPhone OS (2005–2010)

  • 10.5 Leopard (2007):
    • suporte a x86_64 e possibilidade de drivers em 64 bits
    • reforço em segurança e depuração com ASLR, sandbox e DTrace
    • último suporte oficial ao PowerPC
  • iPhone OS 1 (2007):
    • baseado no Darwin 9, com port do XNU para ARM
    • introdução do mecanismo Jetsam para lidar com falta de memória
    • sandbox obrigatório para todos os apps e exigência de code signing
  • 10.6 Snow Leopard (2009):
    • exclusivo para Intel, com suporte completo a kernel em 64 bits
    • introdução do Grand Central Dispatch: framework de paralelização de tarefas em espaço de usuário em cooperação com o kernel
    • integração do OpenCL e suporte a computação em GPU
  • iOS 4 (2010):
    • introdução de multitarefa e escalonamento baseado em prioridade (distinção entre foreground/background)

Modernização do macOS e do iOS (2011–2020)

  • 10.8~10.9 (2012–2013):
    • introdução de Compressed Memory para otimizar o uso de RAM
    • Timer Coalescing para reforçar economia de energia da CPU
    • evolução do escalonamento com foco em eficiência energética, como App Nap e QoS
  • 10.10~10.11 (2014–2015):
    • introdução do SIP (System Integrity Protection): nem mesmo privilégios de root podem alterar arquivos do sistema
    • garantia de escalabilidade do XNU para vários dispositivos, como watchOS e tvOS
    • suporte a ARM64 e início da preparação para abandonar ARM de 32 bits
  • 10.12~10.14 (2016–2018):
    • transição do sistema de arquivos para APFS (Apple File System)
    • suporte a snapshots, clonagem e criptografia
    • reforço da segurança de kext: aprovação do usuário obrigatória e verificação de code signing mais rígida
  • 10.15 Catalina (2019):
    • introdução do DriverKit: execução de drivers em espaço de usuário (retorno à filosofia de microkernel)
    • reforço de segurança ao separar o volume do sistema como somente leitura

Era Apple Silicon (2020–presente)

  • macOS 11 Big Sur (2020):

    • suporte ao Apple Silicon (M1) baseado em ARM64
    • suporte a escalonamento de CPU big.LITTLE: distribuição de núcleos de eficiência/desempenho com base em QoS
    • a estrutura Mach VM se adapta bem à arquitetura de memória unificada
  • Reforço em segurança e virtualização:

    • suporte a recursos de segurança em hardware ARM, como PAC (autenticação de ponteiros) e MTE (memory tagging)
    • introdução de um novo framework de virtualização com base nas capacidades de hypervisor do Apple Silicon
    • possibilidade de executar VMs leves para desenvolvedores no macOS (controle em espaço de usuário)
  • Estrutura de plataforma unificada:

    • o XNU é usado como kernel de todas as plataformas da Apple, incluindo macOS, iOS, watchOS, tvOS, bridgeOS e visionOS
    • graças à abstração de plataforma do Mach, ele consegue se adaptar com facilidade a diferentes arquiteturas de CPU

Resumo da principal linha do tempo do XNU

  • 1989 - NeXTSTEP 1.0 - introdução do híbrido XNU de Mach 2.5 + BSD
  • 1996 - Apple adquire a NeXT - início do desenvolvimento do Rhapsody com base em Mach 3.0 + FreeBSD
  • 2001 - Mac OS X 10.0 - consolidação da estrutura do kernel XNU e melhorias iniciais de desempenho
  • 2005 - 10.4 Tiger - certificação UNIX e preparação para a transição para Intel
  • 2007 - 10.5 Leopard - suporte a 64 bits, reforço de segurança e surgimento do iPhone OS
  • 2009 - 10.6 Snow Leopard - transição completa para Intel e introdução do GCD
  • 2011 - 10.7 Lion - kernel de 64 bits obrigatório e ampliação do sandboxing
  • 2013 - 10.9 Mavericks - introdução de compressão de memória e escalonamento com QoS
  • 2015 - 10.11 El Capitan - introdução do SIP e expansão para dispositivos como watchOS
  • 2017 - 10.13 High Sierra - APFS como padrão e reforço da segurança de Kext
  • 2019 - 10.15 Catalina - execução de drivers em espaço de usuário com DriverKit
  • 2020 - 11 Big Sur - suporte ao Apple Silicon e introdução de uma nova estrutura de virtualização
  • 2022 - 13 Ventura - melhorias no escalonamento para núcleos de alto desempenho como os do M1 Max
  • 2024 - 14 Sonoma - otimizações para M2/M3 e suporte a Memory Tagging

Estrutura e design do kernel XNU

Design de kernel híbrido: integração entre Mach + BSD

  • O XNU tem uma estrutura de kernel híbrido que reúne características de microkernel (Mach) e kernel monolítico (BSD)
  • O Mach abstrai e modulariza funções de baixo nível (threads, memória, IPC etc.), enquanto o BSD executa diretamente no espaço de kernel todo o conjunto de system calls e APIs UNIX
  • BSD e Mach são vinculados como um único binário de kernel e executam no mesmo espaço de endereçamento
  • Dentro do kernel, funções Mach e funções BSD são chamadas diretamente, sem mensagens, e system calls UNIX são tratadas com desempenho equivalente ao de outros kernels Unix
  • Exemplo: ao chamar a system call read(), o código do sistema de arquivos BSD é executado diretamente no kernel

Papel do Mach

  • Fornece a infraestrutura central do kernel, como threads, gerenciamento de tasks, troca de contexto, filas de escalonamento e timers
  • Fornece IPC baseado em mensagens por meio de portas Mach (com suporte a compartilhamento de memória entre processos e envio de buffers grandes)
  • Implementa recursos avançados de gerenciamento de memória virtual, como memory objects, otimização copy-on-write e abstração do espaço de endereçamento

Papel do BSD

  • Fornece funções UNIX como processos e PID, sinais, IDs de usuário, API POSIX, sistema de arquivos, pilha de rede e IPC UNIX
  • Deriva de código BSD baseado no FreeBSD, com inclusão também de recursos do OpenBSD/NetBSD
  • Implementa políticas de segurança como frameworks de segurança (KAuth, MAC), sandbox, SIP e verificação de code signing
  • Implementação de system calls: fork() faz, por exemplo, a duplicação de VM no Mach e a duplicação de descritores de arquivo no BSD
  • É responsável pela maior parte das funções UNIX, como VFS, rede, tratamento de signal e threads POSIX

I/O Kit

  • Framework de drivers orientado a objetos que executa no espaço de kernel (usa o Embedded Subset de C++)
  • Define a hierarquia de dispositivos, que cada driver implementa por herança
  • Fornece uma interface user client acessível a partir do espaço de usuário
  • Usa recursos do Mach para sincronização de kernel e controle de threads, enquanto drivers de sistema de arquivos e rede se conectam ao BSD
  • Os drivers podem ser carregados dinamicamente como Kext e são carregados na memória do kernel em formato Mach-O

IPC do Mach e passagem de mensagens

  • As portas Mach são o principal mecanismo de IPC entre kernel e espaço de usuário, ou entre processos de usuário
  • Cada processo pode ser controlado por meio de portas Mach, e daemons do sistema como o launchd controlam processos por meio dessas portas
  • Recursos avançados do macOS, como Grand Central Dispatch e XPC, são implementados com base em mensagens Mach
  • As mensagens Mach têm um sistema de permissões por portas, oferecendo alta segurança, além de permitir transferência de portas e de memória compartilhada
  • O MIG (Mach Interface Generator) é usado para gerar automaticamente código de RPC baseado em mensagens entre kernel e usuário
  • O DriverKit implementa a comunicação entre kernel e drivers em espaço de usuário com base em Mach IPC

Escalonador e gerenciamento de threads

  • Evoluiu a partir de um escalonador round-robin baseado em prioridade sobre o Mach
  • Cada CPU tem sua própria Run Queue, e as threads são escalonadas com base em prioridade
  • Após a introdução do iOS, foram adotadas políticas de escalonamento conforme o papel do app (foreground/background)
  • Escalonamento baseado em classes de QoS (Quality of Service): ajuste de prioridade conforme o tipo de trabalho, como interação com o usuário ou tarefas em background
  • No Apple Silicon, as threads são atribuídas a núcleos de eficiência ou de alto desempenho conforme o QoS
  • Threads em tempo real (como áudio) têm prioridade por meio de filas de tempo real, e há suporte a escalonamento por deadline desde o macOS 10.4
  • Cooperação com gerenciamento de energia: otimização de desempenho móvel por meio de thread idle, agrupamento de timers e entrada em estados de economia de energia

Gerenciamento de memória e memória virtual

  • O Mach VM é o componente central do sistema de memória do XNU, com um design robusto e flexível
  • O espaço de endereçamento virtual é baseado em copy-on-write, permitindo cópia eficiente de memória em fork()
  • Estrutura de Memory Object e Pager:
    • o daemon em espaço de usuário dynamic_pager gerencia a área de swap
    • o mapeamento de arquivos é tratado dentro do kernel por meio do vnode pager
  • Desde o Mavericks, há memória comprimida: em situações de pouca memória, páginas são comprimidas e preservadas em vez de ir diretamente para swap em disco
  • pmap: camada dependente de máquina que gerencia a memória física e as tabelas de páginas de cada arquitetura
  • O kernel tem um espaço de endereçamento separado, e algumas áreas são definidas como memória fixa (wired)
  • O macOS reforça a segurança de memória com guard pages para depuração, alocação zero-fill e proteção por segmentação
  • O Mach VM lida de forma eficiente com compartilhamento de frameworks por meio de memória compartilhada e configurações de Inheritance
  • No Apple Silicon, como GPU e memória compartilham o mesmo espaço, o Mach VM otimiza alocação com base nessas características

Suporte a virtualização

  • O XNU inicialmente não tinha função de hypervisor, mas passou a oferecer suporte à virtualização a partir do OS X 10.10 com o Hypervisor.framework
  • Em sistemas baseados em Intel, passou a ser possível executar VMs em espaço de usuário com VT-x
  • No Apple Silicon baseado em ARM, o Virtualization.framework usa os recursos de virtualização EL2
  • O hypervisor interno do kernel cuida de memória virtual, tratamento de traps de vCPU, escalonamento etc.
  • Aproveita a estrutura de threads do XNU e de tasks do Mach para tratar vCPUs como threads do host
  • O macOS também oferece recursos de emulação x86 como o Rosetta 2, com tradução de syscall e compatibilidade de ABI
  • Desde o iOS 15, a virtualização também é permitida de forma limitada no iOS (requer modo de desenvolvedor)

Estrutura de computação segura

  • Secure Enclave:
    • subsistema de segurança independente integrado ao SoC da Apple
    • executa um microkernel separado chamado sepOS e protege dados biométricos, chaves criptográficas etc.
    • mantém o processamento de segurança isolado mesmo que o kernel principal seja comprometido
  • Exclaves:
    • nova área de isolamento introduzida no macOS 14.4 e no iOS 17
    • separa recursos sensíveis, como autenticação do Apple ID, buffers de áudio e dados de sensores, para uma área fora do kernel principal
    • controlada por Kexts e frameworks dedicados, como ExclaveKextClient.kext
    • mesmo que o kernel seja comprometido, a área de exclave continua protegida de forma independente
  • o conceito reflete que enclave é uma área incluída dentro do sistema, enquanto exclave é uma área separada conectada externamente ao sistema

Conclusão

  • O XNU é um kernel com estrutura híbrida prática que concilia as vantagens do microkernel com as do kernel monolítico
  • A camada de abstração do Mach permite transições entre diferentes arquiteturas de CPU e expansão do sistema, enquanto o BSD oferece compatibilidade POSIX e um ambiente Unix estável
  • A Apple separa funcionalidades para o espaço de usuário quando necessário por meio do Mach IPC, mas mantém ligação direta dentro do kernel para eficiência
  • Com base em uma arquitetura multicamadas — drivers (User-space DriverKit), virtualização (Hypervisor.framework), escalonador (QoS) e gerenciamento de memória (Compressed Memory) — o sistema responde com flexibilidade às exigências modernas
  • Darwin e XNU partiram do NeXTSTEP e evoluíram até se tornar o núcleo de centenas de milhões de dispositivos Apple, e continuam em evolução

Ainda não há comentários.

Ainda não há comentários.