Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do núcleo Linux 6.18. Entre as mudanças mais notáveis estão: dm-pcache para cache de disco na memória não volátil (PMEM), remoção do Bcachefs, modo online de verificação do XFS, drivers Binder (Android IPC) e Tyr (GPU Mali) em Rust, possibilidade de criação de drivers USB em Rust, otimização do cache no alocador de memória SLUB, endereçamento de espaços de nomes por meio de descritores de arquivo, aceleração do swap, verificação de programas BPF por assinatura digital, virtualização Intel CET no KVM, protocolo de rede PSP (híbrido TLS e IPsec), suporte à extensão IP AccECN, otimização da pilha UDP.
A nova versão inclui 15.035 correções de 2.217 desenvolvedores, com o tamanho do patch sendo 45 MB (as mudanças afetaram 13.142 arquivos, foram adicionadas 601.897 linhas de código e removidas 355.006 linhas). Na versão anterior, houve 14.334 correções de 2.118 desenvolvedores, com um tamanho de patch de 46 MB. Cerca de 40% de todas as mudanças apresentadas no 6.18 estão relacionadas a drivers de dispositivos, aproximadamente 16% estão relacionadas à atualização de código específico para arquiteturas de hardware, 12% estão conectadas à pilha de rede, 5% a sistemas de arquivos e 3% a subsistemas internos do núcleo.
As principais inovações no núcleo 6.18 (1, 2, 3):
- Subsistema de disco, entrada/saída e sistemas de arquivos
- No Device Mapper, foi adicionado um manipulador dm-pcache para utilizar memória persistente (memória CXL endereçada através de um dispositivo DAX) como um cache adicional de alto desempenho à frente de discos tradicionais mais lentos ou unidades flash. O dm-pcache garante a preservação do conteúdo do cache em caso de falhas (crash-safe) através do uso de memória não volátil, duplicação de metadados e verificação de integridade dos dados e metadados por meio de somas de verificação CRC32. Atualmente, apenas o cache no modo de gravação adiada (write-back) é suportado.
- O código do sistema de arquivos Bcachefs foi removido do núcleo, sendo agora distribuído na forma de um módulo externo, compilado com o uso da ferramenta DKMS (Dynamic Kernel Module Support). O código do Bcachefs pode ser reintegrado ao núcleo após Kent Overstreet demonstrar efetivamente a possibilidade de interação correta com outros desenvolvedores do núcleo e a capacidade de seguir as regras estabelecidas de desenvolvimento.
- A chamada do sistema pwritev2() agora inclui a flag RWF_NOSIGNAL, que desativa o envio do sinal SIGPIPE ao escrever em canais anônimos ou sockets quebrados.
- Foi adicionada no Procfs a opção de montagem "pidns" para especificar namespaces de identificadores de processos. Por exemplo: "mount -t proc -o pidns=\/proc\/self\/ns\/pid proc \/tmp\/proc".
- No XFS, foi declarada estável e habilitada por padrão a capacidade de aplicar a ferramenta fsck para verificar e corrigir problemas detectados em modo online, sem desmontar o sistema de arquivos. Foram adicionadas chamadas de sistema file_getattr e file_setattr para modificar os atributos de arquivos especiais (qualquer inode). No KConfig, as opções XFS_SUPPORT_V4 (versão 4 do XFS) e XFS_SUPPORT_ASCII_CI (modo sem distinção de maiúsculas e minúsculas para caracteres ASCII) estão desativadas por padrão, pois foram consideradas obsoletas. As opções de montagem obsoletas attr2, noattr2, ikeep e noikeep foram removidas.
- No MD RAID, foi implementado um novo tipo de mapas de bits - llbitmap (bitmap sem bloqueio), que funciona sem bloqueios e oferece desempenho superior.
- Na estrutura geral do "inode", foram retiradas informações relacionadas à criptografia e verificação (ponteiros i_crypt_info e i_verity_info). Essa mudança permite reduzir o consumo de memória em sistemas de arquivos que não suportam criptografia e verificação.
- O subsistema FUSE agora suporta a chamada do sistema copy_file_range() e a cópia direta de intervalos utilizando um tamanho de 64 bits (antes, apenas tamanhos de 32 bits eram suportados). Foi adicionada a funcionalidade de inicialização em modo síncrono durante a montagem (FUSE_DEV_IOC_SYNC_INIT).
- No sistema de arquivos ext4, foi implementada a capacidade de usar identificadores de usuários (uid) e grupos (gid) de 32 bits ao acessar blocos reservados. Foram adicionadas operações ioctl para definir e ler parâmetros do superbloco de sistemas de arquivos montados (tune2fs poderá alterar parâmetros no superbloco sem precisar de direitos de gravação no dispositivo de bloco). As configurações obsoletas específicas do ext3 foram completamente removidas.
- No f2fs foi adicionada a opção de montagem "lookup_mode" para escolher o modo de pesquisa: perf — pesquisa por hash, compat — pesquisa linear, auto — seleção automática. A mudança de modo faz sentido para configurações com diretórios que não consideram a capitalização de caracteres. O modo de pesquisa atual pode ser verificado através do arquivo "\/sys\/fs\/f2fs\/\/effective_lookup_mode". Adicionada a possibilidade de reserva de inode, disponível apenas para usuários privilegiados.
- No Overlayfs foi adicionado um modo de operação sem distinção entre maiúsculas e minúsculas, ativado no nível das camadas do sistema de arquivos (a configuração para diretórios específicos ainda não é suportada).
- No BTRFS, foi aprimorado o paralelismo das operações sob alta carga de leitura e baixa carga de gravação, reduzindo o tempo de confirmação de transações e o tempo de sincronização (de minutos para dezenas de segundos). Foi possibilitada a utilização de blocos (bs) maiores que uma página de memória (ps).
- No ksmbd (servidor SMB operando no nível do kernel) foi adicionada uma opção para limitar o número máximo de conexões de um único usuário. endereços IP. smbdirect, smbclient e smbserver foram atualizados para usar estruturas padrão do kernel.
- No SQUASHFS foi adicionada a opção de utilizar no sistema de chamada lseek() as opções SEEK_DATA e SEEK_HOLE para buscar dados e lacunas em arquivos esparsos. Alguns testes mostraram um aumento de desempenho na cópia de arquivos esparsos de até 150 vezes.
- No EXFAT foi adicionada suporte para ioctl FS_IOC_GETFSLABEL e FS_IOC_SETFSLABEL para leitura e escrita de etiquetas de partição. Possibilitada a mudança de opções de montagem durante o remontagem. A inicialização de mapas de bits foi acelerada.
- No NTFS3 foi adicionada suporte para ioctl FS_IOC_GETFSLABEL e FS_IOC_SETFSLABEL para leitura e configuração de etiquetas de partição.
- Memória e serviços do sistema
- Foi incluída a implementação do mecanismo de interação entre processos Binder, escrito na linguagem Rust. O Binder é utilizado no Android para organizar a interação entre processos e chamadas remotas de métodos (um processo Android pode chamar um método ou função em outro processo Android, utilizando o Binder para identificação, chamada e passagem de argumentos entre processos). O código do Binder foi reescrito na linguagem Rust como parte da iniciativa do Google para reforçar a segurança do Android.
- No SLUB, alocador de memória do núcleo, foi implementada uma camada de cache opcional chamada "sheaves", que utiliza vários caches, cada um associado a um núcleo separado da CPU. Isso permite que uma operação de alocação ou liberação de memória seja localizada em um único núcleo. Esse cache melhorou o desempenho da alocação e liberação de memória no núcleo, eliminando a necessidade de primitivas de sincronização excessivas exigidas ao envolver diferentes núcleos da CPU. Nos testes realizados, o ganho de desempenho variou de 6,3% a 31%, dependendo do tipo de carga.
- Foi adicionada a capacidade de criar descritores de arquivos associados a um espaço de nomes específico. Ao contrário do acesso a espaços de nomes por meio de identificadores (\/proc\/\/ns\/), o descritor de arquivo está vinculado a uma instância específica do espaço de nomes e elimina a situação em que o identificador foi realocado e agora aponta para outro objeto. Similar ao uso de pidfds, a abertura de descritores de arquivos que se referem a espaços de nomes é realizada por meio das funções open_by_handle_at() e name_to_handle_at().
- Foi implementado o mecanismo "Swap Table", que melhora o desempenho de paginação. A aceleração é alcançada graças à redução da concorrência pelo acesso ao cache de paginação, a uma busca mais eficiente no cache e à diminuição da fragmentação. O backend baseado em Swap Table é usado para o cache de paginação em vez do backend XArray e permitiu um aumento médio de 5-20% no desempenho. No teste usemem, a taxa de transferência aumentou em 17-28%, e no teste de recompilação multithread do núcleo, o tempo de compilação foi reduzido em 1,12-3,19%. O teste redis-benchmark com BGSAVE mostrou um aumento no número de requisições processadas em 6-7%.
- O subsistema Zswap foi transferido para o uso direto do sistema de alocação de memória zsmalloc em vez da camada zpool, que não é mais utilizada em nenhuma outra parte do núcleo e agora foi removida.
- Para controlar o comportamento do carregador de microcódigo em sistemas x86, foi implementada uma opção de linha de comando "microcode=lista de flags". No momento atual, a nova opção substituiu "microcode.force_minrev" e também permite definir a versão mínima do microcódigo permitida para inicialização.
- Começou o trabalho de reorganização da estrutura excessivamente inflacionada "page", utilizada para gerenciar as páginas de memória. Um tipo 'memdesc_flags_t' foi adicionado para os campos com flags universais, que poderão ser usados após a esperada futura separação da estrutura "page" em estruturas distintas para slab e folios (folio).
- Para a arquitetura nios2, utilizada nos processadores Altera Nios II (processador soft baseado em FPGA), foi implementado o suporte à chamada de sistema clone3().
- Foi adicionado um atributo "transitional" na configuração do núcleo (KConfig), que pode ser usado para marcar configurações que não são exibidas em interfaces de usuário, como "make menuconfig", e que não são incluídas nos arquivos de configuração gerados. O principal objetivo do atributo é simplificar a renomeação de opções mantendo a compatibilidade retroativa.
- A versão mínima do compilador Clang necessária para compilar o núcleo foi elevada para a ferramenta LLVM 15. O Debian 12 e o Ubuntu 22.04 vêm com o LLVM 14.
- Continuou a transferência de alterações da branch Rust-for-Linux, relacionadas ao uso da linguagem Rust como segunda linguagem para o desenvolvimento de drivers e módulos de núcleo (o suporte a Rust não está ativado por padrão e não torna Rust uma dependência obrigatória de compilação para o núcleo). Na nova versão, foram implementadas operações atômicas com memória para código Rust, a estrutura maple tree, a capacidade de criar arquivos DebugFS e funções para manipulação de bitmaps. O acesso à API para desenvolvimento de drivers foi ampliado. Foi adicionado um conjunto completo de abstrações para o desenvolvimento de drivers de dispositivos USB (exemplo de driver USB). Suporte a símbolos de depuração gerados pelo compilador rustc foi adicionado ao utilitário perf.
- Virtualização e segurança
- Foi adicionado suporte à verificação criptográfica de programas BPF carregados por assinatura digital. No futuro, esse recurso será expandido com ferramentas para definir regras de carregamento de programas BPF assinados e permitir que usuários não privilegiados utilizem programas BPF verificados.
- O hypervisor KVM implementou suporte para virtualização da extensão Intel CET (Control-flow Enforcement Technology), utilizada para proteção contra exploits que empregam técnicas de programação orientada a retorno (ROP — Return-Oriented Programming). A essência da proteção é que, após a transferência de controle para uma função, o endereço de retorno é salvo pelo processador não apenas na pilha normal, mas também em uma pilha sombreada separada, que não pode ser alterada diretamente.
- Adicionada a possibilidade de uso de mais de 255 CPUs em sistemas convidados operando sob o hypervisor Bhyve em hosts com FreeBSD 15.
- Adicionada uma camada dibs (Direct Internal Buffer Sharing) para compartilhamento controlado de buffers dentro de um ambiente isolado, como um hypervisor ou uma instância do núcleo do Linux.
- O subsistema de auditoria agora suporta a operação com vários módulos LSM (Linux Security Module) ativados simultaneamente.
- Adicionado o driver virtio spi-virtio para acesso a dispositivos SPI (Serial Peripheral Interface) de máquinas virtuais.
- No hypervisor KVM, foi adicionado suporte para o modo SEV-SNP CipherText Hiding, bloqueando a leitura do texto cifrado da memória de sistemas convidados protegidos em CPUs não autorizadas.
- Adicionado o driver qtee para ambientes TEE (Trusted Execution Environment) de chips Qualcomm.
- Subsistema de Rede
- Adicionado suporte para criptografia de conexões TCP usando o protocolo PSP (PSP Security Protocol), desenvolvido pela Google para criptografar o tráfego entre data centers. O PSP fornece criptografia, controle de integridade criptográfica e autenticação de origem, implementando uma combinação única de funcionalidades dos protocolos TLS e IPsec. O PSP aplica criptografia em nível de conexões de rede individuais, em vez de em todo o canal de comunicação. O PSP utiliza chaves de criptografia separadas para diferentes conexões TCP tuneladas para rigorosa isolamento de tráfego entre diferentes aplicativos e manipuladores. Para reduzir a carga no CPU, é suportada a delegação de operações de criptografia e descriptografia para parte das placas de rede (offload). O protocolo UDP é utilizado como transporte para a transmissão de dados, sobre o qual o conteúdo do pacote TCP original é encapsulado.

- Foi adicionada a suporte inicial à extensão AccECN (Notificação de Congestionamento Explícito Preciso), que é uma versão aprimorada da extensão ECN, permitindo que os hosts marquem pacotes IP em caso de sobrecarga, em vez de descartá-los, o que possibilita identificar o surgimento de um congestionamento inicial nas linhas de comunicação sem perda de pacotes. A extensão ECN original tem uma limitação que permite sinalizar apenas uma ocorrência de sobrecarga durante um ciclo de transmissão TCP (RTT, Tempo de Retorno, envio de solicitação e recebimento de resposta). O AccECN remove essa limitação e permite que o receptor envie mais de uma etiqueta de sobrecarga para o remetente no cabeçalho do pacote TCP. Os algoritmos de controle de sobrecarga podem usar as informações recebidas para responder de forma mais precisa a sobrecargas sem reduzir drasticamente a intensidade do envio de pacotes ao surgirem pequenas sobrecargas.
- O empilhamento UDP foi otimizado para processar pacotes de entrada em condições de ataques DDoS, que resultam na chegada de um grande número de pacotes a um ou mais sockets UDP. As otimizações implementadas, como a redução de bloqueios concorrentes, otimização do posicionamento das estruturas de dados na memória e a utilização de bloqueios considerando a arquitetura NUMA (Acesso à Memória Não Uniforme), permitiram aumentar o desempenho na recepção de pacotes UDP em 47% ou mais em condições extremas.
- Foi implementada a opção de desativar o cache de entrada/saída no servidor NFS, o que permite usar o servidor NFS em sistemas com pouca memória (por exemplo, em ambientes de nuvem reduzidos). Desativar o cache também pode ser útil em servidores NFS sobrecarregados para evitar a expulsão do cache de dados relacionados aos armazenamentos locais, devido à liberação de memória para o cache do NFS.
- O tamanho máximo dos buffers de pacotes recebidos e enviados para sockets de rede (net.core.rmem_max e net.core.wmem_max) foi aumentado de 2 MB para 4 MB. O tamanho padrão não foi alterado (net.core.rmem_default e net.core.wmem_default = 2 MB).
- Foi adicionado um driver para o acelerador de operações de rede Qualcomm PPE (Engine de Processamento de Pacotes), utilizado no SoC Qualcomm IPQ9574.
- Adicionado suporte para criptografia de conexões TCP usando o protocolo PSP (PSP Security Protocol), desenvolvido pela Google para criptografar o tráfego entre data centers. O PSP fornece criptografia, controle de integridade criptográfica e autenticação de origem, implementando uma combinação única de funcionalidades dos protocolos TLS e IPsec. O PSP aplica criptografia em nível de conexões de rede individuais, em vez de em todo o canal de comunicação. O PSP utiliza chaves de criptografia separadas para diferentes conexões TCP tuneladas para rigorosa isolamento de tráfego entre diferentes aplicativos e manipuladores. Para reduzir a carga no CPU, é suportada a delegação de operações de criptografia e descriptografia para parte das placas de rede (offload). O protocolo UDP é utilizado como transporte para a transmissão de dados, sobre o qual o conteúdo do pacote TCP original é encapsulado.
- Hardware
- O núcleo agora inclui o driver Tyr, escrito na linguagem Rust, que oferece suporte a GPUs ARM Mali, que utilizam a tecnologia CSF (Command Stream Frontend), como Mali G310, G510 e G710. O driver ainda não está pronto para uso regular por usuários comuns e é considerado um protótipo experimental para testar abstrações para o desenvolvimento de drivers na linguagem Rust.
- Os drivers para dispositivos de entrada com interface HID (Human Interface Device) agora suportam touchpads com feedback tátil e sensores de força de pressão.
- O trabalho no driver drm (Direct Rendering Manager) Xe para GPUs baseadas na arquitetura Intel Xe, utilizadas nas placas gráficas Intel da família Arc e na gráfica integrada, começou com os processadores Tiger Lake. Na nova versão, foi adicionado o interface madvise, habilitada a suporte ao SR-IOV PF (Single Root I/O Virtualization Physical Function), foi adicionada a suporte ao modo Intel PSMI para validação de hardware, garantida a manipulação das informações de erro transmitidas pelos firmwares, implementado o perfil de consumo de energia SLPC e a carregar firmwares auxiliares (como para o controlador de cooler e regulador de tensão) durante a verificação do driver.
- No driver AMDGPU, foi adicionada a suporte a dispositivos com APU Cyan Skillfish, melhorada a compatibilidade com AMD GCN 1.0, foi implementada a compatibilidade com a ferramenta criu, e métricas de temperatura foram adicionadas ao sysfs, permitindo solicitações de remapeamento MMIO do espaço do usuário.
- No driver i915, foi adicionada a suporte a chips da família Wildcat Lake e melhorada a interação com GPUs Jasper Lake, Elkhart Lake, Gen7 e Gen6.
- No driver Nouveau, os firmwares GSP da NVIDIA estão agora ativados por padrão e a manipulação de erros foi aprimorada.
- A integração de componentes do driver Nova para GPUs NVIDIA, equipadas com firmwares GSP, usados a partir da série NVIDIA GeForce RTX 2000 baseada na microarquitetura Turing, foi continuada. O driver é desenvolvido na linguagem Rust. Na nova versão, a suporte a firmwares GSP foi ampliada, a implementação da macro "register!" foi melhorada, e suporte a classes de dispositivos PCI e identificadores de fabricantes foi adicionado.
- Foi adicionado o driver rocket para aceleradores NPU, utilizados em SoCs Rockchip RK3588.
- Um parâmetro do núcleo chamado "boot_display" foi adicionado para selecionar o dispositivo de saída para exibir o processo de inicialização em sistemas com múltiplas GPUs.
- No driver vesadrm, foi implementada a suporte a paletas de 8 bits.
- No driver msm foi adicionada a suporte para GPU Adreno 663 e implementada a tecnologia de redução de consumo de energia IFPC (Inter Frame Power Collapse).
- No driver panthor foi adicionada a suporte para GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 e Mali-Gx25.
- Foi adicionada a suporte para sistemas de som ASoC Qualcomm Glymur e PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 e TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. Foi adicionada a suporte para placas de som USB Tascam US-144mkII e Presonus S1824c.
- Foi adicionada a suporte para ARM CPU Cortex-A320/A520AE/A720AE e C1-Nano/Pro/Premium/Ultra.
- Foi adicionada a suporte para plataformas ARM, SoCs e dispositivos: Apple M2 Pro, M2 Max e M2 Ultra, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441 / Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H e RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP.
Simultaneamente, a Fundação Latino-Americana de Software Livre formou uma variante completamente livre do núcleo 6.18 — Linux-libre 6.18-gnu, limpa de elementos de firmware e drivers que contêm componentes não livres ou partes de código cuja utilização é limitada pelo fabricante. Na versão 6.18, o código de limpeza de blobs nos drivers Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex foi atualizado. Foi realizada a limpeza de nomes de blobs em arquivos dts (device tree) para chips ARM da Qualcomm, Mediatek e TI ARM64. A carga de blobs nos novos drivers FourSemi fs2104/5s, TI TAS2783 e Qualcomm GENI foi neutralizada.
Fonte: opennet.ru

