guicybercode
Todos os textos

Guilherme Monteiro · São Paulo, SP

O Linux não é sagrado: MINIX, Tanenbaum e os mitos que sobreviveram a 1992

O debate de 1992 entre Tanenbaum e Torvalds, o código do Linux 0.01 e do MINIX e trinta anos de pesquisa sobre microkernels, para separar o documentado do folclore.

Resumo

Em 29 de janeiro de 1992, Andrew S. Tanenbaum, professor da Vrije Universiteit de Amsterdã e autor do MINIX, abriu no grupo comp.os.minix um tópico chamado "LINUX is obsolete". Escreveu que o Linux era "a giant step back into the 1970s" [1]. Trinta e quatro anos depois, o Linux roda em todos os 500 supercomputadores mais rápidos do mundo [2] e é a base do kernel do Android [3]. Seria fácil declarar o professor derrotado e encerrar o assunto. Este artigo volta aos posts originais, ao código do Linux 0.01 e do MINIX 2 e aos papers que mediram bugs, IPC e recuperação de drivers, para separar o documentado do folclore. Quem diz que o Linux é cópia do MINIX erra. Quem trata o Linux como inventor de tudo e olha para o macOS, os BSDs e o Windows com desdém também erra. O Linux venceu pela licença e por chegar na hora certa. Na confiabilidade, o argumento técnico do Tanenbaum continua de pé, o próprio Linux foi absorvendo pedaços dele, e boa parte do que se atribui ao Linux apareceu antes em outros sistemas.

Os mitos que circulam por aí

Uso Linux todo dia, em casa e no trabalho, e trabalho com FreeBSD também. Gosto dos dois. É justamente por isso que me incomoda o tom de seita que a conversa sobre sistemas operacionais costuma tomar. De um lado, aparece o crítico que trata o Linux como uma cópia malfeita do MINIX e jura que o Tanenbaum, que teria sido professor do Linus, o renegou desde o primeiro dia. Do outro, aparece o devoto que acha que o Linux inventou os contêineres, que o macOS é brinquedo de quem não sabe usar terminal, que BSD é coisa de museu e que todo driver do Windows é uma bomba-relógio.

As duas visões têm em comum o desinteresse pelos documentos. E os documentos existem. O debate de 1992 está arquivado palavra por palavra [1], [4]. O código da primeira versão do Linux continua no kernel.org [5]. Tanenbaum escreveu longamente sobre a origem do Linux quando um instituto de Washington acusou Torvalds de plágio em 2004 [6]. As certificações UNIX ficam num registro público da Open Group [7]. A Microsoft documenta como os drivers do Windows rodam [8], e a FreeBSD documenta desde quando existem os jails [9].

Os mitos que este texto checa são estes, cada um com a resposta curta que os fatos dão:

MitoO que os documentos mostram
"O Linux é cópia do MINIX"Falso quanto ao código. Torvalds desenvolveu em cima do MINIX, copiou o layout do sistema de arquivos e se inspirou no livro, mas o código é dele, e quem diz isso é o próprio Tanenbaum [6].
"Tanenbaum era professor do Linus"Falso. Torvalds estudava em Helsinque; Tanenbaum, em Amsterdã, diz que o encontrou uma vez [10], [6].
"Tanenbaum chamou o Linux de retrocesso"Verdadeiro, em 1992. Na mesma mensagem ele disse que não estava infeliz com o Linux, e em 2004 o defendeu [1], [6].
"Torvalds nunca admitiu nada"Falso. Ele concordou que microkernels "are nicer" e pediu desculpas em público no dia seguinte [1], [4].
"O Linux venceu por ser tecnicamente superior"Em boa parte, falso. Os próprios protagonistas atribuem a vitória ao atraso do GNU e ao processo contra o BSD [1], [11], [6].
"O Linux nem é UNIX"Verdadeiro sobre a marca. Falso se a ideia for que um sistema Linux não consegue passar na certificação: um já passou [12].
"O ABI do Linux vive quebrando"Falso para programas. Verdadeiro, e de propósito, para drivers dentro do kernel [13].
"Microkernel é lento por natureza"Exagero. O Mach era lento; em 1993 o L3 já entregava mensagens vinte vezes mais rápido, e o Linux sobre L4 perdia 5% [14], [15].
"O macOS é microkernel porque usa Mach"Falso. No XNU, Mach e BSD rodam juntos em modo kernel [16], [17].
"O Linux inventou os contêineres"Falso. O jail do FreeBSD saiu em 2000; a primeira versão dos cgroups entrou no Linux em 2008 [9], [18].
"O Linux não tem nada de microkernel"Falso. FUSE, UIO, VFIO e os escalonadores em eBPF tiram pedaços do kernel ou os isolam, sem mudar a arquitetura [19], [20], [21].
"Microkernel é sinônimo de seguro"Exagero. O próprio Tanenbaum escreveu que segurança de nível militar nunca foi objetivo do MINIX [22].

O resto do artigo mostra de onde sai cada linha dessa tabela.

O que era o MINIX

O MINIX nasceu para caber numa sala de aula. Tanenbaum o escreveu para acompanhar o livro Operating Systems: Design and Implementation, de 1987, e o código-fonte era vendido separadamente pela Prentice Hall por US$ 69 [6]. Na discussão de 1992, ele explicou que a limitação era deliberada: "An explicit design goal was to make it run on cheap hardware so students could afford it. In particular, for years it ran on a regular 4.77 MHZ PC with no hard disk" [4]. Na mesma mensagem, disse que a versão para o PC original vendia o dobro da versão para 286/386.

Chamar o MINIX de brinquedo malfeito erra a intenção. O MINIX era pequeno porque o objetivo era ensinar. Mas é verdade que ele não servia como sistema de produção, e Tanenbaum não queria que servisse. Em 2004, ele contou que o comp.os.minix chegou a 40.000 assinantes e que recebia 200 e-mails por dia pedindo recursos, como "I need pseudoterminals and I need them by Friday". A resposta costumava ser "No." O motivo: "everyone was trying to turn MINIX into a production-quality UNIX system and I didn't want it to get so complicated that it would become useless for my purpose, namely, teaching it to students" [6]. Em fevereiro de 1992 ele já dizia a mesma coisa no grupo: tinha recusado memória virtual, paginação, links simbólicos e sistemas de janelas porque queria "keep the system simple enough for students to understand" [4]. Ele achava que esse espaço seria ocupado logo pelo GNU ou pelo BSD de Berkeley.

A licença também pesava. A Prentice Hall queria royalties de quem vendesse o sistema comercialmente, e os advogados encheram o MINIX de "boilerplate", ainda que, segundo Tanenbaum, "there was never any intention of really enforcing this against universities or students" [6]. Em 1992, a cópia custava US$ 169, a licença permitia duas cópias de segurança, e professores podiam fazer cópias ilimitadas para os alunos [4]. Quem melhorava o sistema, porém, só podia distribuir diferenças em relação à versão oficial. Charles Hedrick, da Rutgers, escreveu no mesmo debate que tinha largado a comunidade MINIX porque a licença, "while amazingly friendly", dificultava a vida de quem queria uma versão para 386: "all they could distribute were diffs", o que tornava a instalação inviável para um usuário novo [4]. A liberação completa demorou. Em 7 de abril de 2000, Tanenbaum anunciou no comp.os.minix: "Better late than never. I finally got permission from Prentice Hall to change the MINIX license to the BSD license. The lawyers sort of sat on this for two years" [23]. Nessa altura, o Linux já tinha seis anos de versão 1.0 [24].

Por dentro do MINIX: tudo é mensagem

O código do MINIX 2.0.4, a última versão da série 2, mostra o que Tanenbaum chamava de microkernel. Ele continua disponível em redistribuições não oficiais, como a de David Given [25]. O comentário no topo de kernel/proc.c resume a arquitetura: "The only system calls that exist in MINIX are sending and receiving messages. These are done by trapping to the kernel with an INT instruction" [25]. Na biblioteca para 386, as funções _send, _receive e _sendrec põem o destino e o endereço da mensagem em registradores, indicam a operação e executam int 33 [25].

A mensagem tem tamanho fixo. Em include/minix/type.h, o tipo message é uma união de seis formatos, de mess_1 a mess_6, cada um com uma combinação de inteiros, longs e ponteiros, mais os campos de origem e de tipo [25]. O kernel não aloca buffer nem mantém fila de mensagens. A entrega segue o princípio do encontro (rendezvous): mini_send copia a mensagem direto para o destinatário se ele já estiver bloqueado esperando por ela; caso contrário, quem enviou fica bloqueado numa fila presa ao destinatário até que este chame receive [25]. O mesmo código percorre a cadeia de remetentes bloqueados para detectar dois processos tentando enviar um para o outro, e devolve ELOCKED em vez de deixar o sistema travar.

As permissões já eram mínimas. Processos de usuário só podem usar a operação combinada, que envia e espera a resposta, e só podem falar com dois destinos: "User processes are only allowed to send to FS and MM" [25]. Na prática, um read() vira, dentro da biblioteca, uma mensagem para o sistema de arquivos (FS), e o FS conversa com a tarefa do disco também por mensagem. A tabela de tarefas em kernel/table.c mostra a divisão: TTY, placas de rede DP8390 e RTL8139, Sound Blaster, impressora, controladoras de disco, disquete, memória, relógio e a tarefa de sistema eram tarefas compiladas na imagem do kernel, enquanto o gerenciador de memória (MM), o FS e o INIT eram processos separados [25].

Essa é a régua de 1992. Tanenbaum escreveu no post original que o sistema de arquivos e o gerenciador de memória rodavam como processos separados e que os drivers de I/O também eram processos, "in the kernel, but only because the brain-dead nature of the Intel CPUs makes that difficult to do otherwise" [1]. Os drivers do MINIX 1 e 2 rodavam em modo kernel, como os do Linux. A diferença estava na forma: cada driver era uma tarefa com laço de mensagens própria, e não uma função chamada diretamente.

O desenho tinha um preço que apareceu no debate. Com um único processo FS atendendo um pedido de cada vez, quem lia um disquete lento travava quem queria fazer outra coisa. Richard Tobin, da Universidade de Edimburgo, reclamou: "I find the single-threaded file system a serious pain when using Minix" [4]. Tanenbaum respondeu que "A multithreaded file system is only a performance hack. When there is only one job active, the normal case on a small PC, it buys you nothing" [4]. Para quem ensinava, era detalhe. Para quem usava o sistema todo dia, não era.

Agosto de 1991: um hobby que não copiava código

Em 25 de agosto de 1991, Linus Torvalds, estudante da Universidade de Helsinque, postou no comp.os.minix: "I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones". No mesmo post ele perguntou o que as pessoas gostavam ou não no MINIX, "as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things)". O pós-escrito foi direto: "Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc)" [10].

As notas da versão 0.01, de setembro de 1991, repetem a afirmação e explicam a dependência: "Although linux is a complete kernel, and uses no code from minix or other sources, almost none of the support routines have yet been coded. Thus you currently need minix to bootstrap the system" [26]. O Linux nasceu dentro do MINIX, compilado nele e instalado a partir dele. A dependência era de ambiente, não de código.

Jyrki Kuoppala perguntou quanto do sistema era em C e se dava para portá-lo para o Amiga. A resposta de Torvalds, em 26 de agosto, é um retrato honesto do projeto: "Simply, I'd say that porting is impossible. It's mostly in C, but most people wouldn't call what I write C. It uses every conceivable feature of the 386 I could find, as it was also a project to teach me about the 386" [10]. Ele explicou que cada tarefa tinha um segmento de 64 MB, com no máximo 64 tarefas em 4 GB, que alguns arquivos em C eram "almost as much assembler as C" e que o resultado era "a porters nightmare". Kuoppala também pediu sistemas de arquivos em modo usuário. Torvalds achou viável quase toda a lista, "except maybe for the user-mode filesystems" [10]. O pedido seria atendido catorze anos depois, com outro nome.

O que havia dentro do Linux 0.01

O tarball original continua no kernel.org. Os arquivos têm datas entre 15 de junho e 17 de setembro de 1991, a maioria (60) entre 11 e 17 de setembro. Pelas minhas contas, são 88 arquivos, e os fontes em C, os cabeçalhos e o assembly somam 9.877 linhas [5]. A árvore já tem a cara que o kernel manteria por décadas: boot/ com o setor de boot e o código de entrada em modo protegido, kernel/, mm/, fs/, lib/, include/, init/main.c e um utilitário em tools/ que monta a imagem final.

A organização mostra o desenho monolítico desde o primeiro dia. O diretório kernel/ tem 3.511 linhas e guarda o escalonador, o fork, os sinais e também os drivers: hd.c para o disco AT, console.c, serial.c, keyboard.s e tty_io.c [5]. Não há tarefa de driver nem mensagem. O sistema de arquivos chama o driver de disco como quem chama qualquer função. O gerenciamento de memória inteiro cabe em 298 linhas, entre mm/memory.c e mm/page.s, e o sistema de arquivos em 2.771 [5].

A tabela de chamadas de sistema, em include/linux/sys.h, tem 67 entradas, de sys_setup a sys_setsid: a de número 1 é exit, depois vêm fork, read, write, open e close [5]. Nem todas funcionavam. Em kernel/sys.c, 15 delas só devolvem -ENOSYS, entre elas sys_mount, sys_umount, sys_rename, sys_mknod e sys_ptrace [5]. O Linux 0.01 não montava sistemas de arquivos nem renomeava arquivos.

O código também mostra para quem ele foi escrito. O arquivo include/linux/config.h traz duas configurações de disco, LINUS_HD e LASU_HD, com a geometria dos discos de cada máquina e o comentário "Amount of ram memory (in bytes, 640k-1M not discounted). Currently 8Mb" [5]. O dispositivo raiz era fixo no código. A troca de contexto, em include/linux/sched.h, é a macro switch_to, que faz um ljmp para o segmento de estado da tarefa do 386: o "386 task switching" do anúncio, literalmente [5]. O limite de 64 tarefas também está lá (NR_TASKS 64), com o relógio a 100 Hz.

E há as digitais do MINIX, todas de ambiente ou de formato. O Makefile roda chmem +65000 tools/build [5]; chmem é um utilitário do MINIX, escrito por Tanenbaum, que ajusta a memória reservada para um executável [25]. O mesmo Makefile avisa: "If you don't have '-mstring-insns' in your gcc (and nobody but me has :-)" [5]. Em include/linux/fs.h, os números dos dispositivos são "same as minix, so we can use the minix file system", os nomes de arquivo têm no máximo 14 caracteres e o número mágico do superbloco é 0x137F [5], o mesmo SUPER_MAGIC definido no sistema de arquivos do MINIX [25]. Nenhuma dessas marcas é código copiado. Quanto ao estado da versão, o próprio Torvalds, em julho de 1992, escreveu que o código da 0.01 "weren't actually runnable" e que a versão "didn't actually come with any binaries": era um gesto para quem tinha demonstrado interesse [10].

A versão usável foi a 0.02. Em 5 de outubro de 1991, Torvalds anunciou no comp.os.minix, com o assunto "Free minix-like kernel sources for 386-AT": "Do you pine for the nice days of minix-1.1, when men were men and wrote their own device drivers?". O post avisava que "Full kernel source is provided, as no minix code has been used", e também que "These sources still need minix-386 to be compiled" [10]. A frase sobre o Hurd envelheceu como piada: "Hurd will be out in a year (or two, or next month, who knows)".

O sistema de arquivos emprestado

A herança mais concreta é o formato do disco. O artigo de Rémy Card, Theodore Ts'o e Stephen Tweedie sobre o ext2 conta que "In its very early days, Linux was cross-developed under the Minix operating system. It was easier to share disks between the two systems than to design a new filesystem, so Linus Torvalds decided to implement support for the Minix filesystem in Linux" [27]. Os autores elogiam o sistema de arquivos do MINIX como "efficient and relatively bug-free", mas apontam dois limites: endereços de bloco de 16 bits, que restringiam o volume a 64 MB, e nomes de arquivo de no máximo 14 caracteres.

A saída passou por uma camada que o Linux 0.01 não tinha. Para facilitar a entrada de novos sistemas de arquivos, o kernel ganhou um Virtual File System (VFS), "initially written by Chris Provenzano, and later rewritten by Linus Torvalds" [27]. Sobre ele, o Extended File System entrou no Linux 0.96c, em abril de 1992, e subiu os limites para 2 GB e 255 caracteres. Ainda tinha problemas: não separava os três carimbos de tempo e controlava blocos e inodes livres com listas encadeadas que se desordenavam com o uso e fragmentavam o disco. Em janeiro de 1993 saíram, em versão alfa, dois sucessores: o Xia, "heavily based on the Minix filesystem kernel code", e o ext2, derivado do ext e desenhado para crescer [27]. O Xia nasceu mais estável; o ext2 venceu porque foi corrigido e ampliado.

Implementar um formato de disco compatível é diferente de copiar o código que o lê. Isso vale para o MINIX do mesmo jeito que vale para o suporte a NTFS ou a FAT no Linux de hoje.

A licença que mudou duas vezes

A primeira licença do Linux não era a GPL. As notas da 0.01 dizem: "This kernel is (C) 1991 Linus Torvalds, but all or part of it may be redistributed provided you do the following: Full source must be available (and free)" [26]. A versão original também proibia cobrar pela distribuição. Nas notas da 0.12, Torvalds anunciou a troca: "I've had a couple of requests to make it compatible with the GNU copyleft, removing the 'you may not distribute it for money' condition. I agree" [28]. A GPL passou a valer a partir de 1º de fevereiro de 1992.

Janeiro de 1992: "LINUX is obsolete"

O post de Tanenbaum saiu em 29 de janeiro de 1992 [1]. Ele começou se apresentando como alguém que via o MINIX como passatempo ("something that I do in the evening when I get bored writing books") e cujo trabalho de verdade era pesquisar sistemas operacionais. Depois listou dois problemas do Linux.

O que Tanenbaum escreveu

O primeiro era arquitetural. Tanenbaum definiu o sistema monolítico como aquele em que "the whole operating system is a single a.out file that runs in 'kernel mode'" e citou UNIX, MS-DOS, VMS e MULTICS como exemplos. Entre os exemplos de microkernel, citou Amoeba, Chorus, Mach e "the not-yet-released Windows/NT". E decretou: "among the people who actually design operating systems, the debate is essentially over. Microkernels have won." Sobre o Linux: "LINUX is a monolithic style system. This is a giant step back into the 1970s. That is like taking an existing, working C program and rewriting it in BASIC. To me, writing a monolithic system in 1991 is a truly poor idea" [1].

O segundo era portabilidade. Tanenbaum previu que os chips RISC iriam "gradually take over from the 80x86 line" e escreveu: "I think it is a gross error to design an OS for any specific architecture, since that is not going to be around all that long." Concluiu: "LINUX is tied fairly closely to the 80x86. Not the way to go" [1].

Quem diz que Tanenbaum chamou o Linux de retrocesso está certo, porque a frase existe. Só que, na mesma mensagem, ele escreveu "Don't get me wrong, I am not unhappy with LINUX" [1]. A crítica era de arquitetura, num grupo de discussão técnica, e chegou uns cinco meses depois do anúncio de agosto.

O que Torvalds respondeu

Torvalds respondeu no mesmo dia, e sem diplomacia. Chamou de "brain-damages of minix" as limitações que Tanenbaum atribuía ao seu trabalho de professor e escreveu "I can only hope (and assume) that Amoeba doesn't suck like minix does" [1]. No mérito, porém, concedeu o principal: "True, linux is monolithic, and I agree that microkernels are nicer. [...] From a theoretical (and aesthetical) standpoint linux looses."

O argumento dele era outro: "If the GNU kernel had been ready last spring, I'd not have bothered to even start my project: the fact is that it wasn't and still isn't. Linux wins heavily on points of being available now" [1]. Sobre portabilidade, defendeu que o Linux era mais portável que o MINIX no nível que importava para o usuário, o da API: "I made linux as conformant to standards as I knew how (without having any POSIX standard in front of me)". E admitiu o resto: "I also agree that linux takes the non-portability to an extreme" [1].

Tanenbaum voltou no dia 30 com a frase mais citada da discussão: "I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design :-)" [4]. Na mesma mensagem, fez a previsão que envelheceu pior: "5 years from now everyone will be running free GNU on their 200 MIPS, 64M SPARCstation-5".

O pedido de desculpas

Ainda em 30 de janeiro, Torvalds postou uma mensagem com o assunto "Apologies (was Re: LINUX is obsolete)": "And reply I did, with complete abandon, and no thought for good taste and netiquette. Apologies to ast [...] I over-reacted, and am now composing a (much less acerbic) personal letter to ast." Ele manteve a posição técnica ("I still think that's not the case, although some of the criticisms are valid") e assinou como "Linus 'my first, and hopefully last flamefest' Torvalds" [4].

O retrato de um Torvalds arrogante e incapaz de autocrítica não sobrevive à leitura do tópico. Ele foi grosseiro, sim. No mesmo dia, pediu desculpas e reconheceu que parte das críticas procedia.

A réplica técnica de 31 de janeiro

A mensagem seguinte de Torvalds, já sem insultos, é a melhor defesa técnica que ele fez em 1992, e quase ninguém a cita. Sobre o sistema de arquivos multithread, ele respondeu que a coisa só é um truque de desempenho "on a microkernel": "When writing a unix the 'obsolete' way, you automatically get a multithreaded kernel: every process does it's own job, and you don't have to make ugly things like message queues to make it work efficiently" [4]. É o argumento do estado compartilhado, catorze anos antes de ele o escrever por extenso.

Sobre portabilidade, separou a interface da implementação: "Yes, the /implementation/ is hardware-specific, but there's a HUGE difference [...] linux API is portable (not due to my clever design, but due to the fact that I decided to go for a fairly-well-thought-out and tested OS: unix.)" [4]. E fez a conta do tamanho: o código-fonte completo do Linux tinha cerca de 200 kB comprimido, enquanto só a parte dependente de 386 do Mach, i386.tar.Z, passava de 800 kB [4]. Também devolveu a acusação ao MINIX: se o sistema era portável porque rodava em máquinas que não tinham sido feitas para Unix, então "minix is portable, but you can rewrite that as 'doesn't use any features', and still be right" [4].

O resto do tópico

O apêndice da O'Reilly reproduz 36 mensagens, e a maioria não é de nenhum dos dois protagonistas [4]. Elas mostram que a comunidade de 1992 entendeu o debate melhor do que muita gente entende hoje.

Theodore Ts'o, do MIT, que mais tarde seria coautor do ext2, respondeu a Tanenbaum em 31 de janeiro. Disse que a quantidade de código específico de 80386 no Linux "is probably not much more than what is in a Minix implementation", e bem menor que o código específico de VAX no BSD 4.3. E fechou com uma frase que resume a escolha de muita gente: "the fact remains that Linux is here, and GNU isn't [...] Minix doesn't count because it's not free. :-)" [4]. Ele também tinha uma explicação para o consenso acadêmico: "since only researchers write papers about operating systems, ipso facto micro kernels must be the right approach" [4].

Charles Hedrick, da Rutgers, foi mais seco: "The history of software shows that availability wins out over technical quality every time. That's Linux' major advantage" [4]. Douglas Graham, da Bell-Northern Research, perguntou que literatura imparcial sustentava o "Microkernels have won", calculou o Linux em "about 12000 lines of code" e escreveu: "I don't see how splitting that into tasks and blasting messages around would improve it" [4]. Para ele, o problema do MINIX não era desempenho: "adding features is a royal pain".

Houve quem propusesse o meio-termo. Lawrence Foard, do Worcester Polytechnic Institute, contou que estava escrevendo código de IPC para o Linux que permitiria rodar drivers e sistemas de arquivos como processos de usuário, ressalvando que seriam "significantly slower" e que "it would be a mistake to move everything outside the kernel" [4]. Ele também acusou os teóricos de nunca testarem as próprias ideias. Tanenbaum respondeu em caixa alta, "I AM NOT A THEORIST", e listou o que via como prova: a OSF apostava o negócio no Mach 3.0, a USL no Chorus, o Amoeba estava implementado e o QNX tinha, segundo lhe disseram, 200.000 sistemas instalados. "Microkernels are not a pipe dream. They represent proven technology" [4].

O lado de Tanenbaum também teve defensores. David Miller, que se apresentou como observador, aplaudiu os dois autores, mas perguntou: "Why split fundemental os functions, such as memory management, into user processes?" [4]. Michael Haardt intitulou sua mensagem "why I think AST is right". E Randy Burns, da Sun, fez uma aposta que parecia sensata: "It may well be that in 2-3 years when ultra cheap BSD variants and Hurd proliferate, that Linux will be obsolete" [4].

Licença e controle: a parte que ninguém lembra

Em 3 de fevereiro, Tanenbaum abriu outro tópico, "Unhappy campers", porque estava recebendo e-mails irritados ("10 messages from the 43,000 readers"). Defendeu o preço do MINIX, comparou com o Coherent a US$ 99 e o 4.4BSD a US$ 800, e escreveu que a questão do software livre era "100% emotional" [4]. Depois perguntou se Torvalds deixaria o Linux escapar do seu controle, se outras pessoas poderiam modificá-lo e vendê-lo.

A resposta de Torvalds, em 6 de fevereiro, cabe em duas palavras: "I won't." Ele contou que já tinha sondado a criação de uma lista "linux-kernel" que decidiria as versões, porque não teria hardware para suportar tudo, citando SCSI, e que Ts'o já tinha feito "some heavy changes even to 0.10" [4]. Tanenbaum, em 5 de fevereiro, tinha feito a previsão oposta: coordenar mil programadores espalhados pelo mundo seria "as easy as herding cats", e "Anyone who says you can have a lot of widely dispersed people hack away on a complicated piece of code and avoid total anarchy has never managed a software project" [4]. A história do kernel desde então é uma refutação longa dessa frase.

Quem era o "Ken Thompson" do tópico

O apêndice do livro Open Sources, da O'Reilly, que reproduz o debate, diz que nele aparece "user-hacker Ken Thompson (one of the founders of Unix)" [4]. O cabeçalho da mensagem, no próprio apêndice, diz outra coisa: "From: kt4@prism.gatech.EDU (Ken Thompson)", "Organization: Georgia Institute of Technology", 3 de fevereiro de 1992. O texto é curto e sensato: "I would generally agree that microkernels are probably the wave of the future. However, it is in my opinion easier to implement a monolithic kernel. It is also easier for it to turn into a mess in a hurry as it is modified" [4]. Nada no cabeçalho liga o autor ao criador do Unix. Kevin Brown, da Universidade de Houston, respondeu como se falasse com o criador do Unix ("I figure you've got years of experience with monolithic kernels :-)"), o que sugere que a confusão, ou a piada, começou no próprio grupo [4]. Tudo indica um homônimo com conta na Georgia Tech, e a identificação feita pela O'Reilly não se sustenta no documento que ela mesma publica.

Por que o Linux ganhou

A visão mística diz que o Linux venceu porque era melhor. Os protagonistas contam uma história mais prosaica, e contam a mesma.

Torvalds, em janeiro de 1992: se o kernel do GNU estivesse pronto na primavera anterior, ele nem teria começado; "Linux wins heavily on points of being available now" [1]. O GNU tinha escolhido o Hurd, sobre o Mach, como kernel oficial em 1991, mas a primeira versão de teste, o Hurd 0.1, só saiu em 6 de setembro de 1996, e o GNU 0.2 em junho de 1997 [29]. A essa altura o Linux 1.0 já tinha mais de dois anos: saiu em 13 de março de 1994 [24].

O BSD de Berkeley era o candidato natural, e estava pronto tecnicamente. Ficou preso nos tribunais, e os detalhes do processo explicam por que o atraso pesou tanto.

Berkeley, o 386BSD e os seis arquivos

Kirk McKusick, que trabalhou no Computer Systems Research Group (CSRG) de Berkeley, conta a história no mesmo livro da O'Reilly [30]. Em junho de 1989, Berkeley lançou a Networking Release 1, o código de rede e os utilitários que não dependiam de licença da AT&T: "the first freely-redistributable code from Berkeley". Keith Bostic propôs então ir além. Bostic, Mike Karels e McKusick passaram meses revendo a distribuição arquivo por arquivo para remover o que vinha do 32/V da AT&T. Sobraram "only six remaining kernel files that were still contaminated and which could not be trivially rewritten". Berkeley decidiu lançar o resto assim mesmo, com o nome de Networking Release 2, em junho de 1991, por uma taxa de US$ 1.000 [30].

Em menos de seis meses, Bill Jolitz escreveu substitutos para os seis arquivos e publicou um sistema completo e inicializável para PCs 386, o 386/BSD, por FTP anônimo: "Within weeks he had a huge following" [30]. Lynne Jolitz, coautora do trabalho, conta que o 386BSD 0.0 saiu em março de 1992, depois de dois anos de documentação do porte na revista Dr. Dobb's Journal, e que o 386BSD 0.1 saiu em 14 de julho de 1992 [31]. Segundo McKusick, Jolitz não conseguia acompanhar a enxurrada de correções por causa do emprego de tempo integral, e um grupo de usuários formou o NetBSD para manter o sistema [30]. A primeira versão do NetBSD, a 0.8, é de 20 de abril de 1993 [32]. O FreeBSD nasceu no começo de 1993 a partir dos três últimos coordenadores do "Unofficial 386BSD Patchkit", e o FreeBSD 1.0 saiu em dezembro de 1993, ainda baseado na Net/2 [33].

O processo, passo a passo

Enquanto isso, uma empresa, a Berkeley Software Design, Inc. (BSDi), somou os seis arquivos de Jolitz à Net/2 e começou a vender o sistema com fontes e binários em janeiro de 1992, por US$ 995, com anúncios que mandavam ligar para 1-800-ITS-Unix [30]. A Unix System Laboratories (USL), subsidiária majoritária da AT&T, mandou uma carta exigindo que a empresa parasse de chamar o produto de Unix e largasse o telefone. A BSDi trocou o número e os anúncios. A USL processou mesmo assim, alegando código proprietário e segredos industriais, e pediu uma liminar para suspender as vendas [30].

Na audiência preliminar, o juiz aceitou o argumento da BSDi de que ela só distribuía o que a Universidade da Califórnia distribuía, mais seis arquivos, e mandou a USL refazer a queixa com base apenas nesses seis ou ver o caso arquivado. A USL refez o processo contra a BSDi e contra a universidade, pedindo também a suspensão da Net/2 [30]. Em dezembro de 1992, o juiz federal Dickinson R. Debevoise, de Nova Jersey, ouviu os argumentos. Cerca de seis semanas depois, publicou uma decisão de quarenta páginas que negou a liminar e derrubou todas as queixas menos duas, sugerindo que o caso fosse primeiro a uma corte estadual. A universidade entrou na segunda-feira seguinte com uma ação na Califórnia, acusando a USL de não dar o crédito devido ao código BSD incluído no System V [30].

Logo depois, a Novell comprou a USL da AT&T. Segundo McKusick, o presidente da Novell, Ray Noorda, disse em público que preferia competir no mercado a competir no tribunal. As negociações começaram no verão de 1993 e terminaram em janeiro de 1994: três arquivos saíram dos 18.000 da Net/2, outros receberam pequenas mudanças, e cerca de 70 passaram a levar copyright da USL, sem deixar de ser redistribuíveis [30]. O 4.4BSD-Lite saiu em junho de 1994, e o acordo garantia que a USL não processaria quem o usasse como base. O FreeBSD teve até o fim de julho de 1994 para parar de distribuir o produto baseado na Net/2, levou até novembro para refazer o sistema sobre o 4.4BSD-Lite e lançou o FreeBSD 2.0 em dezembro [33].

Some as datas. Entre o lançamento comercial da BSDi, em janeiro de 1992, e o FreeBSD 2.0, em dezembro de 1994, quem quisesse um BSD livre para PC conviveu com quase três anos de incerteza jurídica. É exatamente o período em que o Linux foi da versão 0.12 à 1.0 e trocou a licença própria pela GPL [28], [24]. Hedrick já previa o problema em fevereiro de 1992: seu sistema ideal era o 4.4BSD, mas "4.4's release date has a history of extreme slippage" [4].

O que os dois lados disseram depois

Os dois lados do debate concordam sobre o efeito. Torvalds disse à revista Meta em novembro de 1993: "If 386BSD had been available when I started on Linux, Linux would probably never had happened" [11]. Tanenbaum, em 2004: "This delay in getting free BSD out there gave Linux the breathing space it needed to catch on. If it hadn't been for the lawsuit, undoubtedly BSD would have filled the niche for a powerful, free UNIX clone as it was already a stable, mature system with a large following" [6].

Junte a isso a licença. O Linux era GPL desde fevereiro de 1992 [28], e o MINIX só virou BSD em 2000 [23]. Em 1992, quem queria um Unix livre para PC 386 tinha um sistema disponível, que aceitava contribuições e deixava qualquer um redistribuir. Esse sistema era o Linux. O mérito de Torvalds foi enorme e não precisa de exagero: ele estava pronto quando os outros não estavam, e soube aceitar o código de quem chegava.

2004: o relatório que acusou Linus de cópia

O mito da cópia ganhou versão "oficial" em maio de 2004. Kenneth Brown, presidente da Alexis de Tocqueville Institution (AdTI), de Washington, publicou Samizdat, um texto datado de 20 de maio de 2004 que questionava a origem do código do Linux e o crédito dado a Torvalds [34].

Tanenbaum respondeu no mesmo dia, 20 de maio, numa página chamada "Some Notes on the 'Who wrote Linux' Kerfuffle". Contou que Brown viajou a Amsterdã para entrevistá-lo em 23 de março de 2004 e se esquivou quando perguntado sobre o financiamento. A transcrição é seca: "AST: Is Microsoft one of them? KB: We have multiple funding sources" [6]. Dois anos depois, Tanenbaum escreveu sem rodeio que "Microsoft paid a guy named Ken Brown to write a book saying Linus stole Linux from my MINIX 1 system" [35]. A afirmação é de Tanenbaum. Na entrevista de 2004, Brown só repetiu que tinha "multiple funding sources" [6].

O núcleo da resposta de 2004 desmonta o mito melhor do que qualquer defensor do Linux faria:

Thus, of course, Linus didn't sit down in a vacuum and suddenly type in the Linux source code. He had my book, was running MINIX, and undoubtedly knew the history (since it is in my book). But the code was his. The proof of this is that he messed the design up. [6]

Tanenbaum continua: em vez de escrever um novo sistema de arquivos e um novo gerenciador de memória sobre o microkernel, "Linus rewrote the whole thing as a big monolithic kernel, complete with inline assembly code :-(". E conclui: "producing a system that was fundamentally different from the base he started with seems pretty good proof that it was a redesign" [6].

A acusação de cópia também foi testada com código. Alexey Toptygin, contratado como consultor para o próprio Brown, comparou o Linux 0.01, 0.11, 0.12 e versões posteriores com o MINIX. Entregou o resultado a Brown em 17 de maio de 2004: "my analysis found no evidence whatsoever that any code was copied one way or the other" [36]. O relatório técnico achou "Only 4 actual similarities", e em cada caso "the similarity was required by external factors (the C standard, the POSIX standard, the minix filesystem format)" [37]. Segundo Toptygin, Brown passou a conversa seguinte tentando convencê-lo de que ele tinha errado, porque "it was clearly impossible for one person to write an OS" [36].

Torvalds respondeu ao relatório com ironia. À LinuxWorld, mandou um e-mail que começava assim: "Ok, I admit it. I was just a front-man for the real fathers of Linux, the Tooth Fairy and Santa Claus" [38]. A brincadeira seguia: o Papai Noel tinha contatos na Universidade de Helsinque por ser finlandês.

Tanenbaum fez uma ressalva que os fãs de Linux costumam pular. Ele acha que Torvalds deu crédito de menos aos antecessores: "In science it is considered important to credit people for their ideas, and I think Linus has done this far less than he should have. Ken and Dennis are the real heros here. But Linus' sloppiness about attribution is no reason to assert that Linus didn't write Linux" [6]. E também deixou claro onde estava a sua discordância: "My only regret is that he didn't develop Linux based on the microkernel technology of MINIX" [6].

A ACM resumiu o legado do MINIX de forma equilibrada ao dar a Tanenbaum o Software System Award de 2023: o prêmio foi "For MINIX, which influenced the teaching of Operating Systems principles to multiple generations of students and contributed to the design of widely used operating systems, including Linux" [39]. O MINIX influenciou o desenho do Linux. Não lhe deu o código.

Professor e aluno?

Uma variação do mito diz que Tanenbaum foi professor de Torvalds, e que o aluno teria traído o mestre. O post de 1991 vem de uma conta da Universidade de Helsinque [10]; Tanenbaum dava aula na Vrije Universiteit, em Amsterdã [1]. Em 2004 ele escreveu: "Linus and I are not 'enemies' or anything like that. I met him once and he seemed like a nice friendly, smart guy" [6]. Em 2006, repetiu: "I met him once. He is a pleasant fellow and very smart. We may disagree on some technical issues, but that doesn't make us enemies" [35]. O "Be thankful you are not my student" de 1992 era retórica, justamente porque Torvalds não era aluno dele. O próprio tópico deixa isso claro duas vezes. Torvalds respondeu que não tiraria nota boa de qualquer jeito, porque tinha brigado com "the person here at the university that teaches OS design", em Helsinque. E Tanenbaum, no "Unhappy campers" de 3 de fevereiro, escreveu sobre portabilidade: "Surely Linus' OS professor pointed this out" [4]. Quem fala do professor de outra pessoa não é o professor dela.

"O Linux nem é UNIX"

Aqui o mito acerta mais do que erra. UNIX é marca registrada da Open Group, e só pode usá-la o produto que passa na suíte de testes da especificação e assina o contrato de licença da marca. O macOS 26 Tahoe, por exemplo, está registrado como UNIX 03 desde 29 de agosto de 2025, para Macs com Apple Silicon e com Intel [7]. As distribuições Linux comuns não estão nesse registro, então chamá-las de UNIX é tecnicamente errado. O Linux também não é BSD: ele não deriva do código de Berkeley e foi escrito do zero [26].

Dois detalhes desmontam a versão exagerada do argumento. O primeiro: a certificação é de um produto completo, não de um kernel. O registro da Open Group diz "macOS version 26.0 Tahoe", não "XNU" [7]. Dizer que um kernel é "certificado UNIX" é confundir as coisas, seja o XNU, seja o Linux.

O segundo: um sistema baseado em Linux já passou na certificação. O Huawei EulerOS 2.0, rodando nos servidores KunLun, aparece no registro UNIX 03 com data de registro de 8 de setembro de 2016 e renovação prevista para 8 de setembro de 2022 [12]. Passou na mesma suíte de testes que o macOS. Logo, a ideia de que "o Linux não respeita POSIX" não se sustenta como regra técnica. Não encontrei documento oficial que explique por que as distribuições comuns não se certificam. Minha leitura é que a marca não compensa o custo para quem já vende suporte de Linux, mas isso é opinião. Em 1992, Torvalds já dizia ter feito o Linux "as conformant to standards as I knew how", ainda sem a norma POSIX à mão [1].

O resumo honesto: o Linux não é UNIX no papel, porque não tem a marca. Na prática, um Linux certificado provou que não é por falta de capacidade técnica.

"O ABI do Linux vive quebrando"

Este mito mistura duas interfaces diferentes, e a documentação do kernel separa as duas na primeira página. Greg Kroah-Hartman escreveu o texto que explica por que o Linux não tem interface estável para drivers, e abre com um aviso: "Please realize that this article describes the in kernel interfaces, not the kernel to userspace interfaces" [13].

Sobre a interface que os programas usam, o texto não deixa margem: "The kernel to userspace interface is the one that application programs use, the syscall interface. That interface is very stable over time, and will not break. I have old programs that were built on a pre 0.9something kernel that still work just fine on the latest 2.6 kernel release" [13]. Quem diz que as syscalls mudam a cada versão está errado.

A interface interna, a que os drivers usam, muda de propósito. O mesmo documento cita pelo menos três reformas na pilha USB e explica que, quando um desenvolvedor encontra um jeito melhor, "function names may change, structures may grow or shrink, and function parameters may be reworked", e todos os usuários dentro da árvore são corrigidos de uma vez [13]. A recomendação para quem tem driver fora da árvore é colocá-lo dentro. E para quem não pode, porque o driver é fechado: "good luck, you are on your own here, you leech" [13].

Aqui o Linux leva uma crítica justa. A escolha tem custo real para quem compra hardware cujo driver o fabricante mantém fora da árvore: quando a interface interna muda, esse driver precisa ser adaptado, e o próprio documento admite que acompanhar a mudança "is also a rough job" [13]. O argumento do projeto é que o custo cai em quem não manda o código para o mainline, e isso é coerente. Mas o usuário que só quer a placa de rede funcionando paga a conta do mesmo jeito. Dizer que o problema não existe é tão errado quanto dizer que as syscalls quebram.

Quando o kernel remove código

Outro mito recente diz que o ReiserFS foi retirado do kernel por motivação política. O registro mostra outra coisa. Em fevereiro de 2022, Jan Kara, da SUSE, propôs a depreciação com esta justificativa: "Reiserfs is relatively old filesystem and its development has ceased quite some years ago. Linux distributions moved away from it towards other filesystems such as btrfs, xfs, or ext4. To reduce maintenance burden on cross filesystem changes [...] let's add a deprecation notice when the filesystem is mounted and schedule its removal to 2025" [40]. A remoção entrou no Linux 6.13 e apagou cerca de 32,8 mil linhas [41]. É a mesma lógica da interface instável: código sem mantenedor dentro da árvore vira peso para quem mexe nas interfaces compartilhadas.

Microkernel contra monolito, com números

Tirando os insultos, o debate de 1992 tinha uma pergunta técnica legítima: vale a pena tirar do modo kernel o que não precisa estar lá? Trinta anos de pesquisa deram dados para os dois lados.

O argumento do Tanenbaum: os bugs moram nos drivers

Em 2001, Andy Chou, Dawson Engler e colegas de Stanford aplicaram verificadores estáticos automáticos ao código do Linux e do OpenBSD. A conclusão para o Linux 2.4.1 foi que "the vast majority of bugs are in drivers", e que a taxa de erro do código de driver é de três a sete vezes maior que a do resto do kernel. No verificador de travas, "the error rate for drivers is almost seven times higher than the error rate for the rest of the kernel" [42].

O Windows tinha o mesmo problema, medido de outro jeito. Em 2003, Michael Swift, Brian Bershad e Henry Levy, da Universidade de Washington, abriram o artigo do Nooks com um número da Microsoft: "In Windows XP, for example, drivers account for 85% of recently reported failures" [43]. O Nooks isolava drivers do Linux em domínios de proteção leves dentro do próprio espaço de endereçamento do kernel e os reiniciava em caso de falha. Em 2.000 testes de injeção de falhas, "Nooks recovered automatically from 99% of the faults that caused Linux to crash" [43]. O sistema tinha cerca de 22.000 linhas, contra 2,4 milhões do kernel da época. Os drivers continuavam rodando no anel 0, o mesmo nível de privilégio do resto do kernel, e a proteção vinha das tabelas de páginas [43].

Tanenbaum usou esses dados em 2006, num artigo com Jorrit Herder e Herbert Bos na IEEE Computer. O raciocínio é aritmético: se o código tem de 6 a 16 bugs por mil linhas, "Using a conservative estimate of 6 bugs per 1000 lines of code the Linux kernel probably has something like 15,000 bugs; Windows has at least double that" [44]. Num kernel monolítico, um driver com defeito roda no mesmo espaço de endereçamento que todo o resto. A documentação da Microsoft descreve o problema no Windows com uma clareza que eu gostaria de ver mais vezes: "All code that runs in kernel mode shares a single virtual address space. As a result, a kernel-mode driver isn't isolated from other drivers or the operating system. [...] If a kernel-mode driver crashes, it causes the entire operating system to crash" [8].

O Linux merece, aqui, um dado a seu favor que os críticos raramente citam. Em 2011, Nicolas Palix, Julia Lawall e colegas repetiram o estudo de Chou nas versões 2.6.0 a 2.6.33. O kernel mais que dobrou de tamanho no período, mas o número de falhas por linha caiu. O diretório drivers ainda concentrava a maior quantidade absoluta de falhas e, com o drivers/staging, respondia por 57% do código desde o 2.6.30. A taxa de falhas dele, porém, "is now below that of other directories, such as arch (HAL) and fs (file systems)", e desde o 2.6.19 está "right at the average" [45]. A revisão por pares melhorou os drivers. O que não mudou foi a consequência de um bug que sobra: no Linux, ele roda com privilégio total.

Nesse ponto, o Linux leva crítica justa, e o próprio Torvalds forneceu a munição. Em setembro de 2009, na LinuxCon, ele disse: "We're getting bloated and huge. Yes, it's a problem". E completou: "sometimes it's a bit sad that we are definitely not the streamlined, small, hyper-efficient kernel that I envisioned 15 years ago...The kernel is huge and bloated, and our icache footprint is scary" [46]. Quem trata o kernel Linux como modelo de elegância está defendendo algo que o próprio autor não defende.

MINIX 3: drivers fora do kernel e um servidor que os ressuscita

O MINIX 3 é a resposta de Tanenbaum a esses números, e ele foi mais longe que o MINIX 2. No artigo da IEEE Computer, a arquitetura é descrita em camadas. O microkernel trata interrupções, processos, escalonamento e IPC, e oferece um pequeno conjunto de chamadas de kernel a drivers e servidores autorizados, como ler o espaço de endereçamento de um usuário ou escrever em portas de I/O permitidas. "The clock driver shares the microkernel's address space, but is scheduled as a separate process. No other drivers run in kernel mode" [44]. Cada driver de disco, terminal, rede, impressora ou áudio roda num processo próprio, em modo usuário, protegido pela MMU, e precisa pedir ao kernel para tocar no hardware. O servidor de arquivos tinha 4.500 linhas de código executável, e o kernel, 4.000: com a mesma estimativa de 6 bugs por mil linhas, "the total number of bugs in the kernel is probably only about 24 (vs. 15,000 for Linux and far more for Windows)" [44].

A troca de mensagens manteve a ideia do MINIX 2 e ganhou um complemento. O IPC "is done by passing fixed-length messages using the rendezvous principle", com cópia direta do remetente para o destinatário, mais um mecanismo de notificação assíncrona: eventos que não podem ser entregues ficam marcados como pendentes num mapa de bits na tabela de processos. Interrupções viram notificações, e o kernel as converte em mensagens normais quando o driver está pronto para recebê-las [44]. Como não há fila nem buffer de mensagens no kernel, não há como esgotar memória do kernel com mensagens. As permissões ficaram mais finas: para cada processo, o sistema restringe as primitivas de IPC, os destinos permitidos e o uso de notificações, e processos de usuário só falam com os servidores POSIX [44].

O componente novo é o servidor de reencarnação (reincarnation server). O artigo de Herder, Bos, Gras, Homburg e Tanenbaum no DSN 2007 descreve como ele funciona [47]. Um driver é iniciado pelo utilitário service com o binário, um nome estável, a lista exata de privilégios, um período de heartbeat e, opcionalmente, um script de política para a recuperação. O servidor de reencarnação é o pai de todos os processos de sistema e fica sabendo na hora quando um deles sai, entra em pânico ou morre por exceção de CPU ou de MMU. Ele também pede heartbeats periódicos e inicia a recuperação depois de N respostas perdidas, o que pega processos presos em laço infinito. O servidor de arquivos pode pedir a troca de um driver de disco que viole o protocolo, e o usuário pode mandar reiniciar um driver ou trocá-lo por uma versão corrigida com o sistema rodando [47]. Um servidor de dados (data store) publica o novo endereço de IPC do driver reiniciado, e quem depende dele é avisado. O driver de disco que morre no meio de uma leitura é reiniciado, e o servidor de arquivos reemite as operações pendentes, porque I/O de bloco é idempotente.

Os números do artigo são concretos. Num teste de rede com wget baixando um arquivo de 512 MB enquanto o driver RealTek 8139 era morto em intervalos de 1 a 15 segundos, todas as transferências terminaram com o checksum correto, e a perda de vazão ficou entre 25% e 1% [47]. No disco SATA, lendo 1 GB com o driver morto em intervalos parecidos, a perda foi de 62% a 7%, também sem corromper dados. Na injeção de falhas no driver Ethernet DP8390, rodando no emulador Bochs, foram mais de 12.500 falhas injetadas e 347 travamentos detectáveis, e "The subsequent recovery was successful in 100% of the induced failures"; no hardware real, o sucesso passou de 99% [47]. O custo de adaptação de um driver comum foi de exatamente cinco linhas na biblioteca compartilhada de drivers.

Os próprios autores listam os limites, e é aí que a honestidade do trabalho aparece. O desenho não lida com falhas bizantinas, como um driver de disco que responde que gravou e grava lixo; não detecta corrupção silenciosa de dados; não cura bugs determinísticos que voltam depois do reinício; e não resolve hardware quebrado [47]. O FAQ do projeto mede o custo do isolamento: "MINIX 3 is 5-10% slower" que o MINIX 2, que tinha drivers em modo kernel, e "our priority has been reliability, not performance" [48]. Em 2008, o European Research Council deu a Tanenbaum uma bolsa de 2,5 milhões de euros para construir um sistema confiável, e o MINIX 3.3.0 saiu com licença BSD, suporte a x86 e ARM Cortex-A8 e área de usuário compatível com o NetBSD [49].

O argumento do Torvalds: estado compartilhado

Torvalds respondeu ao debate em maio de 2006, no fórum Real World Technologies, e o argumento dele não era desempenho. Era complexidade:

The fundamental result of access space separation is that you can't share data structures. That means that you can't share locking, it means that you must copy any shared data, and that in turn means that you have a much harder time handling coherency. All your algorithms basically end up being distributed algorithms. [50]

Para ele, a separação em espaços de endereçamento troca bugs de memória por bugs de coordenação entre processos, que são mais difíceis de entender. Na mesma mensagem, ele atacou de frente a ideia do servidor de reencarnação: "the argument that you can 'just reload' a failed service and not take the whole system down is equally flawed. Anybody who has ever done distributed programming should know by now that when one node goes down, often the rest comes down too" [50]. E descartou o termo da moda: "As to the whole 'hybrid kernel' thing - it's just marketing" [50].

O argumento é sério, e os dados do MINIX 3 respondem só a uma parte dele. Para falhas transitórias de drivers de rede e de disco, onde o protocolo tolera repetição, o reinício funcionou em quase todos os casos medidos [47]. Para estado compartilhado de verdade, como um sistema de arquivos com metadados em memória, os próprios autores do MINIX 3 admitem que o reinício não basta e que é preciso somar checksums de ponta a ponta [47]. Torvalds exagera quando chama de falho o argumento do reinício. Tanenbaum exagerava quando vendia o isolamento como solução geral.

Desempenho: o problema era o Mach, não a ideia

Em 1992, Tanenbaum citou os artigos de Rick Rashid comparando o Mach 3.0 com sistemas monolíticos como evidência de que o desempenho tinha deixado de ser problema [1]. A afirmação era prematura. Gernot Heiser e Kevin Elphinstone, que trabalharam décadas no L4, resumem o começo dos anos 1990: "The typical cost for a one-way message was around 100 µs, which was too high for building performant systems", e a resposta da indústria foi "a trend to move core services back into the kernel" [51].

Jochen Liedtke mostrou em 1993 que o custo vinha da implementação. No artigo "Improving IPC by Kernel Design", apresentado no SOSP, ele reconstruiu do zero a parte de processos e comunicação do microkernel L3 em torno de um único objetivo, a velocidade do IPC. Num 486-DX50, calculou o mínimo teórico de uma mensagem curta em 172 ciclos, ou 3,5 µs, mirou em 350 ciclos e chegou a 250 ciclos, 5 µs [14]. Em relação ao Mach, o ganho foi "from a factor of 22 (8-byte messages) to 3 (4-Kbyte messages)". O artigo mede até o custo de entrar e sair do kernel: no Mach, a chamada mach_thread_self levava 18 µs, num processador em que a ida e volta mínima ao kernel custava 2 µs [14].

Dois anos depois, em "On µ-Kernel Construction", Liedtke formulou o critério que guiaria a família L4: um conceito só é tolerado dentro do microkernel "only if moving it outside the kernel, i.e. permitting competing implementations, would prevent the implementation of the system's required functionality" [52]. E escreveu uma frase que deveria incomodar quem usa o debate de 1992 como arma: "µ-kernels are inherently not portable. Instead, they are the processor dependent basis for portable operating systems" [52]. O microkernel mais rápido da época era tão preso ao processador quanto o Linux 0.01. Tanenbaum tinha razão sobre a arquitetura e estava errado ao achar que ela vinha junto com portabilidade de graça.

A linhagem L4 continuou. A tabela de Heiser e Elphinstone mostra o custo de uma mensagem entre espaços de endereçamento caindo de 5 µs no L4 original de 1993 para 0,09 µs no seL4 de 2013, num Core i7 Haswell a 3,4 GHz, ou 301 ciclos; num ARM11 a 532 MHz, o seL4 levava 188 ciclos [51]. Em 1997, Hermann Härtig, Michael Hohmuth, Liedtke e colegas, em Dresden, portaram o Linux para rodar sobre o L4 e mediram: "For L4Linux, the AIM benchmarks report a maximum throughput which is only 5% lower than that of native Linux. The corresponding penalty is 5 times higher for a co-located in-kernel version of MkLinux, and 7 times higher for a user-level version of MkLinux" [15]. O MkLinux rodava sobre o Mach. Um microkernel bem projetado custava 5%; o Mach custava muito mais.

Tanenbaum, em 2004, dizia aceitar uma perda bem maior: "I would easily give up 20% in performance for a system that was robust, reliable" [53]. É uma posição legítima para quem projeta sistema crítico. É uma posição difícil de vender para quem roda um data center.

O que os outros fizeram antes, ou melhor

Esta é a parte que a visão mística do Linux mais gosta de pular. Dominar supercomputadores e celulares [2], [3] não torna o Linux autor de todas as boas ideias, e várias das que hoje parecem "coisa de Linux" apareceram antes em outros sistemas.

macOS e XNU: UNIX certificado, mas não microkernel

O macOS tem o que nenhuma distribuição Linux comum tem: o registro UNIX 03. O macOS 26 Tahoe foi registrado em 29 de agosto de 2025, em Apple Silicon e em Intel [7]. O registro se repete a cada versão: o macOS 15 Sequoia tinha sido registrado em 12 de setembro de 2024 [54]. Quem trata o macOS como brinquedo está desprezando um sistema de desktop de massa que passa na suíte de conformidade da Open Group versão após versão. A Apple também usa microkernel onde o risco é maior: o processador do Secure Enclave "runs an Apple-customized version of the L4 microkernel" [55].

O mito do outro lado diz que o macOS é microkernel porque o XNU tem o Mach dentro. A própria Apple desmente, e vale olhar por dentro. O README do código do XNU o descreve como "a hybrid kernel combining the Mach kernel developed at Carnegie Mellon University with components from FreeBSD and a C++ API for writing drivers called IOKit"; na árvore, osfmk guarda os subsistemas derivados do Mach e bsd guarda os do BSD [56]. Do Mach vêm as abstrações: tasks, que são unidades de posse de recursos com espaço de endereçamento, um espaço de nomes de direitos de porta e uma ou mais threads; e portas, "Secure, simplex communication channels, accessible only via send and receive capabilities (known as port rights)" [17]. No nível da armadilha para o kernel, a interface da maior parte dessas abstrações é feita de mensagens para portas do kernel, e o Mach Interface Generator (MIG) gera os stubs que escondem isso do programador [17].

Parece microkernel, mas a Apple explica logo depois: "in OS X, Mach is linked with other kernel components into a single kernel address space. This is primarily for performance; it is much faster to make a direct call between linked components than it is to send messages or do remote procedure calls (RPC) between separate tasks" [17]. A Apple conclui que, no OS X, "Mach is not primarily a communication hub between clients and servers". A documentação de arquitetura avisa que "OS X uses the term kernel somewhat differently than you might expect" e que "The OS X kernel environment includes the Mach kernel, BSD, the I/O Kit, file systems, and networking components" [16]. Os drivers do I/O Kit são extensões carregadas "into kernel space" [16]. Tanenbaum foi mais duro em 2006: o Mac OS X "is sort of microkernelish", mas "Since all of it runs in kernel mode (to get that little extra bit of performance) it is not a true microkernel" [35]. Pela régua de 1992, o XNU está do mesmo lado do Linux. Quem elogia o macOS por ser "Mach" e ataca o Linux por ser monolítico está usando dois pesos.

Onde a Apple foi além do Linux foi nos drivers de terceiros. A documentação do DriverKit diz: "The drivers you build with DriverKit run in user space, rather than as kernel extensions, which improves system stability and security" [57]. A página sobre extensões de kernel informa que elas foram depreciadas e que, a partir do macOS Big Sur, o sistema não carrega por padrão extensões que usam interfaces de kernel depreciadas [58]. Na prática, a Apple empurra os fabricantes de periféricos para fora do modo kernel com uma política de plataforma. O Linux não tem nada equivalente para drivers em geral, e explico adiante o que ele tem.

FreeBSD: jails em 2000, ZFS e DTrace antes do Linux

Os contêineres costumam ser contados como uma história do Linux. O isolamento de sistema operacional em produção apareceu antes no FreeBSD. A página de manual diz: "The jail utility appeared in FreeBSD 4.0" [9]. O FreeBSD 4.0 foi anunciado em 14 de março de 2000 [59]. No mesmo ano, Poul-Henning Kamp e Robert Watson apresentaram o desenho no SANE 2000: o jail "provides the ability to partition the operating system environment, while maintaining the simplicity of the UNIX 'root' model", e o uso mais popular até ali era "providing virtual machine services in Internet Service Provider environments" [60].

No Linux, as peças chegaram aos poucos. O namespace de montagem apareceu no 2.4.19 [61]. Os cgroups estrearam no 2.6.24 [18], lançado em 24 de janeiro de 2008 [62]. Criar um namespace de usuário sem privilégio só passou a ser possível no Linux 3.8 [63]. O modelo do Linux, com primitivas separadas que o espaço de usuário combina, acabou mais flexível, e foi sobre ele que a indústria de contêineres cresceu. Mas o jail veio antes.

Duas ferramentas que os administradores de Linux invejaram por anos também vieram de fora. O ZFS foi "Originally developed at Sun Microsystems" [64], e as notas do FreeBSD 7.0 registram: "Support for Sun's ZFS has been added" [65]. O 7.0 saiu em 27 de fevereiro de 2008 [66]. O DTrace foi apresentado por Bryan Cantrill, Michael Shapiro e Adam Leventhal, da equipe de kernel do Solaris na Sun, no USENIX de 2004, como uma ferramenta capaz de instrumentar kernel e programas "in a unified and absolutely safe fashion", com "zero probe effect" quando desligada [67]. O FreeBSD 7.1, de 4 de janeiro de 2009, trouxe o DTrace "imported from OpenSolaris" [68], [69]. O manual do FreeBSD ainda abre o capítulo assim: "DTrace [...] was developed by Sun™ as a tool for locating performance bottlenecks in production and pre-production systems" [70]. O eBPF, que hoje cumpre esse papel no Linux, só ganhou a chamada de sistema bpf() no Linux 3.18, lançado em 7 de dezembro de 2014 [71].

Windows NT: o falso microkernel que voltou ao kernel

O Windows é o alvo preferido da turma que ama Linux, e merece crítica: os drivers de modo kernel dele caem pelo mesmo motivo que os do Linux, como a própria Microsoft documenta [8]. Também merece a crítica de marketing. Em 1992, Tanenbaum citou o "not-yet-released Windows/NT" como exemplo de microkernel [1]. Em 2004, corrigiu: "Microsoft claimed that Windows NT 3.51 was a microkernel. It wasn't. It wasn't even close. Even they dropped the claim with NT 4.0" [53]. O "kernel híbrido" que Torvalds chamou de "just marketing" é, em boa parte, este [50].

O NT também tem pedigree, que costuma ser esquecido. Tanenbaum conta que a Microsoft contratou David Cutler, um dos arquitetos principais do VMS da DEC, para liderar a equipe que produziu o Windows NT, e acrescenta que "Operating system designers of Cutler's quality are few and far between" [72].

A melhor fonte sobre o desenho do NT e sobre o recuo do NT 4.0 é um documento da própria Microsoft, o "Windows NT Kernel-mode User and GDI White Paper", ainda arquivado no Microsoft Learn [73]. Ele descreve o NT 3.51 em camadas: a camada de abstração de hardware (HAL) na base, um "microkernel" que cuida de interrupções, chamadas de procedimento adiadas, escalonamento de threads e sincronização, e o Executive por cima. O mesmo texto admite que o NT "has fallen squarely into the modified microkernel or macrokernel camp": desde a primeira versão, o gerenciador de memória, o cache, os sistemas de arquivos, os protocolos de rede, o servidor de rede e o gerenciamento de processos rodavam em modo kernel [73]. O que ficava fora eram os subsistemas de ambiente. O plano original previa Win32, OS/2 e POSIX como ambientes de igual para igual; o Win32 acabou como uma "aplicação" privilegiada da qual todo o resto dependia, e o gerenciador de janelas (USER) e a interface gráfica (GDI) rodavam num processo de usuário, o CSRSS.EXE [73].

No NT 4.0, a Microsoft trouxe USER e GDI para dentro do kernel, e o documento explica por quê com números. O modelo cliente-servidor exigia um buffer de memória compartilhada de 64 KB e várias trocas de contexto entre threads e processos por chamada gráfica. Num Pentium 100, uma transição cliente-servidor custava de 60 a 70 microssegundos, contra 4 a 5 de uma transição para o modo kernel [73]. A mudança economizava de 256 KB a 1 MB de memória de trabalho e deixava o PowerPoint de 15% a 20% mais rápido. Os drivers gráficos, que antes rodavam em parte no CSRSS, passaram a rodar inteiros em modo kernel [73].

O argumento da Microsoft para não temer a mudança é o mesmo de Torvalds. O documento diz que "No commercial operating system is based on a pure microkernel design", porque o desenho puro "is too computationally expensive", e pergunta qual a diferença prática entre um sistema que trava e um que continua rodando "but loses all access to persistent storage" quando o sistema de arquivos em modo usuário morre [73]. Sobre a GDI, admite: se o processo gráfico do NT 3.51 falhasse, o usuário veria "a system that appears to have crashed" [73]. A Microsoft fez no NT 4.0, em nome do desempenho, a troca que Tanenbaum criticava no Linux.

Anos depois, o Windows ganhou um mecanismo que o Linux não tem no mesmo grau: um framework oficial para drivers em modo usuário. Segundo a Microsoft, "UMDF drivers abstract hardware functionality, run in the user-mode environment, and can access various services". Cada driver roda dentro de um processo hospedeiro, gerenciado por um serviço, e um componente em modo kernel, o reflector, faz a ponte [74]. Há limites: "File system drivers, display drivers (for full display devices, not display-only display devices), and print drivers cannot be UMDF drivers" [74]. Ainda assim, para muitas classes de dispositivo, o Windows oferece de série o isolamento de driver que o Linux oferece só em nichos.

O Linux de hoje: monolítico, com janelas para fora

O Linux não virou microkernel, e os números mostram o tamanho do que continua dentro. Contei as linhas dos arquivos .c, .h, .S e .rs do tarball do Linux 7.2, publicado em 17 de agosto de 2026: são 37,7 milhões de linhas em 65.637 arquivos. O diretório drivers sozinho tem 26 milhões, 69% do total; arch vem depois, com 6,7% [75]. O Linux 0.01 tinha 9.877 linhas [5]. Quase tudo o que cresceu roda em modo kernel, no mesmo espaço de endereçamento, e um módulo carregado depois do boot tem o mesmo privilégio do código que estava lá desde o começo, como o artigo do Nooks já descrevia [43].

Ainda assim, o kernel foi abrindo janelas para fora do modo kernel, ou para dentro dele com rede de segurança. Algumas são respostas diretas ao que Tanenbaum e os usuários do MINIX pediam em 1992.

FUSE: o pedido de 1991, atendido em 2005

Em agosto de 1991, Jyrki Kuoppala pediu sistemas de arquivos em modo usuário, e Torvalds respondeu que talvez fosse a única coisa da lista que não daria para fazer [10]. O FUSE entrou no Linux 2.6.14, lançado em 27 de outubro de 2005, descrito pelo KernelNewbies como algo que "Allows to implement a fully functional filesystem in a userspace program" [76]. A documentação do kernel define o sistema de arquivos em espaço de usuário como aquele em que "data and metadata are provided by an ordinary userspace process", e lista as peças: um módulo de kernel (fuse.ko), uma biblioteca (libfuse) e o utilitário fusermount [19]. O recurso que ela destaca é a montagem sem privilégio: o daemon roda com as permissões de quem montou, e o exemplo citado é o sshfs. Se o daemon morre, a conexão com o kernel acaba e o sistema de arquivos para de responder; o kernel segue rodando [19]. É o modelo de servidor do MINIX aplicado a uma classe de sistemas de arquivos.

UIO e VFIO: drivers em espaço de usuário, com e sem IOMMU

O UIO, documentado no kernel desde 2006, permite escrever a maior parte de um driver em espaço de usuário. A documentação lista as vantagens com franqueza: "bugs in your driver won't crash the kernel" e "updates of your driver can take place without recompiling the kernel" [77]. O alcance é limitado: dispositivos já atendidos por subsistemas como rede, serial ou USB "are no candidates for an UIO driver" [77].

O VFIO, que entrou no Linux 3.6, lançado em 30 de setembro de 2012 [78], resolveu o problema que o UIO deixava aberto. Um driver em espaço de usuário que programa DMA pode escrever em qualquer lugar da memória, e aí o isolamento vira enfeite. A documentação do VFIO o descreve como "an IOMMU/device agnostic framework for exposing direct device access to userspace, in a secure, IOMMU protected environment", o que permite "safe, non-privileged, userspace drivers" [20]. O texto critica o UIO, que "has no notion of IOMMU protection, limited interrupt support, and requires root privileges to access things like PCI configuration space" [20]. O uso principal é dar a uma máquina virtual acesso direto a um dispositivo, o que, nas palavras da documentação, "turns the VM into a userspace driver". O MINIX 3 propunha a mesma proteção: no artigo do DSN 2007, o driver que quer fazer DMA com segurança primeiro pede ao kernel para configurar a I/O MMU [47].

eBPF e sched_ext: código no kernel, com verificador e plano de fuga

O eBPF vai pelo caminho oposto: leva código para dentro do kernel, mas só depois de checá-lo. A chamada bpf() entrou no Linux 3.18, e o KernelNewbies resumiu: "eBPF programs are similar to kernel modules. [...] eBPF verifier statically determines that the program terminates and is safe to execute" [71]. A documentação do verificador detalha as duas etapas: primeiro, uma checagem do grafo de fluxo que proíbe laços e código inalcançável; depois, uma simulação de todos os caminhos possíveis, instrução por instrução, acompanhando o tipo de cada registrador e da pilha [79]. A proteção vem de uma checagem feita antes da carga, e essa ideia está mais perto do seL4 do que do MINIX.

O sched_ext, que entrou no Linux 6.12, lançado em 17 de novembro de 2024 [80], leva isso ao escalonador. Ele é "a scheduler class whose behavior can be defined by a set of BPF programs", e a documentação promete: "The system integrity is maintained no matter what the BPF scheduler does. The default scheduling behavior is restored anytime an error is detected, a runnable task stalls, or on invoking the SysRq key sequence SysRq-S" [21]. Um escalonador com defeito é derrubado e o kernel volta ao padrão. Troque "escalonador" por "driver" e "padrão" por "nova instância" e a frase poderia estar no artigo do servidor de reencarnação.

Rust: a mesma pergunta, outra resposta

A aposta mais recente ataca a classe de bug que Chou mediu nos drivers sem tirar os drivers do modo kernel. O suporte a Rust entrou no Linux 6.1, em 2022, num estado tão inicial que, segundo a LWN, "No system with a production 6.1 kernel will be running any Rust code" [81]. Três anos depois, o quadro mudou. Na Maintainers Summit de dezembro de 2025, o consenso dos mantenedores foi que o Rust deixava de ser experimental e passava a ser parte permanente do kernel, e a etiqueta "experimental" seria removida [82]. Na sessão, Miguel Ojeda contou que o driver Binder do Android em Rust tinha entrado no 6.18 e que aparelhos com Android 16 e kernel 6.12 já saíam com o módulo ashmem escrito em Rust: "millions of real devices running kernels with Rust code now" [83]. Greg Kroah-Hartman disse que os drivers em Rust "are indeed proving to be far safer than those written in C" e que nenhum CVE tinha sido emitido para código Rust do kernel até ali. Dave Airlie, mantenedor do subsistema gráfico, disse que o DRM estava "about a year away" de recusar drivers novos em C. Torvalds encerrou a questão dizendo que, depois de quase cinco anos, tinha chegado a hora [83]. No Linux 7.2, pelas minhas contas, os arquivos .rs somam 182.584 linhas, menos de meio por cento do total [75].

O ponto técnico é que Rust e microkernel respondem à mesma pergunta de jeitos diferentes. O MINIX 3 aceita que o driver vai ter bug e isola o estrago com a MMU [44]. O Rust tenta impedir que uma classe de bug de memória chegue a existir, mas o driver continua no anel 0 e um erro de lógica continua podendo derrubar o sistema. A segunda via tem uma vantagem para o projeto: preserva o que Torvalds defendeu em 2006, o estado compartilhado entre subsistemas [50].

Onde o Linux continua monolítico

Drivers, pilha de rede, sistemas de arquivos principais e gerenciamento de memória continuam em modo kernel, no mesmo espaço de endereçamento [75]. FUSE, UIO e VFIO são saídas opcionais para nichos. O eBPF e o sched_ext põem dentro do kernel código verificado ou descartável, e o Rust troca isolamento por segurança de linguagem. Nenhuma dessas peças muda a arquitetura que Tanenbaum criticou em 1992. Quem diz que o Linux "já é meio microkernel" exagera. Quem diz que ele ignorou a crítica também.

Onde o microkernel venceu

A previsão de Tanenbaum de que os microkernels dominariam o desktop e o servidor não se cumpriu. Mas existem lugares onde a falha custa caro e o código precisa ser pequeno, e nesses lugares o microkernel ganhou.

seL4: um kernel com prova matemática

Em 2009, Gerwin Klein e colegas do NICTA e da UNSW publicaram no SOSP a verificação formal do seL4, "a third-generation microkernel of L4 provenance", que "comprises 8,700 lines of C code and 600 lines of assembler". O artigo descreve "the first formal proof of functional correctness of a complete, general-purpose operating-system kernel", verificada por máquina [84]. Os autores ligam o resultado ao tamanho: "With truly small kernels it becomes possible to take security and robustness further, to the point where it is possible to guarantee the absence of bugs" [84]. É o argumento de 1992, agora com prova.

O preço aparece no mesmo artigo. A prova inteira, com bibliotecas e partes geradas, soma 200.000 linhas de script do Isabelle, e os autores provaram mais de 150 invariantes sobre o estado do kernel [84]. Escrever o kernel custou 2,2 pessoas-ano, contando o protótipo em Haskell. A prova custou cerca de 20 pessoas-ano, das quais 11 foram específicas do seL4 e o resto foi ferramenta e pesquisa reaproveitável. Os autores comparam com a regra da indústria para certificação Common Criteria EAL6, de US$ 10 mil por linha, que daria US$ 87 milhões para o seL4 com garantia bem menor [84]. Os bugs que a prova achou no código C não eram falhas de algoritmo: eram, na maioria, erros de digitação, leitura errada da especificação e checagens esquecidas, e mesmo assim muitos bastavam para derrubar o kernel ou abrir uma vulnerabilidade [84]. A conta não fecha para 37 milhões de linhas. Heiser e Elphinstone escrevem que "even 9,000 SLOC pushed the limits of what was achievable" [51].

L4 em bilhões de aparelhos

A família L4 saiu do laboratório. Segundo Heiser e Elphinstone, uma versão embarcada do Pistachio teve "massive-scale commercial deployment when Qualcomm adopted it as a protected-mode real-time OS for the firmware of their wireless modem processors", e roda no processador de segurança dos aparelhos iOS recentes; a nota de rodapé diz: "Total deployment is now in the billions" [51]. O PikeOS, um clone comercial da segunda versão do L4, foi certificado para aviônica e roda em aviões e trens [51]. Em todos os kernels L4, os drivers rodam em modo usuário, com exceção do driver do temporizador e do controlador de interrupções, e os autores dizem que pôr drivers não verificados dentro do kernel "would obliterate any guarantees" [51]. Tanenbaum, em 2004, apontava também o QNX como "An example of commercially successful microkernel" [6], e em 2006 listou QNX, Integrity, PikeOS, Symbian e L4Linux como prova de que "clearly I am not alone in seeing something in microkernels" [35].

O MINIX dentro de quase todo PC Intel

A ironia mais citada da história é a de 2017. O MINIX 3 roda dentro do Intel Management Engine (ME), o subsistema de gerenciamento que funciona abaixo do sistema operacional nas máquinas Intel. Na Embedded Linux Conference Europe de 2017, em Praga, Ronald Minnich, do Google, descreveu os "anéis" abaixo do kernel: "Ring -3 is 'the one that has people really worried'. It runs MINIX 3 and is where the ME runs." Ele brincou que esse era o "year of MINIX 3 on the desktop", porque há mais máquinas com ME do que com Linux, macOS ou Windows. Ali rodam pilhas IPv4 e IPv6, sistemas de arquivos, drivers e servidores web. O ME "can reimage the system even if the power is turned off as long as it is plugged into the wall and the network", segundo o relato da LWN publicado em 20 de novembro de 2017 [85]. Na Black Hat Europe do mesmo ano, Mark Ermolov e Maxim Goryachy mostraram como rodar código não assinado no ME [86].

Tanenbaum escreveu uma carta aberta à Intel, endereçada a "Mr. Krzanich". A cópia mais antiga no Internet Archive é de 7 de novembro de 2017 [22]. O tom é de ironia e incômodo. Ele agradece por pôr o MINIX "inside the ME-11 management engine chip used on almost all recent desktop and laptop computers in the world", diz que isso talvez faça do MINIX "the most widely used computer operating system in the world" e reclama que ninguém o avisou [22]. Depois vem a parte que mais importa para este artigo: "I certainly hope Intel did thorough security hardening and testing before deploying the chip, since apparently an older version of MINIX was used. Older versions were primarily for education and newer ones were for high availability. Military-grade security was never a goal" [22].

O mito de que microkernel é sinônimo de seguro morre aqui, pela mão do autor do MINIX. O microkernel isola componentes e reduz o código privilegiado, o que ajuda a segurança. Ele não substitui auditoria, e o MINIX mais usado do planeta roda dentro de um firmware que o dono da máquina não audita. O problema do ME é de governança, não de arquitetura de kernel, e o próprio Tanenbaum separou as coisas: "that is Intel's business decision and a separate issue from the code it runs" [22].

O MINIX 3 hoje

O site do projeto ainda descreve o MINIX 3 como "designed to be highly reliable, flexible, and secure", com "a tiny microkernel running in kernel mode with the rest of the operating system running as a number of isolated, protected, processes in user mode" [87]. A página de recursos resume a arquitetura em três frases curtas: "Tiny microkernel that runs in kernel mode", "Each device driver is a separate user-mode process" e "Reincarnation server can reload failed drivers" [88]. O repositório oficial, porém, mostra um projeto parado: a tag mais recente é a v3.3.0 e o último commit no ramo principal é de 14 de novembro de 2018 [89]. A ideia continua viva no seL4, no L4 dos modems e no QNX. O MINIX virou, sobretudo, peça de firmware e de sala de aula.

O placar

Os números lado a lado

MedidaDadoFonte
Tamanho do Linux 0.0188 arquivos, 9.877 linhas (contagem minha)[5]
Tamanho do Linux 7.237,7 milhões de linhas, 69% em drivers (contagem minha)[75]
Rust no Linux 7.2182.584 linhas, cerca de 0,5% (contagem minha)[75]
Kernel do MINIX 3cerca de 4.000 linhas, só o driver de relógio em modo kernel[44]
Kernel do seL48.700 linhas de C e 600 de assembly[84]
IPC no Mach, começo dos anos 1990cerca de 100 µs por mensagem[51]
IPC no L3, 486 a 50 MHz5 µs, de 3 a 22 vezes mais rápido que o Mach[14]
IPC no seL4, Core i7 de 20130,09 µs (301 ciclos)[51]
NT 3.51, Pentium 10060 a 70 µs por troca cliente-servidor contra 4 a 5 µs para o kernel[73]
Custo de rodar o Linux sobre L45% de vazão a menos[15]
Custo do isolamento no MINIX 35% a 10% mais lento que o MINIX 2[48]
Bugs em drivers, Linux 2.4.1taxa de 3 a 7 vezes a do resto do kernel[42]
Drivers nas falhas do Windows XP85% das falhas reportadas[43]
Drivers do Linux, 2.6.19 a 2.6.33taxa de falhas na média do kernel[45]
Recuperação de drivers no MINIX 3100% no emulador, mais de 99% em hardware real[47]
Recuperação no Nooks (Linux)99% das falhas que derrubariam o Linux[43]
Custo da prova do seL4cerca de 20 pessoas-ano, 200.000 linhas de Isabelle[84]
LicençasLinux na GPL em 1992; 4.4BSD-Lite, livre do processo, em 1994; MINIX em BSD em 2000[28], [30], [33], [23]

Onde Tanenbaum acertou

Acertou no diagnóstico de confiabilidade. Os bugs se concentram nos drivers [42], [43], e num kernel monolítico um driver ruim derruba tudo, como a Microsoft documenta para o Windows [8] e como vale para o Linux. Acertou que um desenho com drivers isolados permite recuperar falhas que, num kernel monolítico, seriam fatais, e o MINIX 3 mediu isso [47]. Acertou que código privilegiado pequeno é o que permite garantias fortes: o seL4 só foi provado correto porque tem 8.700 linhas de C [84]. Acertou que o microkernel teria espaço onde a falha custa caro, dos modems da Qualcomm [51] ao Secure Enclave [55]. E acertou o efeito do processo contra o BSD sobre o sucesso do Linux, coisa que o próprio Torvalds confirmou [11], [6].

Onde Tanenbaum errou

Errou feio no mercado. Disse que o debate estava "essentially over" e que "Microkernels have won" [1]; o desktop e o servidor seguiram monolíticos ou híbridos, inclusive o XNU que ele mesmo classificou como "not a true microkernel" [35] e o NT, que levou a parte gráfica para o kernel justamente por desempenho [73]. Disse que o 80x86 "is not going to be around all that long" [1]; o macOS 26 ainda é certificado UNIX em Macs Intel, em 2025 [7], e o Linux mantém documentação própria para x86 ao lado de mais quinze arquiteturas [90]. Previu que em cinco anos "everyone will be running free GNU on their 200 MIPS, 64M SPARCstation-5" [4]; em 1997 o GNU estava na versão 0.2 [29]. Previu que coordenar programadores espalhados pelo mundo seria "as easy as herding cats" [4], e o projeto que ele imaginava anárquico hoje roda nos 500 maiores supercomputadores [2]. Tratou portabilidade como virtude do microkernel, quando Liedtke escreveria em 1995 que microkernels "are inherently not portable" [52]. Também usou o Windows NT como exemplo de microkernel em 1992 [1], para depois admitir que não era [53].

Onde Torvalds acertou

Acertou que estar disponível valia mais do que ser elegante [1]. Acertou que portabilidade de API importa mais para o usuário do que portabilidade do kernel. A troca para a GPL em 1992 [28], oito anos antes da troca do MINIX para a licença BSD [23], deu ao Linux a base de colaboradores que o MINIX recusou de propósito [6]. Acertou ao abrir o desenvolvimento cedo: em fevereiro de 1992 já sondava uma lista "linux-kernel" e aceitava mudanças pesadas de Ts'o desde a versão 0.10 [4]. Seu argumento de 2006 sobre o custo do estado compartilhado em microkernels é sério, a Microsoft usou o mesmo raciocínio no NT 4.0 [73], e ajuda a entender por que poucos sistemas de propósito geral seguiram esse caminho [50].

Onde Torvalds errou ou recuou

O "won't be big and professional" [10] ficou para a história como a previsão mais errada do tópico. A segunda é o "porting is impossible" de 1991 [10]: o kernel hoje tem documentação para dezesseis arquiteturas de processador [90]. Ele mesmo concedeu em 1992 que, do ponto de vista teórico, "linux looses" [1], e admitiu que a não portabilidade tinha ido "to an extreme" [1]. Em 2006, chamou de "flawed" a ideia de recarregar um serviço que falhou [50], e os experimentos do MINIX 3 e do Nooks mostram recuperação em mais de 99% das falhas de driver testadas [47], [43]. Em 2009, disse que o kernel estava "huge and bloated" [46]. E Tanenbaum tem razão quando diz que Torvalds creditou pouco os antecessores [6].

Conclusão: ótimo, não sagrado

Em 1992, um professor disse que o Linux era um passo de volta aos anos 1970, e um estudante respondeu que pelo menos estava disponível agora. Os dois tinham razão no que diziam, e cada um errou no que deixou de considerar.

O Linux merece o lugar que tem. Venceu porque estava pronto e livre de verdade em 1992, e porque aceitou contribuição de quem chegasse enquanto o MINIX recusava pedidos e o BSD estava no tribunal [6], [30]. Ganhar assim tem mérito, e foi assim que o software livre ganhou quase tudo o que ganhou.

Só que vencer não transforma o projeto em referência de arquitetura. O kernel Linux é monolítico, roda 26 milhões de linhas de drivers em modo kernel [75], e o próprio criador o chamou de inchado [46]. A crítica de Tanenbaum à confiabilidade continua de pé, e as respostas mais fortes a ela vieram de fora do Linux: o seL4 provado correto [84], o MINIX 3 recarregando drivers [47], o L4 nos modems [51], o UMDF do Windows [74] e o DriverKit da Apple [57]. O Linux respondeu à crítica do jeito dele, com FUSE, VFIO, eBPF e, agora, Rust [19], [20], [71], [83]. São respostas boas, mas não são a resposta que Tanenbaum pediu.

O crítico que chama o Linux de cópia do MINIX precisa ler o que o autor do MINIX escreveu: "the code was his" [6]. O devoto que acha que o Linux inventou tudo precisa ler as notas de lançamento do FreeBSD 4.0, o artigo do DTrace e o white paper do NT [59], [67], [73]. Os dois precisam ler o tópico de 1992 inteiro. Ali, Torvalds concorda que microkernels "are nicer" [1], e Tanenbaum diz que não está infeliz com o Linux [1].

Gosto de Linux. Uso todo dia, e continuo usando. Mas um kernel é ferramenta, e ferramenta a gente avalia pelo que os documentos mostram, não pela fé de quem a usa.

Fontes

Cada fonte abaixo foi lida (texto completo ou trecho relevante) durante a pesquisa. Sob cada referência está o que ela sustenta neste artigo. As citações são literais, e os horários históricos estão em GMT, como aparecem nos cabeçalhos originais.

  1. [1]A. S. Tanenbaum e L. Torvalds, “LINUX is obsolete,” mensagens no grupo comp.os.minix, 29 jan. 1992, arquivadas pelo Linux Information Project. [Online]. Disponível em: https://www.linfo.org/obsolete.html ↩
    • Post de Tanenbaum de 29/01/1992 (12:12:50 GMT): "a giant step back into the 1970s", "Microkernels have won", "the not-yet-released Windows/NT" como exemplo de microkernel, "LINUX is tied fairly closely to the 80x86. Not the way to go", "I think it is a gross error to design an OS for any specific architecture", "Don't get me wrong, I am not unhappy with LINUX", drivers do MINIX "in the kernel, but only because the brain-dead nature of the Intel CPUs", citação dos artigos de Rick Rashid sobre o Mach 3.0.
    • Resposta de Torvalds de 29/01/1992 (23:14:26 GMT): "True, linux is monolithic, and I agree that microkernels are nicer", "linux looses", "If the GNU kernel had been ready last spring...", "Linux wins heavily on points of being available now", "as conformant to standards as I knew how", "non-portability to an extreme", "brain-damages of minix", "doesn't suck like minix does".
    • Cabeçalho "Organization: Fac. Wiskunde & Informatica, Vrije Universiteit, Amsterdam".
  2. [2]ZDNet, “Linux Totally Dominates Supercomputers,” republicado por Linux.com, 15 nov. 2017. [Online]. Disponível em: https://www.linux.com/news/linux-totally-dominates-supercomputers-1/ ↩
    • "All 500 of the world's fastest supercomputers are running Linux" na lista TOP500 de novembro de 2017; os dois últimos sistemas fora do Linux rodavam AIX.
  3. [3]Android Open Source Project, “Kernel overview,” consultado em 4 out. 2026. [Online]. Disponível em: https://source.android.com/docs/core/architecture/kernel ↩
    • "The Android kernel is based on an upstream Linux Long Term Supported (LTS) kernel."
  4. [4]C. DiBona, S. Ockman e M. Stone (orgs.), “Appendix A: The Tanenbaum-Torvalds Debate,” em Open Sources: Voices from the Open Source Revolution. Sebastopol: O'Reilly, 1999. [Online]. Disponível em: https://www.oreilly.com/openbook/opensources/book/appa.html ↩
    • Tanenbaum, 30/01/1992 (13:44:34 GMT): "I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student...", "5 years from now everyone will be running free GNU on their 200 MIPS, 64M SPARCstation-5", MINIX feito para rodar em PC de 4,77 MHz sem disco; versão PC vendia 2 para 1.
    • Torvalds, "Apologies (was Re: LINUX is obsolete)", 30/01/1992 (15:38:16 GMT): "Apologies to ast", "I over-reacted", "some of the criticisms are valid", "my first, and hopefully last flamefest".
    • Introdução da O'Reilly chama o participante de "user-hacker Ken Thompson (one of the founders of Unix)"; cabeçalho da mensagem: "kt4@prism.gatech.EDU (Ken Thompson)", "Organization: Georgia Institute of Technology", 03/02/1992; citação "microkernels are probably the wave of the future... easier to implement a monolithic kernel...".
    • Tobin: "I find the single-threaded file system a serious pain when using Minix"; Tanenbaum: "A multithreaded file system is only a performance hack".
    • Torvalds, 31/01/1992: "you automatically get a multithreaded kernel", "linux API is portable", fonte completa de cerca de 200 kB contra mais de 800 kB do i386.tar.Z do Mach, "minix is portable, but you can rewrite that as 'doesn't use any features'"; resposta sobre o professor de Helsinque ("the person here at the university that teaches OS design").
    • Outros participantes: Ts'o ("is probably not much more than what is in a Minix implementation", "Linux is here, and GNU isn't", "ipso facto micro kernels must be the right approach"); Hedrick ("availability wins out over technical quality every time", "all they could distribute were diffs", "4.4's release date has a history of extreme slippage"); Graham ("about 12000 lines of code", "adding features is a royal pain"); Foard ("significantly slower"); Tanenbaum ("I AM NOT A THEORIST", QNX com 200.000 sistemas, "proven technology"); Miller; Haardt ("why I think AST is right"); Burns ("Linux will be obsolete"); Kevin Brown ("years of experience with monolithic kernels").
    • "Unhappy campers" (03/02/1992): "10 messages from the 43,000 readers", MINIX a US$ 169, Coherent a US$ 99, 4.4BSD a US$ 800, "100% emotional", "Surely Linus' OS professor pointed this out"; Tanenbaum (05/02): "as easy as herding cats", "has never managed a software project"; Torvalds (06/02): "I won't.", lista "linux-kernel", Ts'o com "some heavy changes even to 0.10". Apêndice com 36 mensagens.
  5. [5]L. Torvalds, “linux-0.01.tar.gz,” código-fonte do Linux 0.01, set. 1991, arquivo histórico do kernel.org (contagem de arquivos e linhas feita pelo autor). [Online]. Disponível em: https://cdn.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz ↩
    • Contagem feita por mim com o tarball baixado em 4 out. 2026: 88 arquivos; arquivos .c, .h e .s somam 9.877 linhas; datas dos arquivos entre 15 jun. e 17 set. 1991, 60 deles entre 11 e 17 set. kernel/ 3.511 linhas; mm/memory.c + mm/page.s 298 linhas; fs/ 2.771 linhas.
    • include/linux/sys.h: 67 entradas na tabela de syscalls, de sys_setup a sys_setsid; kernel/sys.c: 15 funções que só devolvem -ENOSYS (entre elas sys_mount, sys_umount, sys_rename, sys_mknod, sys_ptrace).
    • include/linux/config.h: LINUS_HD, LASU_HD, "Amount of ram memory (in bytes, 640k-1M not discounted). Currently 8Mb". include/linux/sched.h: NR_TASKS 64, HZ 100, macro switch_to com ljmp para o TSS.
    • Makefile: "chmem +65000 tools/build" e "If you don't have '-mstring-insns' in your gcc (and nobody but me has :-)". include/linux/fs.h: números de dispositivo "same as minix, so we can use the minix file system", NAME_LEN 14, SUPER_MAGIC 0x137F.
  6. [6]A. S. Tanenbaum, “Some Notes on the 'Who wrote Linux' Kerfuffle,” Vrije Universiteit, 20 maio 2004. [Online]. Disponível em: https://www.cs.vu.nl/~ast/brown/ ↩
    • Data: 20 de maio de 2004. Livro Operating Systems: Design and Implementation com o código do MINIX em 1987; disquetes por US$ 69 na Prentice Hall; boilerplate não aplicado a universidades/estudantes; 40.000 assinantes no comp.os.minix; 200 e-mails por dia, "No."; "everyone was trying to turn MINIX into a production-quality UNIX system...".
    • O processo contra a BSDi "gave Linux the breathing space it needed to catch on"; Brown voou a Amsterdã em 23/03/2004; "AST: Is Microsoft one of them? KB: We have multiple funding sources".
    • "He had my book, was running MINIX... But the code was his. The proof of this is that he messed the design up"; "Linus rewrote the whole thing as a big monolithic kernel"; "pretty good proof that it was a redesign"; QNX como "commercially successful microkernel"; crítica à atribuição: "Linus has done this far less than he should have... Ken and Dennis are the real heros"; "I met him once"; "My only regret is that he didn't develop Linux based on the microkernel technology of MINIX".
  7. [7]The Open Group, “UNIX 03: Apple Inc., macOS version 26.0 Tahoe on Apple silicon-based Mac computers,” registro de 29 ago. 2025. [Online]. Disponível em: https://www.opengroup.org/openbrand/register/brand3725.htm ↩
    • macOS 26.0 Tahoe registrado como UNIX 03 em 29-Aug-2025 (Apple Silicon; há registro equivalente para Intel); o registro nomeia o produto macOS, não o kernel.
  8. [8]Microsoft, “User Mode and Kernel Mode,” Windows drivers, Microsoft Learn, consultado em 4 out. 2026. [Online]. Disponível em: https://learn.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode ↩
    • "All code that runs in kernel mode shares a single virtual address space... If a kernel-mode driver crashes, it causes the entire operating system to crash."
  9. [9]FreeBSD Project, “jail(8),” FreeBSD System Manager's Manual, consultado em 4 out. 2026. [Online]. Disponível em: https://man.freebsd.org/cgi/man.cgi?query=jail&sektion=8 ↩
    • "The jail utility appeared in FreeBSD 4.0."
  10. [10]L. Torvalds, “LINUX's History,” 31 jul. 1992, com as mensagens de 1991 no grupo comp.os.minix (25 ago., resposta a J. Kuoppala em 26 ago., anúncio da versão 0.02 em 5 out.). [Online]. Disponível em: https://www.cs.cmu.edu/~awb/linux.history.html ↩
    • Post de 25/08/1991 (20:57:08 GMT), Organization: University of Helsinki: "just a hobby, won't be big and professional like gnu", "my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons)", "it's free of any minix code", "It is NOT protable".
    • Resposta a Jyrki Kuoppala (26/08/1991): "Simply, I'd say that porting is impossible. It's mostly in C, but most people wouldn't call what I write C. It uses every conceivable feature of the 386 I could find, as it was also a project to teach me about the 386"; segmentos de 64 MB, máximo de 64 tarefas em 4 GB; "almost as much assembler as C"; "a porters nightmare"; "except maybe for the user-mode filesystems".
    • Texto de julho de 1992: "0.01 sources weren't actually runnable", "0.01 didn't actually come with any binaries".
    • Anúncio da 0.02 (05/10/1991), "Free minix-like kernel sources for 386-AT": "Do you pine for the nice days of minix-1.1, when men were men and wrote their own device drivers?", "no minix code has been used", "These sources still need minix-386 to be compiled", "Hurd will be out in a year (or two, or next month, who knows)".
  11. [11]M. Linksvayer, “The Choice of a GNU Generation: An Interview With Linus Torvalds,” Meta Magazine, nov. 1993. [Online]. Disponível em: https://gondwanaland.com/meta/history/interview.html ↩
    • Torvalds: "If 386BSD had been available when I started on Linux, Linux would probably never had happened."
  12. [12]The Open Group, “UNIX 03: Huawei Technology Co., Ltd., Huawei EulerOS 2.0 on Huawei KunLun Mission Critical Server,” registro de 8 set. 2016. [Online]. Disponível em: https://www.opengroup.org/openbrand/register/brand3622.htm ↩
    • Huawei EulerOS 2.0 on Huawei KunLun Mission Critical Server, UNIX 03, "Registered on: 8-Sep-2016"; certificado P1204 com renovação em 8 set. 2022. (O comunicado da Huawei fala em 2019; o artigo usa a data do registro.)
  13. [13]G. Kroah-Hartman, “The Linux Kernel Driver Interface,” documentação do kernel Linux, consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/process/stable-api-nonsense.html ↩
    • "this article describes the in kernel interfaces, not the kernel to userspace interfaces"; syscall interface "is very stable over time, and will not break"; programas pré-0.9 rodando no 2.6; pelo menos três reformas da pilha USB; "function names may change, structures may grow or shrink"; "trying to keep up with an ever changing kernel interface is also a rough job"; "good luck, you are on your own here, you leech".
  14. [14]J. Liedtke, “Improving IPC by Kernel Design,” em Proc. 14th ACM Symp. on Operating Systems Principles (SOSP 1993), Asheville, 1993. [Online]. Disponível em: https://os.itec.kit.edu/downloads/improving-ipc.pdf ↩
    • 486-DX50: mínimo teórico de 172 ciclos (3,5 µs), meta de 350, resultado de 250 ciclos (5 µs); ganho sobre o Mach "from a factor of 22 (8-byte messages) to 3 (4-Kbyte messages)"; mach_thread_self a 18 µs contra 2 µs de ida e volta mínima ao kernel.
  15. [15]H. Härtig, M. Hohmuth, J. Liedtke et al., “The Performance of µ-Kernel-Based Systems,” 16th ACM Symposium on Operating Systems Principles (SOSP), Saint-Malo, out. 1997. [Online]. Disponível em: https://os.inf.tu-dresden.de/pubs/sosp97/ ↩
    • SOSP 1997: "For L4Linux, the AIM benchmarks report a maximum throughput which is only 5% lower than that of native Linux. The corresponding penalty is 5 times higher for a co-located in-kernel version of MkLinux, and 7 times higher for a user-level version of MkLinux"; MkLinux sobre microkernel derivado do Mach.
  16. [16]Apple, “Kernel Architecture Overview,” Kernel Programming Guide (arquivo de documentação), consultado em 4 out. 2026. [Online]. Disponível em: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Architecture/Architecture.html ↩
    • "OS X uses the term kernel somewhat differently than you might expect"; "The OS X kernel environment includes the Mach kernel, BSD, the I/O Kit, file systems, and networking components"; KEXTs carregadas "into kernel space"; drivers do I/O Kit implementados como KEXTs.
  17. [17]Apple Inc., “Mach Overview,” em Kernel Programming Guide, Documentation Archive, consultado em 4 out. 2026. [Online]. Disponível em: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Mach/Mach.html ↩
    • Tasks: "units of resource ownership; each task consists of a virtual address space, a port right namespace, and one or more threads"; Ports: "Secure, simplex communication channels, accessible only via send and receive capabilities (known as port rights)"; "At the trap level, the interface to most Mach abstractions consists of messages sent to and from kernel ports"; mach_msg_overwrite_trap; MIG.
    • "in OS X, Mach is linked with other kernel components into a single kernel address space. This is primarily for performance; it is much faster to make a direct call between linked components than it is to send messages or do remote procedure calls (RPC) between separate tasks"; "Mach is not primarily a communication hub between clients and servers".
  18. [18]M. Kerrisk (ed.), “cgroups(7),” Linux manual page, consultado em 4 out. 2026. [Online]. Disponível em: https://man7.org/linux/man-pages/man7/cgroups.7.html ↩
    • "The initial release of the cgroups implementation was in Linux 2.6.24."
  19. [19]The Linux Kernel documentation, “FUSE Overview,” consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/filesystems/fuse/fuse.html ↩
    • "A filesystem in which data and metadata are provided by an ordinary userspace process"; "FUSE is a userspace filesystem framework. It consists of a kernel module (fuse.ko), a userspace library (libfuse.*) and a mount utility (fusermount)"; "One of the most important features of FUSE is allowing secure, non-privileged mounts [...] A good example is sshfs"; "The filesystem daemon is running with the privileges of the mounting user"; a conexão "exists until either the daemon dies, or the filesystem is umounted".
  20. [20]The Linux Kernel documentation, “VFIO - ‘Virtual Function I/O’,” consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/driver-api/vfio.html ↩
    • "an IOMMU/device agnostic framework for exposing direct device access to userspace, in a secure, IOMMU protected environment"; "safe, non-privileged, userspace drivers"; "turns the VM into a userspace driver"; UIO "has no notion of IOMMU protection, limited interrupt support, and requires root privileges to access things like PCI configuration space".
  21. [21]The Linux Kernel documentation, “Extensible Scheduler Class,” consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/scheduler/sched-ext.html ↩
    • "a scheduler class whose behavior can be defined by a set of BPF programs"; "The system integrity is maintained no matter what the BPF scheduler does. The default scheduling behavior is restored anytime an error is detected, a runnable task stalls, or on invoking the SysRq key sequence SysRq-S".
  22. [22]A. S. Tanenbaum, “An Open Letter to Intel,” Vrije Universiteit, nov. 2017. [Online]. Disponível em: https://www.cs.vu.nl/~ast/intel/. Cópia do Internet Archive de 7 nov. 2017: https://web.archive.org/web/20171107134506/http://www.cs.vu.nl/~ast/intel/ ↩
    • Carta a "Mr. Krzanich": MINIX "inside the ME-11 management engine chip"; "the most widely used computer operating system in the world"; "The L4 microkernel has been running inside smartphone chips for years"; "apparently an older version of MINIX was used... Military-grade security was never a goal"; "that is Intel's business decision and a separate issue from the code it runs". Cópia mais antiga no Internet Archive: 7 nov. 2017.
  23. [23]A. S. Tanenbaum, “MINIX is now available under the BSD license,” mensagem no grupo comp.os.minix, 7 abr. 2000, reproduzida no FAQ do MINIX. [Online]. Disponível em: https://minix1.woodhull.com/faq/mxlicense.html ↩
    • Tanenbaum, 07/04/2000: "Better late than never. I finally got permission from Prentice Hall to change the MINIX license to the BSD license. The lawyers sort of sat on this for two years."
  24. [24]kernel.org, “Index of /pub/linux/kernel/v1.0/,” consultado em 4 out. 2026. [Online]. Disponível em: https://cdn.kernel.org/pub/linux/kernel/v1.0/ ↩
    • Arquivos do Linux 1.0 datados de 13-Mar-1994.
  25. [25]A. S. Tanenbaum et al., código-fonte do MINIX 2.0.4 (kernel/proc.c, kernel/table.c, include/minix/type.h, fs/const.h), redistribuição não oficial “Minix QD” mantida por D. Given. [Online]. Disponível em: https://github.com/davidgiven/minix2 ↩
    • kernel/proc.c: "The only system calls that exist in MINIX are sending and receiving messages. These are done by trapping to the kernel with an INT instruction"; mini_send copia direto se o destino espera, senão bloqueia o remetente numa fila; detecção de deadlock com ELOCKED; "User processes are only allowed to send to FS and MM".
    • include/minix/type.h: message como união de mess_1 a mess_6, com m_source e m_type. lib/i386/rts/_sendrec.s: _send, _receive, _sendrec com int SYSVEC (33).
    • kernel/table.c: tarefas TTY, DP8390, RTL8139, Sound Blaster, impressora, discos, disquete, memória, relógio e SYSTEM compiladas no kernel; MM, FS e INIT como processos.
    • fs/const.h: SUPER_MAGIC 0x137F. commands/simple/chmem.c: "Author: Andy Tanenbaum".
  26. [26]L. Torvalds, “RELEASE NOTES for Linux v0.01,” set. 1991. [Online]. Disponível em: https://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.01 ↩
    • "uses no code from minix or other sources"; "you currently need minix to bootstrap the system"; licença original: "(C) 1991 Linus Torvalds... Full source must be available (and free)".
  27. [27]R. Card, T. Ts'o e S. Tweedie, “Design and Implementation of the Second Extended Filesystem,” Proceedings of the First Dutch International Symposium on Linux, ISBN 90-367-0385-9. [Online]. Disponível em: https://web.mit.edu/tytso/www/linux/ext2intro.html ↩
    • Linux "cross-developed under the Minix operating system"; suporte ao FS do MINIX para compartilhar discos; FS do MINIX "efficient and relatively bug-free"; limites de 64 MB e 14 caracteres; Extended File System em abril de 1992 no 0.96c, com 2 GB e 255 caracteres.
  28. [28]L. Torvalds, “RELEASE NOTES for Linux v0.12,” 1992. [Online]. Disponível em: https://www.kernel.org/pub/linux/kernel/Historic/old-versions/RELNOTES-0.12 ↩
    • Troca para a GPL: "make it compatible with the GNU copyleft, removing the 'you may not distribute it for money' condition. I agree"; vale a partir de 1º de fevereiro.
  29. [29]GNU Project, “History,” página do GNU Hurd, cópia do Internet Archive de 2024. [Online]. Disponível em: https://web.archive.org/web/2024/https://www.gnu.org/software/hurd/history.html ↩
    • Hurd sobre Mach como kernel oficial do GNU a partir de nov. 1991; GNU Hurd 0.1 em 1996-09-06; GNU 0.2 em 1997-06-16.
  30. [30]M. K. McKusick, “Twenty Years of Berkeley Unix: From AT&T-Owned to Freely Redistributable,” em Open Sources. Sebastopol: O'Reilly, 1999. [Online]. Disponível em: https://www.oreilly.com/openbook/opensources/book/kirkmck.html ↩
    • BSDi vendendo a partir de janeiro de 1992 por US$ 995, telefone 1-800-ITS-Unix; processo da USL contra a BSDi e depois a Universidade da Califórnia; audiência de liminar em dezembro de 1992, negada cerca de seis semanas depois; acordo em janeiro de 1994 (três arquivos removidos de 18.000); 4.4BSD-Lite em junho de 1994; BSDI, NetBSD e FreeBSD tiveram de recomeçar a partir dele.
  31. [31]L. Jolitz, “386BSD Release 0.1 Released on Bastille Day is Thirty-Three Years Old Today,” Lynne's Take on Tech, 14 jul. 2025. [Online]. Disponível em: https://lynnesblog.telemuse.net/2025/07/14/386bsd-release-0-1-released-on-bastille-day-is-thirty-three-years-old-today/ ↩
    • 386BSD 0.0 em março de 1992, depois da série no Dr. Dobb's Journal; 386BSD 0.1 em 14 de julho de 1992.
  32. [32]The NetBSD Project, “The History of the NetBSD Project,” consultado em 4 out. 2026. [Online]. Disponível em: https://www.netbsd.org/about/history.html ↩
    • NetBSD 0.8 lançado em 20 de abril de 1993; projeto fundado em 1993 a partir do 386BSD.
  33. [33]The FreeBSD Documentation Project, “Chapter 1. Introduction,” em FreeBSD Handbook, consultado em 4 out. 2026. [Online]. Disponível em: https://docs.freebsd.org/en/books/handbook/introduction/ ↩
    • Origem no "Unofficial 386BSD Patchkit" no começo de 1993; FreeBSD 1.0 em dezembro de 1993 sobre a Net/2; acordo USL/Novell; prazo até o fim de julho de 1994 para parar de distribuir o produto Net/2; 4.4BSD-Lite como nova base; FreeBSD 2.0 em dezembro de 1994 (novembro para refazer o sistema).
  34. [34]K. Brown e J. Orndorff, “Samizdat: And Other Issues Regarding the 'Source' of Open Source Code,” Alexis de Tocqueville Institution, 20 maio 2004. [Online]. Disponível em: https://www.itreview.org/documents/acrobat/040524.pdf ↩
    • Relatório de Kenneth Brown (presidente da AdTI) e Justin Orndorff, datado de 20 de maio de 2004, questionando a origem do código do Linux e o crédito a Torvalds.
  35. [35]A. S. Tanenbaum, “Tanenbaum-Torvalds Debate Part II,” Vrije Universiteit, 2006. [Online]. Disponível em: https://www.cs.vu.nl/~ast/reliable-os/ ↩
    • "Tanenbaum-Torvalds Debate Part II" (2006): "I met him once. He is a pleasant fellow and very smart..."; "Microsoft paid a guy named Ken Brown to write a book saying Linus stole Linux from my MINIX 1 system"; Mac OS X "sort of microkernelish... Since all of it runs in kernel mode... it is not a true microkernel"; lista QNX, Integrity, PikeOS, Symbian, L4Linux; "clearly I am not alone in seeing something in microkernels".
  36. [36]A. Toptygin, mensagem a A. S. Tanenbaum publicada em “Comparison of Linux Code with MINIX Code,” Vrije Universiteit, 2004. [Online]. Disponível em: https://www.cs.vu.nl/~ast/brown/codecomparison/ ↩
    • Mensagem de Alexey Toptygin: trabalho de consultoria para Ken Brown; resultados enviados em 17 de maio; "my analysis found no evidence whatsoever that any code was copied one way or the other"; Brown achava "clearly impossible for one person to write an OS".
  37. [37]A. Toptygin, “Source comparison of early linux and minix versions,” 2004. [Online]. Disponível em: https://www.cs.vu.nl/~ast/brown/codecomparison/alexey.html ↩
    • Comparou Linux 0.01, 0.11, 0.12 (e posteriores) com MINIX: "Only 4 actual similarities were found"; "the similarity was required by external factors (the C standard, the POSIX standard, the minix filesystem format)".
  38. [38]LinuxWorld News Desk, “Linus Torvalds Isn't the 'Father of Linux',” LinuxWorld, 17 maio 2004, cópia do Internet Archive de 10 jun. 2004. [Online]. Disponível em: https://web.archive.org/web/20040610132547/http://www.linuxworld.com:80/story/44841.htm ↩
    • E-mail de Torvalds à LinuxWorld, 17 de maio de 2004: "Ok, I admit it. I was just a front-man for the real fathers of Linux, the Tooth Fairy and Santa Claus"; Papai Noel finlandês com contatos na Universidade de Helsinque.
  39. [39]Association for Computing Machinery, “Andrew S Tanenbaum: ACM Software System Award 2023,” consultado em 4 out. 2026. [Online]. Disponível em: https://awards.acm.org/award_winners/tanenbaum_1309681 ↩
    • ACM Software System Award 2023: "For MINIX, which influenced the teaching of Operating Systems principles to multiple generations of students and contributed to the design of widely used operating systems, including Linux."
  40. [40]J. Kara, “[PATCH v2] reiserfs: Deprecate reiserfs,” mensagem na lista reiserfs-devel, fev. 2022, arquivada pela LWN. [Online]. Disponível em: https://lwn.net/Articles/886142/ ↩
    • Jan Kara (endereço suse), fev. 2022: "development has ceased quite some years ago... To reduce maintenance burden... schedule its removal to 2025".
  41. [41]Phoronix, “ReiserFS Has Been Deleted From The Linux Kernel,” consultado em 4 out. 2026. [Online]. Disponível em: https://www.phoronix.com/news/ReiserFS-Deleted-Linux-6.13 ↩
    • ReiserFS removido no Linux 6.13; cerca de 32,8 mil linhas.
  42. [42]A. Chou, J. Yang, B. Chelf, S. Hallem e D. Engler, “An Empirical Study of Operating Systems Errors,” 18th ACM Symposium on Operating Systems Principles (SOSP), 2001. [Online]. Disponível em: https://web.stanford.edu/~engler/metrics-sosp-01.pdf ↩
    • Análise estática do Linux e do OpenBSD; no Linux 2.4.1 "the vast majority of bugs are in drivers"; drivers com taxa de erro de 3 a 7 vezes a do resto do kernel; "almost seven times higher" no verificador de travas.
  43. [43]M. M. Swift, B. N. Bershad e H. M. Levy, “Improving the Reliability of Commodity Operating Systems,” em Proc. 19th ACM Symp. on Operating Systems Principles (SOSP 2003), Bolton Landing, 2003. [Online]. Disponível em: https://swift.sites.cs.wisc.edu/classes/cs736-fa06/papers/nooks.pdf ↩
    • "In Windows XP, for example, drivers account for 85% of recently reported failures"; "Nooks recovered automatically from 99% of the faults that caused Linux to crash"; 2.000 testes de injeção; Nooks com cerca de 22.000 linhas contra 2,4 milhões do kernel; drivers continuam no anel 0, isolados por tabelas de páginas em domínios de proteção leves.
  44. [44]A. S. Tanenbaum, J. N. Herder e H. Bos, “Can We Make Operating Systems Reliable and Secure?,” IEEE Computer, v. 39, n. 5, maio 2006. [Online]. Disponível em: https://www.cs.vu.nl/~ast/Publications/Papers/computer-2006a.pdf ↩
    • Tanenbaum, Herder e Bos, IEEE Computer, maio 2006: 6 a 16 bugs por 1000 linhas; "Using a conservative estimate of 6 bugs per 1000 lines of code the Linux kernel probably has something like 15,000 bugs; Windows has at least double that".
    • MINIX 3: "The clock driver shares the microkernel's address space, but is scheduled as a separate process. No other drivers run in kernel mode"; kernel com 4.000 linhas e servidor de arquivos com 4.500; "fixed-length messages using the rendezvous principle"; notificações assíncronas por mapa de bits.
  45. [45]N. Palix, G. Thomas, S. Saha, C. Calvès, J. Lawall e G. Muller, “Faults in Linux: Ten Years Later,” em Proc. ASPLOS 2011, Newport Beach, 2011, pp. 305–318. [Online]. Disponível em: https://coccinelle.gitlabpages.inria.fr/website/papers/asplos11.pdf ↩
    • Estudo do 2.6.0 ao 2.6.33; kernel mais que dobrou, taxa de falhas caiu; drivers com staging = 57% do código desde o 2.6.30; taxa de falhas dos drivers "is now below that of other directories, such as arch (HAL) and fs (file systems)" e, desde o 2.6.19, "right at the average".
  46. [46]A. Modine, “Linus calls Linux 'bloated and huge',” The Register, 22 set. 2009. [Online]. Disponível em: https://www.theregister.com/2009/09/22/linus_torvalds_linux_bloated_huge/ ↩
    • LinuxCon, 21/09/2009 (publicado 22/09/2009): "We're getting bloated and huge. Yes, it's a problem"; "not the streamlined, small, hyper-efficient kernel that I envisioned 15 years ago...The kernel is huge and bloated, and our icache footprint is scary".
  47. [47]J. N. Herder, H. Bos, B. Gras, P. Homburg e A. S. Tanenbaum, “Failure Resilience for Device Drivers,” em Proc. 37th IEEE/IFIP Int. Conf. on Dependable Systems and Networks (DSN 2007), Edimburgo, 2007, pp. 41–50. [Online]. Disponível em: https://www.few.vu.nl/~ast/Publications/Papers/dsn-2007.pdf ↩
    • Funcionamento do servidor de reencarnação: utilitário service com binário, nome estável, privilégios, período de heartbeat e script de política; detecção de saída, pânico, exceção de CPU ou MMU, heartbeats perdidos; pedido de troca pelo servidor de arquivos; data store publicando o novo endpoint; reemissão de I/O de bloco pendente.
    • Experimentos: RTL8139 com wget de 512 MB, checksums corretos e perda de vazão de 25% a 1%; SATA lendo 1 GB, perda de 62% a 7%, mesmo SHA-1; DP8390 no Bochs, mais de 12.500 falhas injetadas, 347 travamentos detectáveis, "The subsequent recovery was successful in 100% of the induced failures"; mais de 99% no hardware real; cinco linhas alteradas na biblioteca de drivers.
    • Limites: falhas bizantinas, corrupção silenciosa, bugs determinísticos, hardware quebrado; "In general, end-to-end checksums are required to prevent silent" corruption. DMA: "To perform DMA safely a driver should first request the kernel to set up the I/O MMU".
  48. [48]MINIX 3 Wiki, “Frequently Asked Questions,” consultado em 4 out. 2026. [Online]. Disponível em: https://wiki.minix3.org/doku.php?id=faq ↩
    • "MINIX 3 is 5-10% slower" que o MINIX 2 (drivers em modo kernel); "our priority has been reliability, not performance"; licença BSD.
  49. [49]MINIX 3 Wiki, “Release notes 3.3.0,” consultado em 4 out. 2026. [Online]. Disponível em: https://wiki.minix3.org/doku.php?id=www:download:releasenotes-3.3.0 ↩
    • "In 2008, the European Research Council awarded Prof. Andrew S. Tanenbaum [...] an Advanced Grant of €2.5 million"; licença BSD; PC e ARM; "Userland is largely compatible with NetBSD and runs thousands of NetBSD packages".
  50. [50]L. Torvalds, “Hybrid (micro)kernels,” fórum Real World Technologies, 9 maio 2006. [Online]. Disponível em: https://www.realworldtech.com/forum/?threadid=65915&curpostid=65936 ↩
    • Torvalds, 09/05/2006: "The fundamental result of access space separation is that you can't share data structures... All your algorithms basically end up being distributed algorithms"; "As to the whole 'hybrid kernel' thing - it's just marketing".
  51. [51]G. Heiser e K. Elphinstone, “L4 Microkernels: The Lessons from 20 Years of Research and Deployment,” ACM Trans. on Computer Systems, vol. 34, n. 1, art. 1, abr. 2016. [Online]. Disponível em: https://trustworthy.systems/publications/nicta_full_text/8988.pdf ↩
    • "The typical cost for a one-way message was around 100 µs"; "a trend to move core services back into the kernel". Tabela de IPC: L4 de 1993 a 5 µs; seL4 de 2013 em Core i7 Haswell 3,4 GHz a 0,09 µs (301 ciclos); ARM11 532 MHz, 188 ciclos.
    • Qualcomm: "massive-scale commercial deployment when Qualcomm adopted it as a protected-mode real-time OS for the firmware of their wireless modem processors"; "running on the security processor of all recent Apple iOS devices"; nota 2: "Total deployment is now in the billions"; PikeOS "certified for use in safety-critical avionics and deployed in aircraft and trains".
    • Drivers: "make all device drivers user-level processes", exceto timer e controlador de interrupções; drivers não verificados no kernel "would obliterate any guarantees"; "even 9,000 SLOC pushed the limits of what was achievable".
  52. [52]J. Liedtke, “On µ-Kernel Construction,” em Proc. 15th ACM Symp. on Operating Systems Principles (SOSP 1995), Copper Mountain, 1995. [Online]. Disponível em: https://os.itec.kit.edu/downloads/publ_1995_liedtke_ukernel-construction.pdf ↩
    • Critério de minimalidade: "only if moving it outside the kernel, i.e. permitting competing implementations, would prevent the implementation of the system's required functionality"; "µ-kernels are inherently not portable. Instead, they are the processor dependent basis for portable operating systems".
  53. [53]A. S. Tanenbaum, “Followup statement on Ken Brown's motivation,” Vrije Universiteit, 21 maio 2004. [Online]. Disponível em: https://www.cs.vu.nl/~ast/brown/followup/ ↩
    • 21 de maio de 2004: "Microsoft claimed that Windows NT 3.51 was a microkernel. It wasn't. It wasn't even close. Even they dropped the claim with NT 4.0"; "I would easily give up 20% in performance for a system that was robust, reliable".
  54. [54]The Open Group, “UNIX 03: Apple Inc., macOS version 15.0 Sequoia on Apple silicon-based Mac computers,” registro de 12 set. 2024. [Online]. Disponível em: https://www.opengroup.org/openbrand/register/brand3710.htm ↩
    • macOS 15.0 Sequoia registrado como UNIX 03 em 12-Sep-2024.
  55. [55]Apple, “Apple Platform Security,” guia em PDF, consultado em 4 out. 2026. [Online]. Disponível em: https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf ↩
    • "The Secure Enclave Processor runs an Apple-customized version of the L4 microkernel."
  56. [56]Apple Inc., “XNU kernel,” README do repositório apple-oss-distributions/xnu, consultado em 4 out. 2026. [Online]. Disponível em: https://github.com/apple-oss-distributions/xnu ↩
    • "XNU is a hybrid kernel combining the Mach kernel developed at Carnegie Mellon University with components from FreeBSD and a C++ API for writing drivers called IOKit"; "osfmk - Mach kernel based subsystems"; "bsd - BSD subsystems code"; roda em x86_64 e ARM64.
  57. [57]Apple Inc., “DriverKit,” Apple Developer Documentation, consultado em 4 out. 2026. [Online]. Disponível em: https://developer.apple.com/documentation/driverkit ↩
    • "Develop device drivers that run in user space."; "The drivers you build with DriverKit run in user space, rather than as kernel extensions, which improves system stability and security".
  58. [58]Apple Inc., “Deprecated Kernel Extensions and System Extension Alternatives,” Apple Developer Support, consultado em 4 out. 2026. [Online]. Disponível em: https://developer.apple.com/support/kernel-extensions/ ↩
    • Extensões de kernel depreciadas; "Starting with macOS Big Sur, macOS releases no longer load kernel extensions that use deprecated KPIs by default".
  59. [59]FreeBSD Project, “FreeBSD 4.0 Announcement,” 14 mar. 2000. [Online]. Disponível em: https://www.freebsd.org/releases/4.0R/announce/ ↩
    • Anúncio do FreeBSD 4.0-RELEASE, 14 mar. 2000.
  60. [60]P.-H. Kamp e R. N. M. Watson, “Jails: Confining the omnipotent root,” 2nd International SANE Conference, 2000. [Online]. Disponível em: https://papers.freebsd.org/2000/phk-jails/ ↩
    • Kamp e Watson, 2000: jail "provides the ability to partition the operating system environment, while maintaining the simplicity of the UNIX 'root' model"; uso mais popular "providing virtual machine services in Internet Service Provider environments".
  61. [61]M. Kerrisk (ed.), “mount_namespaces(7),” Linux manual page, consultado em 4 out. 2026. [Online]. Disponível em: https://man7.org/linux/man-pages/man7/mount_namespaces.7.html ↩
    • Seção HISTORY: mount namespaces no Linux 2.4.19.
  62. [62]kernel.org, “Index of /pub/linux/kernel/v2.6/,” consultado em 4 out. 2026. [Online]. Disponível em: https://cdn.kernel.org/pub/linux/kernel/v2.6/ ↩
    • linux-2.6.24.tar.gz datado de 24-Jan-2008.
  63. [63]M. Kerrisk (ed.), “namespaces(7),” Linux manual page, consultado em 4 out. 2026. [Online]. Disponível em: https://man7.org/linux/man-pages/man7/namespaces.7.html ↩
    • "since Linux 3.8, no privilege is required to create a user namespace".
  64. [64]FreeBSD Documentation Project, “Chapter 23. The Z File System (ZFS),” FreeBSD Handbook, consultado em 4 out. 2026. [Online]. Disponível em: https://docs.freebsd.org/en/books/handbook/zfs/ ↩
    • ZFS "Originally developed at Sun Microsystems".
  65. [65]FreeBSD Project, “FreeBSD 7.0-RELEASE Release Notes,” 2008. [Online]. Disponível em: https://www.freebsd.org/releases/7.0R/relnotes/ ↩
    • "Support for Sun's ZFS has been added."
  66. [66]FreeBSD Project, “FreeBSD 7.0-RELEASE Announcement,” 27 fev. 2008. [Online]. Disponível em: https://www.freebsd.org/releases/7.0R/announce/ ↩
    • Anúncio do FreeBSD 7.0-RELEASE, 27 fev. 2008.
  67. [67]B. M. Cantrill, M. W. Shapiro e A. H. Leventhal, “Dynamic Instrumentation of Production Systems,” USENIX Annual Technical Conference, Boston, jun. 2004. [Online]. Disponível em: https://www.usenix.org/legacy/event/usenix04/tech/general/full_papers/cantrill/cantrill.pdf ↩
    • Cantrill, Shapiro e Leventhal (Solaris Kernel Development, Sun), USENIX 2004: DTrace instrumenta usuário e kernel "in a unified and absolutely safe fashion"; "zero probe effect".
  68. [68]FreeBSD Project, “FreeBSD 7.1-RELEASE Release Notes,” 2009. [Online]. Disponível em: https://www.freebsd.org/releases/7.1R/relnotes/ ↩
    • DTrace e dtrace(1) "have been imported from OpenSolaris".
  69. [69]FreeBSD Project, “FreeBSD 7.1-RELEASE Announcement,” 4 jan. 2009. [Online]. Disponível em: https://www.freebsd.org/releases/7.1R/announce/ ↩
    • Anúncio do FreeBSD 7.1-RELEASE, 4 jan. 2009.
  70. [70]FreeBSD Documentation Project, “DTrace,” FreeBSD Handbook, consultado em 4 out. 2026. [Online]. Disponível em: https://docs.freebsd.org/en/books/handbook/dtrace/ ↩
    • "DTrace... was developed by Sun™ as a tool for locating performance bottlenecks in production and pre-production systems."
  71. [71]Kernel Newbies, “Linux 3.18,” consultado em 4 out. 2026. [Online]. Disponível em: https://kernelnewbies.org/Linux_3.18 ↩
    • Lançamento em 7 dez. 2014; syscall bpf(): "eBPF programs are similar to kernel modules. They are loaded by the user process and automatically unloaded when process exits. [...] eBPF verifier statically determines that the program terminates and is safe to execute".
  72. [72]A. S. Tanenbaum, “Rebuttal to Ken Brown,” Vrije Universiteit, 6 jun. 2004. [Online]. Disponível em: https://www.cs.vu.nl/~ast/brown/rebuttal/ ↩
    • 6 de junho de 2004: David Cutler, "one of the principal architects of the operating system for the DEC VAX, VMS", contratado pela Microsoft para liderar o Windows NT; "Operating system designers of Cutler's quality are few and far between".
  73. [73]Microsoft, “MS Windows NT Kernel-mode User and GDI White Paper,” TechNet, arquivado no Microsoft Learn (Previous Versions), consultado em 4 out. 2026. [Online]. Disponível em: https://learn.microsoft.com/en-us/previous-versions/cc750820(v=technet.10) ↩
    • Camadas: HAL, "microkernel" (interrupções, DPCs, escalonamento, sincronização) e Executive; "From the start the Windows NT architecture has fallen squarely into the modified microkernel or macrokernel camp"; gerenciador de memória, cache, sistemas de arquivos, objeto/segurança, protocolos e servidor de rede e processos em modo kernel desde a primeira versão; Win32 como "application" privilegiada; USER e GDI no CSRSS.EXE no NT 3.51.
    • Motivos da mudança no NT 4.0: buffer compartilhado de 64K, trocas de contexto; transição cliente-servidor num Pentium 100 "in the order of 60-70 m seconds", contra "4 to 5 m seconds" para modo kernel (a página renderiza "µ" como "m"; leio como microssegundos, que é a única leitura compatível com a ordem de grandeza); economia de 256K a 1 MB de working set; PowerPoint 15 a 20 por cento mais rápido; drivers gráficos inteiros em modo kernel.
    • "No commercial operating system is based on a pure microkernel design. The reason is simple: the pure microkernel design is commercially impractical because it is too computationally expensive"; "What is the practical difference [...] between an operating system that crashes from time to time and one that continues running but loses all access to persistent storage?"; GDI do NT 3.51 falhando: "a system that appears to have crashed".
  74. [74]Microsoft, “Overview of UMDF,” Windows drivers, Microsoft Learn, atualizado em 15 dez. 2021. [Online]. Disponível em: https://learn.microsoft.com/en-us/windows-hardware/drivers/wdf/overview-of-the-umdf ↩
    • "UMDF drivers abstract hardware functionality, run in the user-mode environment"; processo hospedeiro, driver manager e reflector; "File system drivers, display drivers (...), and print drivers cannot be UMDF drivers".
  75. [75]The Linux Kernel Archives, “linux-7.2.tar.xz,” 17 ago. 2026 (contagem de arquivos e linhas feita pelo autor). [Online]. Disponível em: https://cdn.kernel.org/pub/linux/kernel/v7.x/ ↩
    • Contagem feita por mim em 4 out. 2026 sobre o tarball oficial (data no índice: 17-Aug-2026): 65.637 arquivos .c/.h/.S/.rs, 37.730.727 linhas; drivers/ 26.034.547 linhas (69,0%); arch/ 6,7%; sound/ 4,4%; fs/ 4,3%; kernel/ 1,5%; mm/ 0,6%; arquivos .rs 182.584 linhas (cerca de 0,5%). Na mesma data, o kernel.org listava 7.2.9 como estável (3 out. 2026) e 7.3-rc6 como mainline.
  76. [76]Kernel Newbies, “Linux 2.6.14,” consultado em 4 out. 2026. [Online]. Disponível em: https://kernelnewbies.org/Linux_2_6_14 ↩
    • Lançamento em 27 out. 2005; FUSE: "Allows to implement a fully functional filesystem in a userspace program".
  77. [77]H.-J. Koch, “The Userspace I/O HOWTO,” documentação do kernel Linux, 2006. [Online]. Disponível em: https://docs.kernel.org/driver-api/uio-howto.html ↩
    • UIO (documento de 2006-12-11): "bugs in your driver won't crash the kernel"; "updates of your driver can take place without recompiling the kernel"; rede, serial ou USB "are no candidates for an UIO driver".
  78. [78]Kernel Newbies, “Linux 3.6,” consultado em 4 out. 2026. [Online]. Disponível em: https://kernelnewbies.org/Linux_3.6 ↩
    • Lançamento em 30 set. 2012, com o VFIO.
  79. [79]The Linux Kernel documentation, “eBPF verifier,” consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/bpf/verifier.html ↩
    • "First step does DAG check to disallow loops and other CFG validation"; "Second step starts from the first insn and descends all possible paths. It simulates execution of every insn and observes the state change of registers and stack".
  80. [80]Kernel Newbies, “Linux 6.12,” consultado em 4 out. 2026. [Online]. Disponível em: https://kernelnewbies.org/Linux_6.12 ↩
    • Lançamento em 17 nov. 2024, com o sched_ext.
  81. [81]J. Corbet, “A first look at Rust in the 6.1 kernel,” LWN.net, 13 out. 2022. [Online]. Disponível em: https://lwn.net/Articles/910762/ ↩
    • Rust entrou no 6.1; "No system with a production 6.1 kernel will be running any Rust code".
  82. [82]J. Corbet, “The (successful) end of the kernel Rust experiment,” LWN.net, 10 dez. 2025. [Online]. Disponível em: https://lwn.net/Articles/1049831/ ↩
    • Consenso da Maintainers Summit de 2025: o Rust no kernel deixa de ser experimental e passa a ser parte central e permanente; a etiqueta "experimental" será removida. (A frase original tem travessão; o artigo parafraseia.)
  83. [83]J. Corbet, “The state of the kernel Rust experiment,” LWN.net, 13 dez. 2025. [Online]. Disponível em: https://lwn.net/Articles/1050174/ ↩
    • Ojeda: driver Nova com partes no mainline; "Android binder driver was merged for 6.18"; Android 16 com kernel 6.12 entregando o módulo ashmem em Rust: "So there are millions of real devices running kernels with Rust code now".
    • Kroah-Hartman: drivers em Rust "are indeed proving to be far safer than those written in C"; "no such CVE has yet been issued". Airlie: DRM "about a year away" de exigir Rust em drivers novos. Torvalds: "after nearly five years, the time had come".
  84. [84]G. Klein et al., “seL4: Formal Verification of an OS Kernel,” 22nd ACM Symposium on Operating Systems Principles (SOSP), out. 2009. [Online]. Disponível em: https://www.sigops.org/s/conferences/sosp/2009/papers/klein-sosp09.pdf ↩
    • seL4 "comprises 8,700 lines of C code and 600 lines of assembler"; "the first formal proof of functional correctness of a complete, general-purpose operating-system kernel"; "With truly small kernels it becomes possible... to guarantee the absence of bugs"; NICTA e UNSW.
    • Prova com 200.000 linhas de script Isabelle; "We have proved over 150 invariants"; kernel com custo total de 2,2 py incluindo Haskell; prova "in total about 20 py", seL4-specific "11 py"; regra de US$ 10 mil por linha para EAL6 daria "$87M for seL4"; bugs da segunda prova "mainly typos, misreading the specification, or failing to update all relevant code parts", suficientes para "crash the kernel or create security vulnerabilities".
  85. [85]J. Edge, “Replacing x86 firmware with Linux and Go,” LWN.net, 20 nov. 2017. [Online]. Disponível em: https://lwn.net/Articles/738649/ ↩
    • Jake Edge, 20/11/2017, sobre a palestra de Ronald Minnich (Google) na ELCE 2017 em Praga: "Ring -3... It runs MINIX 3 and is where the ME runs"; "year of MINIX 3 on the desktop"; pilhas IPv4/IPv6, sistemas de arquivos, drivers, servidores web; "can reimage the system even if the power is turned off".
  86. [86]M. Ermolov e M. Goryachy, “How to Hack a Turned-Off Computer, or Running Unsigned Code in Intel Management Engine,” Black Hat Europe 2017. [Online]. Disponível em: https://www.blackhat.com/eu-17/briefings.html#how-to-hack-a-turned-off-computer-or-running-unsigned-code-in-intel-management-engine ↩
    • Palestra de Mark Ermolov e Maxim Goryachy na Black Hat Europe 2017, "How to Hack a Turned-Off Computer, or Running Unsigned Code in Intel Management Engine" (citada só para a existência e o título da palestra).
  87. [87]MINIX 3, “What Is MINIX 3?,” consultado em 4 out. 2026. [Online]. Disponível em: https://www.minix3.org/ ↩
    • "designed to be highly reliable, flexible, and secure"; "a tiny microkernel running in kernel mode with the rest of the operating system running as a number of isolated, protected, processes in user mode".
  88. [88]MINIX 3 Wiki, “Features,” consultado em 4 out. 2026. [Online]. Disponível em: https://wiki.minix3.org/doku.php?id=www:documentation:features ↩
    • "Tiny microkernel that runs in kernel mode"; "Each device driver is a separate user-mode process"; "Reincarnation server can reload failed drivers".
  89. [89]Stichting MINIX Research Foundation, “minix: Official MINIX sources,” repositório no GitHub, tag v3.3.0 e commit 4db99f4 de 14 nov. 2018, consultado em 4 out. 2026. [Online]. Disponível em: https://github.com/Stichting-MINIX-Research-Foundation/minix ↩
    • Tag mais recente v3.3.0; último commit no ramo principal: 4db99f4, 14/11/2018 07:26 UTC (04:26 BRT), "Remove building with NOCRYPTO option".
  90. [90]The kernel development community, “CPU Architectures,” documentação do kernel Linux, consultado em 4 out. 2026. [Online]. Disponível em: https://docs.kernel.org/arch/index.html ↩
    • Lista de arquiteturas documentadas: ARC, ARM, ARM64, LoongArch, m68k, MIPS, Nios II, OpenRISC, PA-RISC, powerpc, RISC-V, s390, SuperH, Sparc, x86, Xtensa (16).

Itens checados que não entraram como fonte

  • Samizdat e financiamento da AdTI: a afirmação de que a Microsoft pagou Brown aparece no artigo só como afirmação de Tanenbaum [35]; não usei fontes secundárias (Wikipedia, Linux.com) para afirmá-la como fato.
  • QNX: a documentação oficial (QNX SDP 8.0, "The Philosophy of the QNX OS") foi consultada, mas a página acessível não descreve os drivers em espaço de usuário; o artigo cita o QNX só pelo que Tanenbaum escreveu.
  • GNU Hurd: gnu.org bloqueou acesso direto (403); usei a cópia do Internet Archive.
  • Just for Fun (L. Torvalds e D. Diamond, 2001): procurei o texto para citar trechos sobre 1991, mas o Internet Archive só oferece empréstimo restrito e a busca interna falhou. Não citei o livro. Usei como memória primária o texto do próprio Torvalds de julho de 1992 ("LINUX's History") [10].
  • Contagens de linhas do Linux 0.01 e do Linux 7.2 são minhas, feitas nos tarballs oficiais do kernel.org em 4 out. 2026 (arquivos .c, .h, .s/.S e .rs, linhas físicas, sem descontar comentários). Outras ferramentas (cloc, sloccount) dão números menores.
  • White paper do NT: a página do Microsoft Learn mostra "m seconds" onde o original usava o símbolo µ. Tratei como microssegundos.
  • QNX: não consegui baixar documentação de arquitetura que sustente afirmações próprias; o QNX aparece só pelas palavras de Tanenbaum e de Heiser e Elphinstone.
  • osr2006.pdf (artigo de Tanenbaum na ACM SIGOPS OSR, 2006) é um PDF escaneado sem camada de texto e não foi usado.