Você já ouviu falar do driver de sincronização do Windows NT proposto para o kernel Linux? Esse driver, que foi discutido na Linux Plumbers Conference do ano passado, visa melhorar o desempenho de alguns jogos e aplicativos do Windows rodando no Linux via Wine. Neste post, vamos explicar o que é esse driver, como ele funciona e quais são os benefícios que ele pode trazer.
O que é o driver de sincronização do Windows NT?
O driver de sincronização do Windows NT é um driver que expõe /dev/ntsync como um novo dispositivo de caractere para implementar alguns dos primitivos de sincronização do Windows NT diretamente no kernel Linux. Os primitivos de sincronização são mecanismos que permitem que vários processos ou threads coordenem suas ações e evitem conflitos de acesso a recursos compartilhados.
O Wine, o projeto que emula a API do Windows no espaço do usuário, usa esses primitivos para implementar algumas das funcionalidades do sistema operacional da Microsoft. No entanto, a forma como o Wine faz isso atualmente é ineficiente, pois envolve chamadas RPC (Remote Procedure Call) para um processo dedicado chamado “kernel”. Isso gera um gargalo de desempenho, especialmente para aplicações mais recentes que usam esses primitivos com mais frequência e intensidade.
O driver de sincronização do Windows NT propõe uma solução para esse problema, implementando os primitivos problemáticos diretamente no kernel Linux. Isso elimina a necessidade de RPC e reduz a sobrecarga de comunicação entre os processos. Além disso, o driver garante a correção semântica dos primitivos, pois alguns deles são muito complexos para serem implementados em cima de primitivos existentes sem sacrificar a fidelidade ao comportamento do Windows NT.
Como o driver funciona?
O driver funciona criando um novo dispositivo de caractere chamado /dev/ntsync, que pode ser aberto por processos que querem usar os primitivos de sincronização do Windows NT. O dispositivo aceita comandos ioctl para criar, manipular e esperar por objetos de sincronização, como eventos, mutexes, semáforos e timers. O dispositivo também aceita comandos mmap para mapear esses objetos na memória do processo.
O driver mantém uma lista encadeada de objetos de sincronização por cada descritor de arquivo aberto. Cada objeto tem um tipo, um estado e uma fila de espera. O tipo define as propriedades e operações possíveis sobre o objeto. O estado indica se o objeto está sinalizado ou não sinalizado. A fila de espera contém os processos ou threads que estão esperando pelo objeto.
Quando um processo quer criar um objeto de sincronização, ele envia um comando ioctl com o tipo e as opções desejadas. O driver aloca uma estrutura para o objeto, inicializa seus campos e adiciona-o à lista encadeada do descritor de arquivo. O driver retorna ao processo um identificador único para o objeto, que pode ser usado em comandos subsequentes.
Quando um processo quer manipular um objeto de sincronização, ele envia um comando ioctl com o identificador e a operação desejada. O driver localiza o objeto na lista encadeada e executa a operação correspondente. Por exemplo, se a operação for sinalizar um evento, o driver muda o estado do objeto para sinalizado e acorda todos os processos ou threads na fila de espera.
Quando um processo quer esperar por um ou mais objetos de sincronização, ele envia um comando ioctl com os identificadores e o modo de espera desejado. O driver localiza os objetos na lista encadeada e verifica seus estados. Se algum dos objetos estiver sinalizado, o driver retorna imediatamente ao processo indicando qual objeto foi satisfeito. Se nenhum dos objetos estiver sinalizado, o driver coloca o processo ou thread na fila de espera de cada objeto e bloqueia sua execução até que algum dos objetos seja sinalizado ou ocorra um timeout.
Quais são os benefícios do driver?
O principal benefício do driver é melhorar o desempenho de alguns jogos e aplicativos do Windows rodando no Linux via Wine. Segundo Elizabeth Figura, da CodeWeavers, que publicou o patch RFC (Request For Comments) para várias listas de discussão do kernel Linux, o driver pode trazer ganhos de desempenho que variam de 21% com Metro 2033 a até 678% com DiRT 3! Em alguns casos, o driver pode ajudar jogos a rodarem mais de 100% mais rápido.
Esses números são impressionantes e mostram o potencial do driver para tornar o Linux uma plataforma mais atraente para os usuários de jogos e aplicativos do Windows. Além disso, o driver pode abrir caminho para outras melhorias na compatibilidade e na experiência do Wine, como reduzir os bugs, os travamentos e as distorções gráficas.
O driver ainda está em fase de desenvolvimento e precisa de revisões e testes antes de ser aceito no kernel Linux principal. No entanto, é possível que ele seja incluído no kernel do SteamOS, o sistema operacional da Valve baseado no Linux e voltado para jogos. Se você quiser saber mais sobre o driver, você pode conferir o patch RFC e a apresentação da LPC 2023 neste link.