xref: /linux/Documentation/translations/pt_BR/process/stable-api-nonsense.rst (revision 14c897740388216acd59477a382de327d5e27ba4)
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