1*1b62fa92SLucas Adryell Ramalho.. SPDX-License-Identifier: GPL-2.0 2*1b62fa92SLucas Adryell Ramalho 3*1b62fa92SLucas Adryell RamalhoA interface de drivers do kernel Linux 4*1b62fa92SLucas Adryell Ramalho======================================= 5*1b62fa92SLucas Adryell Ramalho 6*1b62fa92SLucas Adryell Ramalho(todas as suas perguntas respondidas e mais algumas) 7*1b62fa92SLucas Adryell Ramalho 8*1b62fa92SLucas Adryell RamalhoGreg Kroah-Hartman <greg@kroah.com> 9*1b62fa92SLucas Adryell Ramalho 10*1b62fa92SLucas Adryell RamalhoEste texto foi escrito para tentar explicar por que o Linux **não possui uma 11*1b62fa92SLucas Adryell Ramalhointerface binária do kernel nem uma interface estável do kernel**. 12*1b62fa92SLucas Adryell Ramalho 13*1b62fa92SLucas Adryell Ramalho.. note:: 14*1b62fa92SLucas Adryell Ramalho 15*1b62fa92SLucas Adryell Ramalho Observe que este artigo descreve as interfaces **internas do kernel**, e não 16*1b62fa92SLucas Adryell Ramalho as interfaces entre o kernel e o espaço de usuário. 17*1b62fa92SLucas Adryell Ramalho 18*1b62fa92SLucas Adryell Ramalho A interface entre o kernel e o espaço de usuário é aquela utilizada pelos 19*1b62fa92SLucas Adryell Ramalho aplicativos: a interface de chamadas de sistema (syscalls). Essa 20*1b62fa92SLucas Adryell Ramalho interface é **muito** estável ao longo do tempo e não será quebrada. Tenho 21*1b62fa92SLucas Adryell Ramalho programas antigos, compilados em uma versão do kernel anterior à 0.9 e alguma 22*1b62fa92SLucas Adryell Ramalho coisa, que ainda funcionam perfeitamente na versão mais recente do kernel 23*1b62fa92SLucas Adryell Ramalho 2.6. Essa é a interface cuja estabilidade os usuários e desenvolvedores de 24*1b62fa92SLucas Adryell Ramalho aplicativos podem considerar garantida. 25*1b62fa92SLucas Adryell Ramalho 26*1b62fa92SLucas Adryell Ramalho 27*1b62fa92SLucas Adryell RamalhoResumo executivo 28*1b62fa92SLucas Adryell Ramalho---------------- 29*1b62fa92SLucas Adryell Ramalho 30*1b62fa92SLucas Adryell RamalhoVocê acha que quer uma interface estável do kernel, mas, na verdade, não quer, 31*1b62fa92SLucas Adryell Ramalhoe nem sabe disso. O que você realmente quer é um driver que continue 32*1b62fa92SLucas Adryell Ramalhofuncionando de maneira estável, e isso só é possível se o seu driver estiver 33*1b62fa92SLucas Adryell Ramalhona árvore principal do kernel. Você também obtém muitos outros benefícios se 34*1b62fa92SLucas Adryell Ramalhoo seu driver fizer parte da árvore principal do kernel. São esses benefícios 35*1b62fa92SLucas Adryell Ramalhoque ajudaram a tornar o Linux um sistema operacional tão robusto, estável e 36*1b62fa92SLucas Adryell Ramalhomaduro — justamente a razão pela qual você o está usando. 37*1b62fa92SLucas Adryell Ramalho 38*1b62fa92SLucas Adryell Ramalho 39*1b62fa92SLucas Adryell RamalhoIntrodução 40*1b62fa92SLucas Adryell Ramalho---------- 41*1b62fa92SLucas Adryell Ramalho 42*1b62fa92SLucas Adryell RamalhoApenas quem escreve drivers para o kernel precisa se preocupar com as mudanças 43*1b62fa92SLucas Adryell Ramalhonas interfaces internas do kernel. Para a grande maioria das pessoas, essas 44*1b62fa92SLucas Adryell Ramalhointerfaces nem sequer são visíveis e tampouco são motivo de preocupação. 45*1b62fa92SLucas Adryell Ramalho 46*1b62fa92SLucas Adryell RamalhoAntes de mais nada, não abordarei **nenhuma** questão jurídica relacionada a 47*1b62fa92SLucas Adryell Ramalhocódigo-fonte fechado, código-fonte oculto, blobs binários, wrappers de 48*1b62fa92SLucas Adryell Ramalhocódigo-fonte ou qualquer outro termo usado para descrever drivers do kernel 49*1b62fa92SLucas Adryell Ramalhocujo código-fonte não seja disponibilizado sob a GPL. Consulte um advogado 50*1b62fa92SLucas Adryell Ramalhocaso tenha alguma dúvida jurídica. Sou programador e, portanto, descreverei 51*1b62fa92SLucas Adryell Ramalhoaqui apenas as questões técnicas (isso não significa que as questões 52*1b62fa92SLucas Adryell Ramalhojurídicas sejam pouco importantes; elas são reais e você precisa estar sempre 53*1b62fa92SLucas Adryell Ramalhociente delas). 54*1b62fa92SLucas Adryell Ramalho 55*1b62fa92SLucas Adryell RamalhoPortanto, há dois tópicos principais: interfaces binárias do kernel e 56*1b62fa92SLucas Adryell Ramalhointerfaces estáveis de código-fonte do kernel. Ambos dependem um do outro, 57*1b62fa92SLucas Adryell Ramalhomas discutiremos primeiro a parte referente às interfaces binárias para 58*1b62fa92SLucas Adryell Ramalhodeixá-la de lado. 59*1b62fa92SLucas Adryell Ramalho 60*1b62fa92SLucas Adryell Ramalho 61*1b62fa92SLucas Adryell RamalhoInterface binária do kernel 62*1b62fa92SLucas Adryell Ramalho--------------------------- 63*1b62fa92SLucas Adryell Ramalho 64*1b62fa92SLucas Adryell RamalhoSupondo que tivéssemos uma interface estável de código-fonte para o kernel, 65*1b62fa92SLucas Adryell Ramalhouma interface binária surgiria naturalmente também, certo? Errado. Considere 66*1b62fa92SLucas Adryell Ramalhoos seguintes fatos sobre o kernel Linux: 67*1b62fa92SLucas Adryell Ramalho 68*1b62fa92SLucas Adryell Ramalho - Dependendo da versão do compilador C utilizada, diferentes estruturas de 69*1b62fa92SLucas Adryell Ramalho dados do kernel terão diferentes alinhamentos e poderão até mesmo incluir 70*1b62fa92SLucas Adryell Ramalho funções de maneiras distintas (por exemplo, tornando determinadas funções 71*1b62fa92SLucas Adryell Ramalho inline ou não). A organização das funções individuais não é tão importante, 72*1b62fa92SLucas Adryell Ramalho mas as diferenças no preenchimento das estruturas de dados são muito 73*1b62fa92SLucas Adryell Ramalho importantes. 74*1b62fa92SLucas Adryell Ramalho - Dependendo das opções selecionadas durante a compilação do kernel, uma 75*1b62fa92SLucas Adryell Ramalho grande variedade de comportamentos pode ser assumida pelo kernel: 76*1b62fa92SLucas Adryell Ramalho 77*1b62fa92SLucas Adryell Ramalho - diferentes estruturas podem conter campos diferentes; 78*1b62fa92SLucas Adryell Ramalho - algumas funções podem nem sequer ser implementadas (por exemplo, 79*1b62fa92SLucas Adryell Ramalho determinados bloqueios são completamente eliminados durante a 80*1b62fa92SLucas Adryell Ramalho compilação em kernels sem SMP); 81*1b62fa92SLucas Adryell Ramalho - a memória dentro do kernel pode ser alinhada de maneiras diferentes, 82*1b62fa92SLucas Adryell Ramalho dependendo das opções de compilação. 83*1b62fa92SLucas Adryell Ramalho - O Linux é executado em uma grande variedade de arquiteturas de 84*1b62fa92SLucas Adryell Ramalho processadores. Não há como drivers binários compilados para uma arquitetura 85*1b62fa92SLucas Adryell Ramalho funcionarem corretamente em outra. 86*1b62fa92SLucas Adryell Ramalho 87*1b62fa92SLucas Adryell RamalhoVários desses problemas podem ser contornados simplesmente compilando o módulo 88*1b62fa92SLucas Adryell Ramalhopara uma configuração específica e exata do kernel, utilizando exatamente o 89*1b62fa92SLucas Adryell Ramalhomesmo compilador C empregado na compilação do kernel. Isso é suficiente caso 90*1b62fa92SLucas Adryell Ramalhovocê queira fornecer um módulo para uma determinada versão de uma distribuição 91*1b62fa92SLucas Adryell RamalhoLinux específica. Porém, multiplique essa única compilação pelo número de 92*1b62fa92SLucas Adryell Ramalhodistribuições Linux existentes e pelo número de versões suportadas de cada 93*1b62fa92SLucas Adryell Ramalhodistribuição e você rapidamente terá um pesadelo de diferentes opções de 94*1b62fa92SLucas Adryell Ramalhocompilação em diferentes versões. Além disso, cada versão de uma distribuição 95*1b62fa92SLucas Adryell RamalhoLinux contém vários kernels, cada um ajustado para diferentes tipos de 96*1b62fa92SLucas Adryell Ramalhohardware (diferentes tipos de processadores e diferentes opções). Portanto, 97*1b62fa92SLucas Adryell Ramalhomesmo para uma única versão, você precisará criar várias versões do seu módulo. 98*1b62fa92SLucas Adryell Ramalho 99*1b62fa92SLucas Adryell RamalhoAcredite em mim: com o tempo, você enlouquecerá se tentar oferecer suporte a 100*1b62fa92SLucas Adryell Ramalhoesse tipo de distribuição. Aprendi isso da maneira mais difícil há muito 101*1b62fa92SLucas Adryell Ramalhotempo... 102*1b62fa92SLucas Adryell Ramalho 103*1b62fa92SLucas Adryell RamalhoInterfaces estáveis de código-fonte do kernel 104*1b62fa92SLucas Adryell Ramalho---------------------------------------------- 105*1b62fa92SLucas Adryell Ramalho 106*1b62fa92SLucas Adryell RamalhoEsse é um tópico um pouco mais "volátil" se você conversar com alguém que está 107*1b62fa92SLucas Adryell Ramalhotentando manter atualizado, ao longo do tempo, um driver do kernel Linux que 108*1b62fa92SLucas Adryell Ramalhonão está na árvore principal do kernel. 109*1b62fa92SLucas Adryell Ramalho 110*1b62fa92SLucas Adryell RamalhoO desenvolvimento do kernel Linux é contínuo e ocorre em ritmo acelerado, 111*1b62fa92SLucas Adryell Ramalhosem desacelerar. Por isso, os desenvolvedores do kernel encontram bugs nas 112*1b62fa92SLucas Adryell Ramalhointerfaces existentes ou descobrem maneiras melhores de fazer as coisas. 113*1b62fa92SLucas Adryell RamalhoQuando isso acontece, eles corrigem as interfaces atuais para que funcionem 114*1b62fa92SLucas Adryell Ramalhomelhor. Nesse processo, nomes de funções podem mudar, estruturas podem crescer 115*1b62fa92SLucas Adryell Ramalhoou diminuir e parâmetros de funções podem ser reformulados. Quando isso 116*1b62fa92SLucas Adryell Ramalhoacontece, todos os locais dentro do kernel que utilizam essa interface são 117*1b62fa92SLucas Adryell Ramalhocorrigidos ao mesmo tempo, garantindo que tudo continue funcionando 118*1b62fa92SLucas Adryell Ramalhocorretamente. 119*1b62fa92SLucas Adryell Ramalho 120*1b62fa92SLucas Adryell RamalhoComo exemplos específicos disso, as interfaces USB internas do kernel 121*1b62fa92SLucas Adryell Ramalhopassaram por pelo menos três reformulações diferentes ao longo da existência 122*1b62fa92SLucas Adryell Ramalhodesse subsistema. Essas reformulações foram feitas para resolver diversos 123*1b62fa92SLucas Adryell Ramalhoproblemas: 124*1b62fa92SLucas Adryell Ramalho 125*1b62fa92SLucas Adryell Ramalho - Uma mudança de um modelo síncrono de fluxos de dados para um modelo 126*1b62fa92SLucas Adryell Ramalho assíncrono. Isso reduziu a complexidade de vários drivers e aumentou a 127*1b62fa92SLucas Adryell Ramalho taxa de transferência de todos os drivers USB, de modo que atualmente 128*1b62fa92SLucas Adryell Ramalho executamos quase todos os dispositivos USB na maior velocidade possível. 129*1b62fa92SLucas Adryell Ramalho - Foi feita uma mudança na maneira como os pacotes de dados eram alocados 130*1b62fa92SLucas Adryell Ramalho pelos drivers USB a partir do núcleo USB, de modo que todos os drivers 131*1b62fa92SLucas Adryell Ramalho passaram a precisar fornecer mais informações ao núcleo USB, corrigindo 132*1b62fa92SLucas Adryell Ramalho diversos deadlocks documentados. 133*1b62fa92SLucas Adryell Ramalho 134*1b62fa92SLucas Adryell RamalhoIsso contrasta fortemente com vários sistemas operacionais de código fechado, 135*1b62fa92SLucas Adryell Ramalhoque tiveram de manter suas interfaces USB antigas ao longo do tempo. Isso 136*1b62fa92SLucas Adryell Ramalhopermite que novos desenvolvedores utilizem acidentalmente interfaces antigas 137*1b62fa92SLucas Adryell Ramalhoe façam as coisas de maneira inadequada, prejudicando a estabilidade do 138*1b62fa92SLucas Adryell Ramalhosistema operacional. 139*1b62fa92SLucas Adryell Ramalho 140*1b62fa92SLucas Adryell RamalhoEm ambos os casos, todos os desenvolvedores concordaram que essas eram 141*1b62fa92SLucas Adryell Ramalhomudanças importantes que precisavam ser feitas, e elas foram realizadas com 142*1b62fa92SLucas Adryell Ramalhorelativamente pouco esforço. Se o Linux tivesse de garantir a preservação de 143*1b62fa92SLucas Adryell Ramalhouma interface de código-fonte estável, uma nova interface teria de ser criada, 144*1b62fa92SLucas Adryell Ramalhoenquanto a interface antiga e defeituosa teria de continuar sendo mantida ao 145*1b62fa92SLucas Adryell Ramalholongo do tempo, resultando em trabalho adicional para os desenvolvedores USB. 146*1b62fa92SLucas Adryell RamalhoComo todos os desenvolvedores USB do Linux realizam esse trabalho em seu 147*1b62fa92SLucas Adryell Ramalhopróprio tempo, pedir que programadores façam trabalho extra, sem nenhum 148*1b62fa92SLucas Adryell Ramalhobenefício e gratuitamente, não é uma possibilidade. 149*1b62fa92SLucas Adryell Ramalho 150*1b62fa92SLucas Adryell RamalhoQuestões de segurança também são muito importantes para o Linux. Quando um 151*1b62fa92SLucas Adryell Ramalhoproblema de segurança é encontrado, ele é corrigido em um período muito curto. 152*1b62fa92SLucas Adryell RamalhoEm diversas ocasiões, isso fez com que interfaces internas do kernel fossem 153*1b62fa92SLucas Adryell Ramalhoreformuladas para impedir que o problema de segurança ocorresse. Quando isso 154*1b62fa92SLucas Adryell Ramalhoacontece, todos os drivers que utilizam essas interfaces também são corrigidos 155*1b62fa92SLucas Adryell Ramalhoao mesmo tempo, garantindo que o problema de segurança seja resolvido e não 156*1b62fa92SLucas Adryell Ramalhopossa reaparecer acidentalmente no futuro. Se as interfaces internas não 157*1b62fa92SLucas Adryell Ramalhopudessem ser alteradas, não seria possível corrigir esse tipo de problema de 158*1b62fa92SLucas Adryell Ramalhosegurança e garantir que ele não voltasse a ocorrer. 159*1b62fa92SLucas Adryell Ramalho 160*1b62fa92SLucas Adryell RamalhoAs interfaces do kernel são aprimoradas ao longo do tempo. Se ninguém estiver 161*1b62fa92SLucas Adryell Ramalhoutilizando uma determinada interface, ela é removida. Isso garante que o 162*1b62fa92SLucas Adryell Ramalhokernel permaneça o menor possível e que todas as interfaces existentes possam 163*1b62fa92SLucas Adryell Ramalhoser testadas da melhor maneira possível (é praticamente impossível testar 164*1b62fa92SLucas Adryell Ramalhoadequadamente a validade de interfaces que não são utilizadas). 165*1b62fa92SLucas Adryell Ramalho 166*1b62fa92SLucas Adryell Ramalho 167*1b62fa92SLucas Adryell RamalhoO que fazer 168*1b62fa92SLucas Adryell Ramalho----------- 169*1b62fa92SLucas Adryell Ramalho 170*1b62fa92SLucas Adryell RamalhoEntão, se você possui um driver do kernel Linux que não está na árvore 171*1b62fa92SLucas Adryell Ramalhoprincipal do kernel, o que você, como desenvolvedor, deve fazer? Distribuir 172*1b62fa92SLucas Adryell Ramalhoum driver binário para cada versão diferente do kernel em cada distribuição 173*1b62fa92SLucas Adryell Ramalhoé um pesadelo, e tentar acompanhar uma interface do kernel que está em 174*1b62fa92SLucas Adryell Ramalhoconstante mudança também é uma tarefa difícil. 175*1b62fa92SLucas Adryell Ramalho 176*1b62fa92SLucas Adryell RamalhoSimples: coloque seu driver na árvore principal do kernel (lembre-se de que 177*1b62fa92SLucas Adryell Ramalhoestamos falando aqui de drivers distribuídos sob uma licença compatível com 178*1b62fa92SLucas Adryell Ramalhoa GPL; se seu código não se enquadra nessa categoria, boa sorte, você está 179*1b62fa92SLucas Adryell Ramalhopor conta própria aqui, seu parasita). Se seu driver estiver na árvore e uma 180*1b62fa92SLucas Adryell Ramalhointerface do kernel mudar, ele será corrigido pela própria pessoa que realizou 181*1b62fa92SLucas Adryell Ramalhoa alteração no kernel. Isso garante que seu driver continue sempre compilável 182*1b62fa92SLucas Adryell Ramalhoe funcionando ao longo do tempo, exigindo muito pouco esforço de sua parte. 183*1b62fa92SLucas Adryell Ramalho 184*1b62fa92SLucas Adryell RamalhoOs excelentes efeitos colaterais de ter seu driver na árvore principal do 185*1b62fa92SLucas Adryell Ramalhokernel são: 186*1b62fa92SLucas Adryell Ramalho 187*1b62fa92SLucas Adryell Ramalho - A qualidade do driver aumentará, enquanto os custos de manutenção 188*1b62fa92SLucas Adryell Ramalho (para o desenvolvedor original) diminuirão. 189*1b62fa92SLucas Adryell Ramalho - Outros desenvolvedores adicionarão funcionalidades ao seu driver. 190*1b62fa92SLucas Adryell Ramalho - Outras pessoas encontrarão e corrigirão bugs no seu driver. 191*1b62fa92SLucas Adryell Ramalho - Outras pessoas encontrarão oportunidades de otimização no seu driver. 192*1b62fa92SLucas Adryell Ramalho - Outras pessoas atualizarão o driver para você quando mudanças em 193*1b62fa92SLucas Adryell Ramalho interfaces externas exigirem isso. 194*1b62fa92SLucas Adryell Ramalho - O driver será automaticamente distribuído por todas as distribuições 195*1b62fa92SLucas Adryell Ramalho Linux, sem que seja necessário pedir às distribuições que o adicionem. 196*1b62fa92SLucas Adryell Ramalho 197*1b62fa92SLucas Adryell RamalhoComo o Linux oferece suporte, "pronto para uso", a um número maior de 198*1b62fa92SLucas Adryell Ramalhodispositivos diferentes do que qualquer outro sistema operacional, e oferece 199*1b62fa92SLucas Adryell Ramalhosuporte a esses dispositivos em mais arquiteturas de processadores diferentes 200*1b62fa92SLucas Adryell Ramalhodo que qualquer outro sistema operacional, esse modelo comprovado de 201*1b62fa92SLucas Adryell Ramalhodesenvolvimento deve estar fazendo alguma coisa certa :) 202*1b62fa92SLucas Adryell Ramalho 203*1b62fa92SLucas Adryell Ramalho 204*1b62fa92SLucas Adryell Ramalho------ 205*1b62fa92SLucas Adryell Ramalho 206*1b62fa92SLucas Adryell RamalhoAgradecimentos a Randy Dunlap, Andrew Morton, David Brownell, Hanna Linder, 207*1b62fa92SLucas Adryell RamalhoRobert Love e Nishanth Aravamudan pela revisão e pelos comentários sobre 208*1b62fa92SLucas Adryell Ramalhoeste documento. 209