Depois de dois meses de desenvolvimento, Linus Torvalds apresentou o lançamento do núcleo Linux 6.11. Entre as mudanças mais notáveis estão: suporte a operações atômicas de gravação em nível de bloco, suporte a operações bind() e listen() no io_uring, um novo mecanismo de bloqueio de manipuladores de interrupção, a capacidade de gravar em arquivos executáveis espelhados na memória, suporte à escrita de drivers de dispositivos de bloco na linguagem Rust, otimização da chamada getrandom(), e uma nova implementação do AES-GCM.
Na nova versão foram aceitas 15.130 correções de 2.078 desenvolvedores, com um tamanho de patch de 85 MB (as mudanças afetaram 13.282 arquivos, 985.857 linhas de código foram adicionadas, e 268.915 linhas foram removidas). Na versão anterior, houve 14.564 correções de 1.989 desenvolvedores, com um patch de 41 MB (duas vezes menor do que o patch para o núcleo 6.11). Aproximadamente 46% de todas as mudanças apresentadas no 6.11 estão relacionadas a drivers de dispositivos, cerca de 17% dizem respeito à atualização de código específico para arquiteturas de hardware, 10% estão ligadas à pilha de rede, 5% às sistemas de arquivos e 3% às subsistemas internos do núcleo.
As principais inovações no núcleo 6.11:
- Subsistema de disco, entrada/saída e sistemas de arquivos
- Foi implementado suporte a operações atômicas de gravação em nível de bloco, nas quais ou todo o conjunto especificado de blocos é gravado no armazenamento, ou nenhum dos blocos é gravado, o que protege contra situações em que, após uma falha de hardware, apenas uma parte dos blocos é gravada, enquanto a outra parte ainda contém informações antigas. Para ativar o modo de gravação atômica, foi adicionado o flag RWF_ATOMIC na chamada de sistema pwritev(). Informações sobre suporte à gravação atômica (atomic_write_unit_min, atomic_write_unit_max e atomic_write_segments_max) em relação a arquivos individuais podem ser obtidas usando a função statx().
- Foi fornecido suporte para gravação em arquivos executáveis associados a processos em execução. Anteriormente, assim como em outros sistemas do tipo Unix, o núcleo gerava um erro ao tentar gravar em um arquivo executável de um processo em execução. Essa limitação foi removida, pois não fazia sentido prático.
- Foi implementada a possibilidade de desenvolver drivers de dispositivos de bloco na linguagem Rust. Como exemplo, um driver rnull foi adicionado ao núcleo, que é um análogo do driver null_blk, escrito na linguagem Rust.
- No sistema de arquivos Btrfs, a opção de montagem "rescue=" agora suporta os novos modos "ignoremetacsums" e "ignoresuperflags", que podem ser usados para mover algumas verificações para o espaço do usuário ao recuperar o sistema de arquivos após uma falha. A implementação da operação de retorno dinâmico de grupos de blocos foi reformulada para evitar a escassez de espaço livre em condições de preenchimento incompleto do sistema de arquivos.
- No sistema de arquivos ntfs3, foi implementado o suporte para os atributos "compressed" e "immutable", que definem arquivos comprimidos e imutáveis.
- No sistema de arquivos F2FS e Ext4, o tratamento de nomes de arquivos sem distinção entre maiúsculas e minúsculas (casefold) foi simplificado ao armazenar nomes na forma de strings qstr, sem conversões de caso desnecessárias.
- No sistema de arquivos Ext4, a implementação da função jbd2_transaction_committed foi otimizada para melhorar o desempenho em dispositivos de armazenamento muito rápidos (os testes mostraram um aumento no número de operações processadas por segundo, chegando a 20%).
- Na chamada de sistema statx(), agora é permitido passar um ponteiro NULL em vez de uma string vazia com o caminho do arquivo, caso o sinalizador AT_EMPTY_PATH esteja ativado.
- Na chamada de sistema open_by_handle_at(), as verificações de permissões de acesso ao arquivo foram suavizadas, no caso de não haver privilégios CAP_DAC_READ_SEARCH para pesquisa no espaço de nomes inicial. Anteriormente, a necessidade de privilégios CAP_DAC_READ_SEARCH para o espaço de nomes inicial impedia o uso da chamada de sistema open_by_handle_at() em contêineres.
- As capacidades das chamadas de sistema listmount() e statmount() foram ampliadas. No listmount(), foi adicionada a sinalização LISTMOUNT_REVERSE para exibir o conteúdo da tabela de pontos de montagem em ordem inversa (as entradas mais recentes no topo). No statmount(), foi implementada a exibição das opções definidas durante a montagem do sistema de arquivos. Em ambas as chamadas de sistema, agora é permitido operar sem acesso ao espaço de nomes inicial (quando há apenas acesso ao espaço de nomes local ou externo).
- No sistema de arquivos Bcachefs, foi implementado o suporte para a recuperação automática e transparente de dados problemáticos, utilizando códigos de recuperação de erros — se ocorrer um erro de entrada/saída durante a leitura ou se for calculada uma discrepância na soma de verificação, o bloco de dados problemático é automaticamente reescrito quando há redundância para sua recuperação.
- Memória e serviços do sistema
- Foram incluídos patches com a implementação de um novo mecanismo de bloqueio para tratadores de interrupções (BH, bottom-half), que permite o bloqueio das estruturas de dados utilizadas, sem impedir a execução paralela de código não relacionado. Observa-se que a alteração não apenas reduziu a latência para núcleos operando em modo de tempo real, mas também aumentou o desempenho dos núcleos normais (por exemplo, para alguns tipos de carga, o desempenho do subsistema de rede aumentou em 14,5%).
- O subsistema de entrada/saída assíncrona io_uring agora suporta operações para implementar as funções bind() e listen(), usadas na criação de sockets de rede receptores.
- Foi adicionado um conjunto de operações ioctl para o pseudo-Sistema de Arquivos NSFS (NameSpace FS), utilizado para trabalhar com espaços de nomes. Os novos ioctl permitem a conversão de identificadores de processos e grupos de threads entre diferentes espaços de nomes de identificadores de processos (PID namespace). ioctl semelhantes, que permitem a definição de descritores de arquivos de processos em espaços de nomes separados com base em identificadores pidfd, também foram adicionados ao pseudo-Sistema de Arquivos pidfd.
- Para programas BPF, foi adicionada a suporte para um novo iterador que trabalha com máscaras de bits, que pode ser usado, por exemplo, para iterar sobre bits individuais em áreas de memória, como cpumask. Foi introduzido um mecanismo para enviar notificações aos processos no espaço do usuário sobre a desconexão (detach/unregister) do objeto struct_ops. A variedade de tipos que podem ser usados em matrizes foi ampliada (por exemplo, agora é possível declarar matrizes com elementos dos tipos kptr, bpf_rb_root e bpf_list_head). Um mecanismo mais confiável para o Split BTF (BPF Type Format), usado para verificações de tipos em pseudocódigo BPF, foi proposto.
- Adicionado um subsistema que permite organizar o fornecimento de energia a dispositivos em uma ordem específica, no caso de um dispositivo precisar ser ativado antes de outro (por exemplo, na ativação de chips sem fio em plataformas Qualcomm).
- Adicionado o módulo "Sloppy logic analyzer", que permite a criação de analisadores lógicos simples de sinais, utilizando GPIO e funcionando em um núcleo de CPU separado.
- Foi adicionada a suporte a constantes em tempo de execução, que podem ser usadas em vez de variáveis inicializadas uma única vez. Por exemplo, constantes em tempo de execução podem ser aplicadas em vez de variáveis que armazenam um ponteiro e o tamanho para o cache dentry. Essas variáveis são definidas durante o carregamento e nunca são alteradas. A ideia é inserir os valores de tais variáveis diretamente nas instruções no código, eliminando os custos associados à manipulação de ponteiros.
- Continua o port para o branch Rust-for-Linux, relacionado ao uso da linguagem Rust como segunda linguagem para o desenvolvimento de drivers e módulos do núcleo (o suporte ao Rust não está ativo por padrão e não resulta na inclusão do Rust entre as dependências obrigatórias de compilação para o núcleo). Foi adicionado o suporte à versão 1.80 do Rust (a versão mínima ainda é a 1.78). Além das ferramentas anteriormente mencionadas para o desenvolvimento de drivers de dispositivos de bloco, a nova versão inclui abstrações para carregar firmware, acessar o espaço do usuário (uaccess) e manipular a estrutura 'page'.
- Para sistemas x86-64, foi implementada uma nova chamada de sistema uretprobe(), que otimiza o funcionamento do mecanismo de rastreamento uretprobe, permitindo monitorar os valores retornados por funções em aplicativos do espaço do usuário.
- Foram adicionados parâmetros de linha de comando do núcleo: 'reserve_mem' para reservar uma área de memória nomeada durante a inicialização e 'ramoops.mem_name' para uso na área de memória pstore criada através de reserve_mem.
- No controlador de memória baseado em cgroup, no arquivo memory.reclaim, que define as configurações de desalocação de memória, foi adicionado o parâmetro 'swappiness', que permite alterar o equilíbrio entre desalocar páginas anônimas de memória para a partição de swap e liberar páginas de memória ocupadas pelo cache de arquivos.
- Foi adicionado um interface ioctl PROCMAP_QUERY para uma busca mais eficiente de áreas de memória virtual (Virtual Memory Area) em /proc/PID/maps.
- Na chamada de sistema mmap(), foi adicionado o flag MAP_DROPPABLE para solicitar memória que nunca será despejada para a partição de swap, mas que, em caso de falta de memória, pode ser removida.
- Para a arquitetura ARM64, foi implementado o suporte para conexão quente (troca para os modos online/offline) de CPUs físicas e virtuais em sistemas com ACPI.
- A arquitetura RISC-V agora suporta a conexão a quente da memória e adicionou suporte para o plugin GCC STACKLEAK (que inicializa todas as variáveis armazenadas na pilha para evitar a fuga de informações do núcleo através de variáveis não inicializadas que podem conter restos de dados anteriormente salvos na pilha).
- Removido o mecanismo de mapeamento de memória EFI (fake EFI memory map) durante o processo de inicialização. Este mecanismo não era utilizado na prática e dificultava o desenvolvimento na área de execução confidencial. máquinas virtuais.
- O suporte à plataforma PowerPC 40x foi descontinuado.
- Os requisitos para a versão do GNU Make foram aumentados — para compilar o núcleo, é necessário pelo menos uma versão do GNU Make publicada em 2013.
- Virtualização e segurança
- Integrados patches que aceleram significativamente (até 15 vezes) a obtenção de números aleatórios através da chamada de sistema getrandom(). A otimização é baseada na utilização do mecanismo vDSO (virtual dynamic shared object), que permite mover o manipulador da chamada de sistema do núcleo para o espaço do usuário e evitar trocas de contexto. A implementação da chamada de sistema é carregada no espaço de endereços do processo diretamente pelo núcleo.
- Para sistemas x86-64, foi incluída uma nova implementação do algoritmo de criptografia AES-GCM, que suporta o uso de instruções vetoriais VAES, VPCLMULQDQ e AVX512/AVX10 para acelerar os cálculos. Em testes realizados, o ganho de desempenho após a transição para a nova implementação chega a 156%. A implementação em assembler do AES-GCM foi completamente reescrita considerando a correção, desempenho, tamanho e documentação abrangente do código.
- Implementada a possibilidade de executar o núcleo como um sistema convidado em ambientes virtualizados que utilizam a extensão de processador AMD SEV-SNP (Secure Nested Paging), destinada a garantir a operação segura com tabelas de páginas de memória aninhadas. Para uma maior isolação do acesso a recursos a partir de máquinas virtuais, pode ser utilizado o módulo SVSM (Linux Secure VM Service Module). No hipervisor KVM foi adicionada a suporte inicial para a execução de sistemas convidados, protegidos com AMD SEV-SNP.
- Adicionado um alocador de slab bucket separado, ativado através do parâmetro CONFIG_SLAB_BUCKETS, que oferece proteção contra ataques utilizando a técnica de "heap spraying."
- No hypervisor KVM foi adicionado um chamado ioctl para pré-alocação de memória para o sistema convidado antes do seu lançamento real.
- Subsistema de Rede
- Foi adicionado o parâmetro sysctl net.tcp_rto_min_us, através do qual é possível configurar o tempo limite mínimo de retransmissão (retransmission timeout) para sockets TCP.
- Na utilidade ethtool, foi adicionada a capacidade de ajustar finamente a configuração dos manipuladores de interrupção para interfaces de rede que utilizam a interface Net DIM.
- Hardware
- O driver AMDGPU agora possui suporte inicial para GPU AMD RDNA4 ("GFX12"). O suporte para as tecnologias DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 e MMHUB 4.1 foi adicionado.
- O trabalho no driver drm (Direct Rendering Manager) Xe para GPUs baseadas na arquitetura Intel Xe foi continuado, a qual é utilizada em placas de vídeo Intel da família Arc e gráficos integrados, a partir de processadores Tiger Lake. O suporte para GPUs baseadas nas microarquiteturas Battlemage, Arrow Lake e Lunar Lake foi aprimorado.
- No subsistema DRM (Direct Rendering Manager), o manipulador para os parâmetros EDID (Extended Display Identification Data) fornecidos pelo monitor foi reescrito.
- No driver i915, foi adicionado suporte para GPUs Battlemage Xe2 e o modo CMRR (Content Match Refresh Rate) foi habilitado por padrão.
- No driver DRM msm (GPU Qualcomm Adreno), foi adicionado suporte para a plataforma SM7150 e GPUs X185 e a505.
- Adicionado suporte para painéis de tela Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- No subsistema de áudio, foi adicionado suporte para chips e codecs Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 e Texas Instruments PCM5242.
- Foi feita a porção final de alterações, garantindo suporte para o ARM SoC Snapdragon X Elite, que utiliza um CPU Qualcomm Oryon de 12 núcleos e GPU Qualcomm Adreno. O chip é voltado para uso em laptops e PCs, superando em muitos testes de desempenho os chips Apple M3 e Intel Core Ultra 155H. As alterações adicionadas ao kernel 6.11 estão relacionadas ao suporte para GPU Adreno X1-85 e gerenciamento de consumo de energia. Entre os dispositivos baseados no SoC Snapdragon X Elite, foram anunciados suporte para os laptops ASUS Vivobook S15 e Lenovo Yoga Slim7x.
Simultaneamente, a Fundação de Software Livre da América Latina criou uma versão totalmente livre do núcleo 6.11 — Linux-libre 6.10-gnu, purificado de elementos de firmware e drivers que contêm componentes ou trechos de código não livres, cuja utilização é restrita pelo fabricante. Na versão 6.11, o código de limpeza de blobs nos drivers mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth e tas2781 foi atualizado. A limpeza de novos drivers amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 e pcie-rcar-gen4 foi realizada. A limpeza de nomes de blobs em arquivos dts (devicetree) para a arquitetura Aarch64 foi executada. Uma versão dos primitives para carregamento de firmware que não emite avisos e solicitações (nowait-nowarn) foi adicionada. O código para determinar os primitives de carregamento de firmware no código em Rust foi incluído.
Fonte: opennet.ru
