Lançamento do núcleo Linux 6.1

Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do kernel Linux 6.1. Entre as mudanças mais notáveis estão: suporte ao desenvolvimento de drivers e módulos na linguagem Rust, modernização do mecanismo de identificação das páginas de memória utilizadas, um gerenciador de memória especial para programas BPF, um sistema de diagnóstico de problemas de memória KMSAN, o mecanismo de proteção KCFI (Kernel Control-Flow Integrity) e a implementação da estrutura Maple tree.

A nova versão conta com 15.115 correções de 2.139 desenvolvedores, com o tamanho do patch sendo 51 MB, que é aproximadamente metade do tamanho dos patches das versões 6.0 e 5.19. As alterações afetaram 13.165 arquivos, adicionando 716.247 linhas de código e removendo 304.560 linhas. Cerca de 45% de todas as mudanças apresentadas no 6.1 estão relacionadas a drivers de dispositivos, aproximadamente 14% das mudanças dizem respeito à atualização de código específico para arquiteturas de hardware, 14% estão ligadas à pilha de rede, 3% às sistemas de arquivos e 3% às subsistemas internos do kernel.

Principais inovações no kernel 6.1:

  • Memória e serviços do sistema
    • Foi adicionada a possibilidade de usar a linguagem Rust como uma segunda linguagem para o desenvolvimento de drivers e módulos do kernel. O principal motivo para o suporte ao Rust é facilitar a escrita de drivers de dispositivos seguros e de qualidade, reduzindo a probabilidade de erros ao lidar com a memória. O suporte ao Rust não está ativado por padrão e não faz com que o Rust seja uma dependência de construção obrigatória para o kernel. Atualmente, uma versão mínima reduzida dos patches foi aceita, reduzindo de 40 para 13 mil linhas de código e fornecendo apenas o mínimo necessário para compilar um simples módulo do kernel escrito em Rust. Pretende-se gradualmente expandir a funcionalidade existente, transferindo outras mudanças do ramo Rust-for-Linux. Paralelamente, projetos estão sendo desenvolvidos para utilizar a infraestrutura proposta no desenvolvimento de drivers de unidades NVMe, protocolo de rede 9p e GPU Apple M1 na linguagem Rust.
    • Para sistemas baseados nas arquiteturas AArch64, RISC-V e LoongArch com EFI, foi implementada a possibilidade de inicialização direta a partir de imagens de núcleo comprimidas. Foram adicionados manipuladores para carregar, executar e descarregar imagens de núcleo, chamados diretamente do EFI zboot. Também foram acrescentados manipuladores para instalação e remoção de protocolos do banco de dados de protocolos EFI. Anteriormente, a descompactação era realizada por um carregador separado, e agora isso pode ser feito pelo manipulador no próprio núcleo — a imagem do núcleo é formada como um aplicativo EFI.
    • Foi aceita uma parte dos patches que implementam um modelo de gerenciamento de memória em múltiplos níveis, permitindo a separação de bancos de memória com diferentes características de desempenho. Por exemplo, as páginas mais frequentemente utilizadas podem ser alocadas na memória mais rápida, enquanto as páginas raramente usadas podem ser armazenadas em memória relativamente mais lenta. No núcleo 6.1, foi adotado um mecanismo para determinar a localização de páginas frequentemente utilizadas na memória lenta para sua realocação na memória rápida, além de implementar um conceito geral de níveis de memória e seu desempenho relativo.
    • Foi incluído o mecanismo MGLRU (Multi-Generational LRU), que substituiu a antiga implementação LRU (Least Recently Used) baseada em duas filas por uma estrutura de múltiplos estágios, que define melhor quais páginas de memória estão realmente em uso e quais podem ser descartadas para a partição de swap.
    • Adicionada a suporte à estrutura de dados «maple tree» proposta pelos engenheiros da Oracle, que se posiciona como uma substituição mais eficiente à estrutura «red-black tree». O maple tree é uma variante da B-tree, que suporta indexação por intervalos de valores e foi projetada para um uso eficiente do cache. de processadores modernosAlguns subsistemas de gerenciamento de memória já foram convertidos para o maple tree, o que impactou positivamente seu desempenho. No futuro, o maple tree pode ser utilizado para implementar bloqueios por intervalos (range locking).
    • O subsistema BPF agora permite a criação de programas BPF "destrutivos", especificamente projetados para iniciar uma falha através da chamada crash_kexec(). Esses programas BPF podem ser necessários para fins de depuração para gerar um crash dump em um momento específico. Para acessar operações destrutivas ao carregar um programa BPF, é necessário especificar o flag BPF_F_DESTRUCTIVE, ativar o sysctl kernel.destructive_bpf_enabled e ter permissões CAP_SYS_BOOT.
    • Os programas BPF agora têm a capacidade de iterar sobre os elementos do cgroup, bem como sobre os recursos (arquivos, vma, processos, etc.) de um determinado thread ou tarefa. Um novo tipo de mapa foi implementado para a criação de buffers circulares personalizados (user ring buffer).
    • Uma chamada especial para alocação de memória em programas BPF (memory allocator) foi adicionada, que proporciona uma alocação de memória mais segura no contexto do BPF do que o kmalloc() padrão.
    • A primeira parte das mudanças que possibilitam a criação de drivers para dispositivos de entrada com interface HID (Human Interface Device), implementados como programas BPF, foi integrada.
    • O código para suportar o formato de arquivo executável a.out foi completamente removido do núcleo, que foi considerado obsoleto na versão 5.1, e desde as versões 5.18 e 5.19 foi desativado para arquiteturas principais. O formato a.out não é mais utilizado em sistemas Linux, e a geração de arquivos a.out não é suportada por ferramentas modernas em configurações padrão para Linux. O carregador para arquivos a.out pode ser implementado totalmente no espaço do usuário.
    • Para sistemas baseados na arquitetura LoongArch, utilizada nos processadores Loongson 3 5000 e que implementa um novo RISC ISA, semelhante ao MIPS e RISC-V, foi implementado o suporte para eventos de medição de performance (perf event), kexec, kdump e compilação JIT de BPF.
    • Na interface de entrada/saída assíncrona io_uring, foi proposto um novo modo IORING_SETUP_DEFER_TASKRUN, que permite adiar temporariamente a execução de trabalhos relacionados ao buffer circular até que um pedido seja recebido do aplicativo, o que pode ser usado para organizar a execução em modo batch e evitar problemas de latência devido à preempção do aplicativo em momentos inadequados.
    • Os processos no espaço do usuário agora podem iniciar a transformação de um intervalo de páginas de memória comuns em um conjunto de páginas de memória grandes (Transparent Huge-Pages).
    • Foi adicionada a implementação do dispositivo /dev/userfaultfd, que permite acessar a funcionalidade da chamada de sistema userfaultfd() utilizando permissões do sistema de arquivos. A funcionalidade userfaultfd permite criar manipuladores para acessos a páginas de memória não alocadas (page faults) no espaço do usuário.
    • Os requisitos para a versão da ferramenta GNU Make foram elevados — agora é necessária pelo menos a versão 3.82 para compilar o kernel.
  • Subsistema de disco, entrada/saída e sistemas de arquivos
    • Significativas otimizações de desempenho foram feitas no sistema de arquivos Btrfs, incluindo um aumento acentuado no desempenho da chamada ioctl FIEMAP. Suporte para gravação bufferizada assíncrona foi adicionado para aplicativos que utilizam io_uring. A operação 'send' agora suporta arquivos protegidos com fs-verity.
    • No sistema de arquivos ext4, foram adicionadas otimizações de desempenho relacionadas à manutenção do log e ao funcionamento em modo somente leitura.
    • No sistema de arquivos EROFS (Enhanced Read-Only File System), destinado ao uso em partições disponíveis em modo somente leitura, foi implementada a possibilidade de armazenar dados de forma compartilhada que se duplicam em diferentes sistemas de arquivos.
    • Na chamada de sistema statx(), foi adicionada a capacidade de relatar informações sobre a possibilidade de aplicar entrada/saída direta a um arquivo.
    • No subsistema FUSE (Filesystems in User Space), foi adicionado suporte para a criação de arquivos temporários com a flag O_TMPFILE.
  • Virtualização e segurança
    • Substituída a implementação do mecanismo de proteção CFI (Control Flow Integrity), que adiciona, antes de cada chamada indireta de função, uma verificação para identificar algumas formas de comportamento indefinido que podem potencialmente levar a uma violação da ordem normal de execução (fluxo de controle) devido à aplicação de exploits que alteram os ponteiros de função armazenados na memória. A implementação padrão do CFI do projeto LLVM foi substituída por uma variante, também baseada no uso do Clang, mas especificamente adaptada para proteger subsistemas de baixo nível e núcleos de sistemas operacionais. No LLVM, a nova implementação será proposta na versão do Clang 16 e será ativada pela opção "-fsanitize=kcfi". A principal diferença da nova implementação é que ela não está vinculada a otimizações na etapa de vinculação (LTO) e não resulta na substituição de ponteiros de função por referências na tabela de transições.
    • Para módulos LSM (Linux Security Module), foi oferecida a possibilidade de criar manipuladores que interceptam operações de criação de espaços de nomes.
    • Foram fornecidos meios para verificação de assinaturas digitais PKCS#7 em programas BPF.
    • Em \/dev\/random, foi restaurada a capacidade de abertura em modo não bloqueante (O_NONBLOCK), que foi acidentalmente removida no núcleo 5.6.
    • Em sistemas com arquitetura x86, foi adicionido um aviso em caso de mapeamento de páginas de memória pelas subsistemas do núcleo, permitindo simultaneamente execução e escrita. No futuro, será considerada a possibilidade de proibir completamente tal mapeamento de memória.
    • Adicionado um mecanismo de depuração KMSAN (Kernel Memory Sanitizer) para detectar o uso de memória não inicializada no núcleo, bem como vazamentos de memória não inicializada entre o espaço do usuário e os dispositivos.
    • Melhorias foram feitas no gerador de números pseudoaleatórios seguro CRNG, utilizado na chamada getrandom. As alterações foram preparadas por Jason Donenfeld, autor do WireGuard, e têm como objetivo aumentar a segurança na extração de números inteiros pseudoaleatórios. VPN No stack TCP, foi implementada a possibilidade (desativada por padrão) de uso separado de tabelas de hash de sockets para cada espaço de nome, o que permite aumentar o desempenho de sistemas com um grande número de espaços de nome.
  • Subsistema de Rede
    • Foi adicionada a capacidade de criar manipuladores que interceptam operações de criação de namespaces para módulos LSM (Módulo de Segurança do Linux).
    • O código para suporte ao protocolo DECnet obsoleto foi removido. Placeholder de API foi mantido para o espaço do usuário, permitindo a compilação de aplicativos que usam DECnet, mas esses aplicativos não poderão se conectar à rede.
    • O protocolo netlink foi documentado.
  • Hardware
    • O driver amdgpu adicionou suporte para passagem de DSC (Display Stream Compression) para compressão de dados sem perda ao trocar informações com telas que suportam resoluções muito altas. O trabalho de suporte a plataformas AMD RDNA3 (RX 7000) e CDNA (Instinct) foi continuado. Adicionado suporte para componentes IP DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x e GMC 11.x. No driver amdkfd (para GPUs discretas AMD, como Polaris), foi implementado suporte para GFX 11.0.3.
    • O driver i915 (Intel) agora inclui suporte para GPU Meteor Lake. O suporte para a interface DP 2.0 (DisplayPort) foi adicionado para Meteor Lake e GPUs mais novas. Identificadores foram adicionados para placas gráficas baseadas na microarquitetura Alder Lake S.
    • Adicionado suporte para subsistemas de áudio implementados em processadores Apple Silicon, Intel SkyLake e Intel KabyLake. O driver de áudio CS35L41 HDA agora suporta transição para modo de suspensão. Adicionado suporte ASoC (ALSA System on Chip) para chips de áudio integrados Apple Silicon, AMD Rembrandt DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake e Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 e Texas Instruments SRC4392.
    • Adicionado suporte para painéis LCD Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9.
    • Adicionado suporte para controladores AHCI SATA usados em SoCs Baikal-T1.
    • Adicionado suporte para chips Bluetooth MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE e RTL8761BUV (Edimax BT-8500).
    • No driver ath11k para módulos sem fio Qualcomm, foi adicionado suporte para varredura espectral na faixa de 160 MHz, com implementação de NAPI multithreaded e melhor suporte para chips Wi-Fi Qualcomm WCN6750.
    • Drivers para teclado do PinePhone, touchpads InterTouch (ThinkPad P1 G3), Controlador Adaptativo do X-Box, Controlador de Voo PhoenixRC, Controlador de Carro VRC-2, Controlador DualSense Edge, painéis de controle da IBM (IBM Operation Panel), controles remotos do XBOX One Elite, tablets XP-PEN Deco Pro S e Intuos Pro Small (PTH-460) foram adicionados.
    • Adicionado driver para aceleradores criptográficos Aspeed HACE (Hash and Crypto Engine).
    • Adicionado suporte para controladores Thunderbolt/USB4 integrados Intel Meteor Lake.
    • Adicionado suporte para smartphones Sony Xperia 1 IV, Samsung Galaxy E5, E7 e Grand Max, Pine64 Pinephone Pro.
    • Adicionada suporte para ARM SoC e placas: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 e RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Drivers para SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom e NXP foram atualizados.

Simultaneamente, a Fundação do Software Livre da América Latina formou uma versão totalmente livre do núcleo 6.1 — Linux-libre 6.1-gnu, limpa de elementos de firmware e drivers que contêm componentes não livres ou trechos de código com uso restrito pelo fabricante. Na nova versão, foi feita uma limpeza do novo driver rtw8852b e dos arquivos DTS para diferentes SoCs Qualcomm e MediaTek com processadores baseados na arquitetura AArch64. O código de limpeza de blobs em drivers e subsistemas amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI foi atualizado. A limpeza de drivers obsoletos tm6000 TV cards, cpia2 v4l, sp8870 e av7110 foi corrigida.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster