Kernel Linux versão 6.2

Após dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do kernel Linux 6.2. Entre as mudanças mais notáveis: a aceitação de código sob a licença Copyleft-Next é permitida, a implementação de RAID5/6 em Btrfs é melhorada, a integração do suporte para a linguagem Rust continua, a sobrecarga de proteção contra ataques Retbleed é reduzida, o foi adicionada a capacidade de regular o consumo de memória durante o write-back, foi adicionado um mecanismo para balanceamento de TCP PLB (Protective Load Balancing), um mecanismo híbrido de proteção de fluxo de comando (FineIBT) foi adicionado, o BPF agora tem a capacidade de definir seus próprios objetos e estruturas de dados , o utilitário rv (Runtime Verification) está incluído, o consumo de energia na implementação de bloqueios RCU foi reduzido.

A nova versão inclui 16843 correções de 2178 desenvolvedores, o tamanho do patch é de 62 MB (as alterações afetaram 14108 arquivos, 730195 linhas de código foram adicionadas, 409485 linhas foram excluídas). Cerca de 42% de todas as alterações introduzidas no 6.2 estão relacionadas a drivers de dispositivos, aproximadamente 16% das alterações estão relacionadas à atualização de código específico para arquiteturas de hardware, 12% estão relacionadas à pilha de rede, 4% estão relacionadas a sistemas de arquivos e 3% estão relacionados aos subsistemas internos do kernel.

Principais inovações no kernel 6.2:

  • Serviços de memória e sistema
    • É permitido incluir no código do kernel e alterações fornecidas sob a licença Copyleft-Next 0.3.1. A licença Copyleft-Next foi criada por um dos autores da GPLv3 e é totalmente compatível com a licença GPLv2, conforme confirmado pelos advogados da SUSE e da Red Hat. Comparada à GPLv2, a licença Copyleft-Next é muito mais compacta e fácil de entender (a parte introdutória e a menção a compromissos desatualizados foram removidas), define o prazo e o procedimento para eliminar violações e remove automaticamente os requisitos de copyleft para software desatualizado que tem mais de 15 anos.

      Copyleft-Next também contém uma cláusula de concessão de tecnologia proprietária, que, diferentemente da GPLv2, torna esta licença compatível com a licença Apache 2.0. Para garantir total compatibilidade com a GPLv2, o Copyleft-Next declara explicitamente que um trabalho derivado pode ser fornecido sob a licença GPL, além da licença original do Copyleft-Next.

    • A estrutura inclui o utilitário “rv”, que fornece uma interface para interação do espaço do usuário com manipuladores do subsistema RV (Runtime Verification), projetado para verificar o correto funcionamento em sistemas altamente confiáveis ​​​​que garantem a ausência de falhas. A verificação é realizada em tempo de execução anexando manipuladores a pontos de rastreamento que verificam o progresso real da execução em relação a um modelo determinístico de referência predeterminado da máquina que define o comportamento esperado do sistema.
    • O dispositivo zRAM, que permite que a partição swap seja armazenada na memória de forma compactada (um dispositivo de bloco é criado na memória para o qual a troca é realizada com compactação), implementa a capacidade de reembalar páginas usando um algoritmo alternativo para atingir um nível superior de compressão. A idéia principal é fornecer uma escolha entre vários algoritmos (lzo, lzo-rle, lz4, lz4hc, zstd), oferecendo seus próprios compromissos entre velocidade de compressão/descompressão e nível de compressão, ou ótimos em situações especiais (por exemplo, para compactar grandes volumes). páginas de memória).
    • Adicionada a API "iommufd" para gerenciar o sistema de gerenciamento de memória de E/S - IOMMU (I/O Memory-Management Unit) do espaço do usuário. A nova API torna possível gerenciar tabelas de páginas de memória de E/S usando descritores de arquivo.
    • O BPF oferece a capacidade de criar tipos, definir seus próprios objetos, construir sua própria hierarquia de objetos e criar com flexibilidade suas próprias estruturas de dados, como listas vinculadas. Para programas BPF entrando em modo de suspensão (BPF_F_SLEEPABLE), foi adicionado suporte para bloqueios bpf_rcu_read_{,un}lock(). Suporte implementado para salvar objetos task_struct. Adicionado tipo de mapa BPF_MAP_TYPE_CGRP_STORAGE, fornecendo armazenamento local para cgroups.
    • Para o mecanismo de bloqueio RCU (Read-copy-update), é implementado um mecanismo opcional de chamadas de retorno “preguiçosas”, no qual várias chamadas de retorno são processadas ao mesmo tempo usando um temporizador em modo batch. A aplicação da otimização proposta nos permite reduzir o consumo de energia em dispositivos Android e ChromeOS em 5 a 10%, adiando solicitações de RCU durante períodos de inatividade ou baixa carga do sistema.
    • Adicionado sysctl split_lock_mitigate para controlar como o sistema reage ao detectar bloqueios divididos que ocorrem ao acessar dados desalinhados na memória devido aos dados cruzarem duas linhas de cache da CPU ao executar uma instrução atômica. Tais bloqueios levam a uma queda significativa no desempenho. Definir split_lock_mitigate como 0 emite apenas um aviso de que há um problema, enquanto definir split_lock_mitigate como 1 também faz com que o processo que causou a desaceleração do bloqueio para preservar o desempenho do resto do sistema.
    • Foi proposta uma nova implementação do qspinlock para a arquitetura PowerPC, que demonstra maior desempenho e resolve alguns problemas de bloqueio que surgem em casos excepcionais.
    • O código de tratamento de interrupções MSI (Message-Signaled Interrupts) foi retrabalhado, eliminando problemas arquitetônicos acumulados e adicionando suporte para vincular manipuladores individuais a diferentes dispositivos.
    • Para sistemas baseados na arquitetura de conjunto de instruções LoongArch usada nos processadores Loongson 3 5000 e implementando o novo RISC ISA, semelhante ao MIPS e RISC-V, é implementado suporte para ftrace, proteção de pilha, modos de suspensão e espera.
    • Foi fornecida a capacidade de atribuir nomes a áreas de memória anônima compartilhada (anteriormente, os nomes só podiam ser atribuídos a memória anônima privada atribuída a um processo específico).
    • Adicionado um novo parâmetro de linha de comando do kernel “trace_trigger”, projetado para ativar um gatilho de rastreamento usado para vincular comandos condicionais chamados quando uma verificação de controle é acionada (por exemplo, trace_trigger=”sched_switch.stacktrace if prev_state == 2″).
    • Os requisitos para a versão do pacote binutils foram aumentados. Construir o kernel agora requer pelo menos o binutils 2.25.
    • Ao chamar exec(), foi adicionada a capacidade de colocar um processo em um namespace de tempo, no qual o horário é diferente do horário do sistema.
    • Começamos a transferir funcionalidades adicionais do ramo Rust-for-Linux relacionadas ao uso da linguagem Rust como segunda linguagem para desenvolvimento de drivers e módulos de kernel. O suporte ao Rust está desabilitado por padrão e não resulta na inclusão do Rust como uma dependência necessária de construção do kernel. A funcionalidade básica oferecida na última versão é expandida para suportar código de baixo nível, como o tipo Vec e as macros pr_debug!(), pr_cont!() e pr_alert!(), bem como a macro processual “#[vtable ]”, o que simplifica o trabalho com tabelas de ponteiros em funções. A adição de ligações Rust de alto nível sobre os subsistemas do kernel, que permitirão a criação de drivers completos no Rust, é esperada em versões futuras.
    • O tipo "char" usado no kernel agora é declarado como não assinado por padrão para todas as arquiteturas.
    • O mecanismo de alocação de memória em placas - SLOB (slab allocator), que foi projetado para sistemas com pequena quantidade de memória, foi declarado obsoleto. Em vez de SLOB, em condições normais é recomendado usar SLUB ou SLAB. Para sistemas com pouca memória, é recomendado usar SLUB no modo SLUB_TINY.
  • Subsistema de disco, E/S e sistemas de arquivos
    • Melhorias foram feitas no Btrfs com o objetivo de corrigir o problema de “buraco de gravação” em implementações RAID 5/6 (uma tentativa de restaurar um RAID se ocorrer uma falha durante a gravação e for impossível entender qual bloco em qual dispositivo RAID foi escrito corretamente, que pode levar à destruição de blocos, correspondentes a bloqueios subscritos). Além disso, os SSDs agora ativam automaticamente a operação de descarte assíncrona por padrão quando possível, permitindo melhor desempenho devido ao agrupamento eficiente de operações de descarte em filas e ao processamento da fila por um processador em segundo plano. Melhor desempenho das operações send e lseek, bem como do ioctl FIEMAP.
    • Os recursos para gerenciar gravação diferida (writeback, salvamento em segundo plano de dados alterados) para dispositivos de bloco foram expandidos. Em algumas situações, como ao usar dispositivos de bloco de rede ou unidades USB, gravações lentas podem resultar em grande consumo de RAM. Para controlar o comportamento de gravações lentas e manter o tamanho do cache da página dentro de certos limites, novos parâmetros strict_limit, min_bytes, max_bytes, min_ratio_fine e max_ratio_fine foram introduzidos no sysfs (/sys/class/bdi/).
    • O sistema de arquivos F2FS implementa uma operação ioctl de substituição atômica, que permite gravar dados em um arquivo em uma única operação atômica. O F2FS também adiciona um cache de extensão de bloco para ajudar a identificar dados usados ​​ativamente ou dados que não são acessados ​​há muito tempo.
    • No ext4 FS apenas as correções de erros são anotadas.
    • O sistema de arquivos NTFS3 oferece diversas novas opções de montagem: “nocase” para controlar a distinção entre maiúsculas e minúsculas em nomes de arquivos e diretórios; windows_name para proibir a criação de nomes de arquivos contendo caracteres inválidos para Windows; hide_dot_files para controlar a atribuição do rótulo de arquivo oculto para arquivos que começam com um ponto.
    • O sistema de arquivos Squashfs implementa uma opção de montagem “threads=”, que permite definir o número de threads para paralelizar as operações de descompactação. O Squashfs também introduziu a capacidade de mapear IDs de usuários de sistemas de arquivos montados, usados ​​para combinar os arquivos de um usuário específico em uma partição externa montada com outro usuário no sistema atual.
    • A implementação das listas de controle de acesso POSIX (POSIX ACLs) foi reformulada. A nova implementação elimina problemas arquitetônicos, simplifica a manutenção da base de código e introduz tipos de dados mais seguros.
    • O subsistema fscrypt, que é usado para criptografia transparente de arquivos e diretórios, adicionou suporte para o algoritmo de criptografia SM4 (padrão chinês GB/T 32907-2016).
    • A capacidade de construir o kernel sem suporte ao NFSv2 foi fornecida (no futuro eles planejam parar completamente de suportar o NFSv2).
    • A organização da verificação dos direitos de acesso aos dispositivos NVMe foi alterada. Fornece a capacidade de ler e gravar em um dispositivo NVMe se o processo de gravação tiver acesso ao arquivo dedicado do dispositivo (anteriormente, o processo precisava ter a permissão CAP_SYS_ADMIN).
    • Removido o driver do pacote de CD/DVD, que foi descontinuado em 2016.
  • Virtualização e Segurança
    • Um novo método de proteção contra a vulnerabilidade Retbleed foi implementado em CPUs Intel e AMD, usando rastreamento de profundidade de chamada, que não retarda tanto o trabalho quanto a proteção anteriormente presente contra Retbleed. Para habilitar o novo modo, o parâmetro de linha de comando do kernel “retbleed=stuff” foi proposto.
    • Adicionado um mecanismo híbrido de proteção de fluxo de instruções FineIBT, combinando o uso de instruções de hardware Intel IBT (Indirect Branch Tracking) e proteção de software kCFI (kernel Control Flow Integrity) para bloquear a violação da ordem de execução normal (fluxo de controle) como resultado do uso de explorações que modificam ponteiros armazenados na memória em funções. FineIBT permite a execução por salto indireto apenas no caso de um salto para a instrução ENDBR, que é colocada logo no início da função. Além disso, por analogia com o mecanismo kCFI, os hashes são então verificados para garantir a imutabilidade dos ponteiros.
    • Adicionadas restrições para bloquear ataques que manipulam a geração de estados "oops", após os quais tarefas problemáticas são concluídas e o estado é restaurado sem parar o sistema. Com um número muito grande de chamadas para o estado "oops", ocorre um overflow do contador de referências (refcount), que permite a exploração de vulnerabilidades causadas por desreferências de ponteiros NULL. Para proteger contra tais ataques, um limite foi adicionado ao kernel para o número máximo de gatilhos “oops”, após exceder o qual o kernel iniciará uma transição para o estado de “pânico” seguido de uma reinicialização, o que não permitirá atingir o número de iterações necessárias para estourar a refcount. Por padrão, o limite é definido em 10 mil “oops”, mas se desejar, pode ser alterado através do parâmetro oops_limit.
    • Adicionado parâmetro de configuração LEGACY_TIOCSTI e sysctl legado_tiocsti para desabilitar a capacidade de colocar dados no terminal usando o ioctl TIOCSTI, uma vez que esta funcionalidade pode ser usada para substituir caracteres arbitrários no buffer de entrada do terminal e simular a entrada do usuário.
    • Um novo tipo de estrutura interna, encoded_page, é proposto, no qual os bits inferiores do ponteiro são usados ​​para armazenar informações adicionais usadas para proteger contra desreferência acidental do ponteiro (se a desreferência for realmente necessária, esses bits adicionais devem ser apagados primeiro). .
    • Na plataforma ARM64, na fase de inicialização, é possível habilitar ou desabilitar a implementação de software do mecanismo Shadow Stack, que é usado para proteger contra a substituição do endereço de retorno de uma função em caso de estouro de buffer na pilha ( a essência da proteção é salvar o endereço de retorno em uma pilha “sombra” separada após o controle ser transferido para a função e recuperar o endereço fornecido antes de sair da função). O suporte para implementações de hardware e software do Shadow Stack em um assembly de kernel permite que você use um kernel em diferentes sistemas ARM, independentemente de seu suporte para instruções de autenticação de ponteiro. A inclusão de uma implementação de software é realizada através da substituição das instruções necessárias no código durante o carregamento.
    • Adicionado suporte para usar o mecanismo de notificação de saída assíncrona em processadores Intel, que permite detectar ataques de etapa única em código executado em enclaves SGX.
    • É proposto um conjunto de operações que permite ao hipervisor suportar solicitações de sistemas convidados Intel TDX (Trusted Domain Extensions).
    • As configurações de compilação do kernel RANDOM_TRUST_BOOTLOADER e RANDOM_TRUST_CPU foram removidas, em favor das opções de linha de comando correspondentes random.trust_bootloader e random.trust_cpu.
    • O mecanismo Landlock, que permite limitar a interação de um grupo de processos com o ambiente externo, adicionou suporte ao sinalizador LANDLOCK_ACCESS_FS_TRUNCATE, que permite controlar a execução de operações de truncamento de arquivos.
  • subsistema de rede
    • Para o IPv6, foi adicionado suporte ao PLB (Protective Load Balancing), mecanismo de balanceamento de carga entre links de rede que visa reduzir pontos de sobrecarga em switches de data centers. Ao alterar o rótulo de fluxo IPv6, o PLB altera aleatoriamente os caminhos dos pacotes para equilibrar a carga nas portas do switch. Para reduzir a reordenação de pacotes, esta operação é realizada após períodos de inatividade sempre que possível. O uso de PLB nos data centers do Google reduziu o desequilíbrio de carga nas portas do switch em 60%, em média, reduziu a perda de pacotes em 33% e reduziu a latência em 20%.
    • Adicionado driver para dispositivos MediaTek com suporte para Wi-Fi 7 (802.11be).
    • Adicionado suporte para links de 800 gigabits.
    • Adicionada a capacidade de renomear interfaces de rede dinamicamente, sem interromper o trabalho.
    • Uma menção ao endereço IP ao qual o pacote chegou foi adicionada às mensagens de log sobre inundação SYN.
    • Para UDP, foi implementada a capacidade de usar tabelas hash separadas para diferentes namespaces de rede.
    • Para pontes de rede, foi implementado suporte para o método de autenticação MAB (MAC Authentication Bypass).
    • Para o protocolo CAN (CAN_RAW), o suporte para o modo de soquete SO_MARK foi implementado para anexar filtros de tráfego baseados em fwmark.
    • ipset implementa um novo parâmetro bitmask que permite definir uma máscara com base em bits arbitrários no endereço IP (por exemplo, "ipset create set1 hash:ip bitmask 255.128.255.0").
    • Adicionado suporte para processamento de cabeçalhos internos dentro de pacotes em túnel para nf_tables.
  • Оборудование
    • O subsistema “accel” foi adicionado com a implementação de um framework para aceleradores computacionais, que pode ser fornecido na forma de ASICs individuais ou na forma de blocos IP dentro do SoC e GPU. Esses aceleradores têm como objetivo principal acelerar a solução de problemas de aprendizado de máquina.
    • O driver amdgpu inclui suporte para os componentes GC, PSP, SMU e NBIO IP. Para sistemas ARM64, o suporte para DCN (Display Core Next) é implementado. A implementação da saída de tela protegida foi movida do uso de DCN10 para DCN21 e agora pode ser usada ao conectar múltiplas telas.
    • O driver i915 (Intel) estabilizou o suporte para placas de vídeo Intel Arc (DG2/Alchemist) discretas.
    • O driver Nouveau oferece suporte a GPUs NVIDIA GA102 (RTX 30) baseadas na arquitetura Ampere. Para placas nva3 (GT215), foi adicionada a capacidade de controlar a luz de fundo.
    • Adicionado suporte para adaptadores sem fio baseados em chips Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) e MediaTek MT7996, interfaces Bluetooth Broadcom BCM4377/4378/4387, bem como controladores Motorcomm yt8521 e NVIDIA Tegra GE Ethernet.
    • Adicionado suporte ASoC (ALSA System on Chip) para chips de som integrados HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Adicionado suporte para interface de áudio Focusrite Saffire Pro 40. Adicionado codec de áudio Realtek RT1318.
    • Adicionado suporte para smartphones e tablets Sony (Xperia 10 IV, 5 IV, X e X compact, OnePlus One, 3, 3T e Nord N100, Xiaomi Poco F1 e Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
    • Adicionado suporte para ARM SoC e Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695) placas, SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.

Ao mesmo tempo, a Fundação Latino-Americana de Software Livre formou uma versão do kernel 6.2 totalmente gratuito - Linux-libre 6.2-gnu, livre de elementos de firmware e drivers contendo componentes proprietários ou seções de código, cujo escopo é limitado por O manufatureiro. A nova versão limpa novos blobs no driver nouveau. O carregamento de blob está desabilitado nos drivers mt7622, ​​​​mt7996 wifi e bcm4377 bluetooth. Limpeza de nomes de blob em arquivos dts para a arquitetura Aarch64. Código de limpeza de blob atualizado em vários drivers e subsistemas. Parou de limpar o driver s5k4ecgx, pois ele foi removido do kernel.

Fonte: opennet.ru

Adicionar um comentário