Após dois meses de desenvolvimento, Linus Torvalds apresentou lançamento do núcleo Linux 6.19. Entre as mudanças mais notáveis estão: o subsistema Live Update Orchestrator, suporte para PCIe Link Encryption, a chamada de sistema listns, o modo Zero-Copy Receive no io_uring, suporte à extensão ARM MPAM, klp-build para geração de patches ao vivo, suporte à arquitetura LoongArch32, QoS para s2idle, otimização do subsistema de auditoria, Intel LASS para proteção contra Spectre, suporte a hashes SHA-3 e BLAKE2b, o mecanismo Confidential VMBus, otimizações TX no subsistema de rede, protocolo CAN XL, API para aceleração de hardware HDR.
No anúncio da nova versão, Linus informou que a próxima versão do kernel será numerada como 7.0, pois na ramificação 6.x acumulou-se um número suficiente de lançamentos para alterar o primeiro número na numeração da versão (a versão 6.0 foi formada logo após a 5.19). A mudança de numeração é realizada por motivos estéticos e é um passo formal que alivia o incomodo devido ao acúmulo de uma grande quantidade de lançamentos na série. Linus brincou que grandes números o confundem, pois não há dedos suficientes nas mãos e nos pés para contá-los. Entretanto, formalmente existe um motivo para uma mudança significativa na numeração da versão, pois a partir de a próxima versão será o suporte ao Rust foi resolvido transferido de recursos experimentais para funções principais do kernel.
A nova versão inclui 15657 correções de 2237 desenvolvedores, o tamanho do patch é de 52 MB (as alterações afetaram 13682 arquivos, 794649 linhas de código foram adicionadas, 335498 linhas foram removidas). A versão anterior teve 15035 correções de 2217 desenvolvedores, e o tamanho do patch foi de 45 MB. Cerca de 40% de todas as mudanças apresentadas no 6.19 estão relacionadas a drivers de dispositivos, aproximadamente 13% das alterações estão relacionadas à atualização do código específico de arquiteturas de hardware, 12% estão ligadas à pilha de rede, 5% a sistemas de arquivos e 3% a subsistemas internos do kernel.
As principais inovações no kernel 6.19 (1, 2, 3):
- Subsistema de disco, entrada/saída e sistemas de arquivos
- Em Btrfs processos de verificação de FS (scrub) e substituição de dispositivos não bloqueiam a transição do sistema para o modo de suspensão (antes de entrar em suspensão, o estado da verificação scrub é salvo; após a saída do modo de suspensão, a verificação scrub continua e a operação de substituição de dispositivos é reiniciada). A implementação do RAID56 foi adicionada para suportar blocos que excedem o tamanho da página de memória. Preparação foi realizada para suportar fscrypt. O desempenho do trabalho com bloqueios durante operações relacionadas à reserva de espaço foi melhorado. Adicionada suporte à operação ioctl shutdown, permitindo que o sistema de arquivos seja colocado em um estado onde se tenta concluir operações já iniciadas, mas todas as novas operações são bloqueadas.
- No sistema de arquivos Ext4 incluída suporte a blocos cujo tamanho excede o tamanho da página de memória (>4KB em sistemas x86). O uso de blocos grandes permite aumenta o desempenho das operações de escrita em buffer em média em 50%, mas reduz o desempenho da entrada/saída direta devido ao aumento do tempo de cálculo de somas de verificação. Na nova versão também foram adicionados otimizações que aumentaram a largura de banda durante a desfragmentação online.
- No subsistema FUSE melhorado o suporte à leitura em buffer ao usar grandes de folhetos de páginas de memória (folios grandes). Através do iomap, foi implementada a capacidade de rastrear folios parcialmente atualizados para carregar apenas os dados ausentes no buffer.
- Em VFS adicionado suporte para delegação de diretório recuperável (recallable directory delegation), permitindo implementar em NFS passar o controle do diretório do servidor para o cliente, para que o cliente NFS possa rastrear o estado do diretório com base no cache local, sem consultar o servidor NFS. Se outro cliente NFS fizer alterações relacionadas a esse diretório, a delegação de controle será revogada do primeiro cliente.
- Para NFS foi adicionada suporte para leitura em modo de entrada/saída direta (direct I/O). Implementados as configurações /sys/kernel/debug/nfsd/io_cache_read e /sys/kernel/debug/nfsd/io_cache_write para controlar a ativação de cache e operações de entrada/saída direta, manipular essas configurações permite reduzir a sobrecarga do lado do cliente NFS durante grandes operações de entrada/saída.
- Em NTFS implementado suporte à operação ioctl shutdown, estão incluídas por padrão, as opções de montagem acl e prealloc, adicionado suporte para tempo até 1 de janeiro de 1970.
- Para dispositivos de blocos e FS incluído por padrão, o cache de objetos é separado para cada CPU "bio" (Block I/O), definindo operações ativas de entrada/saída.
- Memória e serviços do sistema
-
No núcleo incluída subsystem Live Update Orchestrator (LUO), permitindo reiniciar e atualizar completamente o núcleo sem parar o funcionamento e sem perder o estado do sistema, dispositivos e processos. O subsistema LUO é baseado no mecanismo previamente adicionado ao núcleo. KHO (Kexec HandOver) e, além de permitir a inicialização de um novo núcleo a partir de um antigo sem perder o estado do sistema, resolve questões como a preservação do estado dos dispositivos e da memória operacional, bem como garantir a continuidade das operações relacionadas ao DMA e ao tratamento de interrupções. O estado é preservado até a troca para o novo núcleo e recuperado após a ativação do novo núcleo sem interromper operações contínuas com dispositivos realizadas pelo sistema e aplicações no espaço do usuário.
-
Adicionado chamada de sistema listns() para exibir a lista de namespaces existentes no sistema sem a necessidade de percorrer /proc//ns/ para todos os processos.
O sistema assíncrono de entrada/saída io_uring foi atualizado para suportar a colocação de elementos de tamanhos diferentes na fila de envio (SQE, Submission Queue Entry), seguindo a mesma lógica que permitiu, na versão anterior, a mistura de tamanhos de conteúdo na fila de resultados (CQE, Completion Queue Event). Antes, todos os elementos na fila tinham que ter o mesmo tamanho, o que levava a um consumo excessivo de memória por causa da necessidade de usar o tamanho máximo para todos os elementos na fila.
O io_uring também adicionou suporte ao mecanismo zcrx (Zero-Copy Receive) para receber dados sem cópia entre o núcleo e o espaço do usuário. O suporte para consultas de mapeamento de memória das filas SQ (Submission Queue) e CQ (Completion Queue) foi adicionado, permitindo obter informações sobre o tamanho do buffer circular necessário ao alocar memória pelo usuário usando as flags IORING_SETUP_NO_MMAP e IORING_MEM_REGION_TYPE_USER.
Para um rastreamento rápido de pilhas usando utilitários como perf, foi adicionado suporte ao formato SFrame com informações sobre a desmontagem da pilha de chamadas (unwind). O SFrame já é suportado no GCC e no binutils, não causa queda de desempenho e, ao contrário do formato DWARF, contém apenas o conjunto mínimo de informações necessárias para o rastreamento de pilha.
-
No utilitário perf foi adicionada suporte para descrições unificadas de métricas e eventos no formato JSON, bem como para a desmontagem adiada (deferred unwinding) da pilha de chamadas no espaço do usuário.
Para processadores AMD implementado um mecanismo de substituição de dados no cache, permitindo que dispositivos de entrada/saída coloquem dados diretamente no cache L3 da CPU sem a necessidade de colocá-los primeiro na RAM.
Suporte adicionado MPAM (Partitionamento e Monitoramento de Recursos do Sistema de Memória), extensões da arquitetura do conjunto de instruções ARMv8-A para marcar cada acesso à memória com um identificador de seção (PARTID, Partition ID) e um identificador de grupo de monitoramento (PMG, Monitoring Group ID). Relacionado ao PARTID, é possível limitar o consumo de recursos, como largura de banda de memória ou tamanho de cache, para que um grupo de tarefas não monopolize todos os recursos. No contexto de monitoramento, a combinação PMG e PARTID pode ser usada para rastrear o consumo de recursos de memória sob determinados tipos de carga.
Em caso de finalização inesperada do processo após receber um sinal, outro processo que possui o pidfd do processo terminado agora pode determinar o número do sinal que levou à finalização do processo.
A implementação de sequências reiniciáveis (restartable sequences), que permitem que aplicativos organizem a execução pseudo-atômica não interrompida de um grupo de instruções (em caso de interrupção por outro fluxo, uma nova tentativa de execução da sequência é feita). A nova implementação se destaca por um desempenho superior.
-
Para Programas BPF implementados instruções BPF_JMP, BPF_X e BPF_JA para realizar saltos indiretos para uma posição específica na tabela de saltos. Adicionada a concepção de ponteiros dinâmicos (dynptr), que permitem ler dados de arquivos estruturados. Adicionada a possibilidade de anexar múltiplos bytes com metadados a pacotes de rede.
Módulos na linguagem Python, utilizados para processar a documentação do núcleo, foram movidos para um diretório separado tools/lib/python.
-
Adicionada a função mempool_alloc_bulk() para alocar com segurança elementos de um pool de memória de uma só vez para vários objetos.
-
Continuou-se transferência de alterações da ramificação Rust-for-Linux, relacionados ao uso da linguagem Rust como segunda linguagem para o desenvolvimento de drivers e módulos do núcleo (o suporte a Rust não está ativado por padrão e não leva à inclusão do Rust como uma dependência obrigatória na compilação do núcleo). Na nova versão, o núcleo incorpora a biblioteca “syn” com um analisador de código Rust, facilitando a escrita de macros complexas. Expandidas as capacidades das bibliotecas kernel, pin-init e rbtree. Adicionada a biblioteca num com o tipo Integer para manipulação de números inteiros. No macro module! foi adicionada a suporte a parâmetros inteiros. Implementada a capacidade de especificar parâmetros ao carregar módulos do núcleo escritos em Rust. Realizadas abstrações para subsistemas I2C e PWM (Modulação por Largura de Pulso).
-
Adicionado a macro at_least (por exemplo, param[at_least 7], informando o tamanho mínimo permitido do array passado para a função. Se um array com um número menor de elementos for passado para a função, o compilador emitirá um aviso.
-
Inclui incluso o script klp-build para gerar módulos de núcleo que fazem alterações no núcleo em funcionamento (livepatch), com base em um arquivo de patch. Alterações necessárias para criar live-patches foram feitas na ferramenta objtool.
-
Em User-mode Linux (executando o núcleo como um processo do usuário) adicionou suporte limitado à multiprocessamento, mas os threads dentro de um único processo ainda não podem ser executados simultaneamente. Começou a portabilidade do User-mode Linux para a biblioteca nolibc.
-
Adicionada suporte para a arquitetura LoongArch32 (LA32R, LA32S) além de LoongArch64.
-
Adicionada a capacidade de definir limites de QoS para a intensidade de ativação do processador em modo de economia de energia s2idle (Suspend-To-Idle), congelando a execução de processos no espaço do usuário, mas mantendo alguns manipuladores no núcleo ativos.
-
Adicionada suporte para gerenciamento de tabelas de páginas de memória para controladores IOMMU (Unidade de Gerenciamento de Memória de Entrada e Saída), que realizam a tradução de endereços virtuais visíveis ao dispositivo de hardware em endereços físicos, com a capacidade de filtrar operações DMA por endereços virtuais, bem como restringir e isolar operações de entrada e saída.
Nas trilhas de eventos de chamadas de sistema, foi implementada a capacidade de ler buffers do espaço do usuário e incluir seu conteúdo (como nomes de arquivos) no resultado da trilha.
-
**Páginas de guarda de memória(( (guard page), cujo acesso gera uma exceção e encerra o processo de forma anômala (SIGSEGV), agora são marcadas com um rótulo especial no arquivo /proc/PID/smaps.
-
Adicionada capacidade de gerenciar páginas grandes de memória (transparent huge page) na memória privada de dispositivos zonificados.
-
No dispositivo zram, usado para armazenamento comprimido da partição de troca na memória, são implementadas suporte para expelir várias estruturas 'bio' (Block I/O) em modo de armazenamento em pacote (writeback batching).
Inclui a fonte ‘Terminus 10×18’, melhorando a legibilidade das informações no console em telas de laptops de resolução média (1440×900).
-
Significativamente otimizou-se trabalho sistemas de auditoria — observou-se uma redução de custos em duas vezes.
-
- Virtualização e segurança
- Adicionada suporte à capacidade fornecida pelos processadores Intel para particionamento separação do espaço de endereços linear (LASS, linear address-space separation), permitindo a separação de hardware dos intervalos de endereços entre o espaço do usuário e o núcleo para aumentar a segurança. O espaço de endereços é dividido pelo bit mais significativo do endereço - metade do espaço de endereços com o bit mais significativo definido é usada para o núcleo, enquanto a parte inferior é utilizada para o espaço do usuário. Em uma fase inicial da execução das instruções (antes da execução especulativa), é realizada uma verificação da validade do acesso do espaço do usuário a endereços com o bit mais significativo definido e vice-versa. Tal separação permite bloquear vazamentos de memória do núcleo para o espaço do usuário por canais laterais, mesmo durante a execução especulativa de instruções, possibilitando o uso do LASS para proteger contra ataques do tipo Meltdown e Spectre, sem grandes sobrecargas.
- Adicionada a capacidade de ativar extensões para aumentar a segurança do barramento PCI Express – PCIe Link Encryption e PCIe Device Authentication, que permitem autenticar e criptografar o canal de comunicação entre o dispositivo PCIe e a máquina virtual, protegida por meio dos mecanismos Intel TDX (Trusted Domain Extensions) e AMD SEV-SNP (Secure Nested Paging). As tecnologias implementadas não permitem interceptar, analisar ou alterar dados na traffic DMA ao ter acesso ao sistema host ou a outros dispositivos.
- Na biblioteca criptográfica integrada foi adicionada suporte a algoritmos SHA-3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512), SHAKE128, SHAKE256 e BLAKE2b.
- Para módulos LSM (Linux Security Modules) e, em particular para SELinux, são implementadas a capacidade de rastrear a criação de descritores memfd para aplicar políticas de segurança aos objetos relacionados.
- No módulo LSM IPE (Integrity Policy Enforcement), que define a política geral de integridade para todo o sistema, foi adicionada a suportar a flag AT_EXECVE_CHECK na função execveat(), que inclui a verificação de integridade do script antes de sua execução pelo interpretador.
- Adicionados os primitivas scoped_user_read_access(), scoped_user_write_access e scoped_user_rw_access() para acesso restrito a dados no espaço do usuário com proteção contra ataques especulativos.
- Adicionada suporte ao mecanismo Confidential VMBus, utilizado no hypervisor HyperV para interação protegida contra intervenções entre o sistema host, executado em modo confidencial (com criptografia de memória e isolamento de registradores com base nas tecnologias AMD SNP e Intel TDX), e o paravisor, responsável pelo acesso aos dispositivos que processam dados confidenciais.
- Adicionada a possibilidade de transmitir informações sobre um processo encerrado inesperadamente (para a geração de coredump) através do mecanismo pidfd. O identificador PIDFD está vinculado a um processo específico e não muda, enquanto o PID pode ser associado a outro processo após a conclusão do processo atual associado a esse PID. O uso do pidfd permite bloquear a substituição ataques do processo suid que falhou por outro processo, criando uma condição de corrida no momento após o início do tratamento do encerramento anômalo pelo kernel, mas antes da verificação pelo manipulador no espaço do usuário dos parâmetros do processo.
- Subsistema de Rede
- Na sub-rede foram feitas otimizações para aumentar a eficiência da transmissão de dados (TX). A eliminação da funcionalidade __dev_queue_xmit() de spin-locks e o uso da estrutura llist que opera sem bloqueios permitiu aumentar a performance em 4 vezes sob alta carga e dobrar a intensidade do envio de pacotes enquanto reduzia a carga na CPU em duas vezes.
- Foi fornecida a possibilidade desconectar para soquetes de rede individuais limites de sistema no uso de memória (neste caso, serão utilizados limites gerais de memória que são definidos para contêineres individuais). Para gerenciar a desativação desses limites, foi proposto sysctl net.core.bypass_prot_mem e a flag SK_BPF_BYPASS_PROT_MEM na função bpf_setsockopt.
- Adicionada suporte à extensão RFC 5837, que adiciona aos pacotes ICMP Time Exceeded, retornados quando o tempo de vida (TTL) do pacote expira, dados sobre as interfaces de rede de entrada para obter informações mais detalhadas ao traçar rotas usando a ferramenta traceroute.
- Adicionada suporte à polling ativo contínuo (busy polling) em um thread do kernel com o objetivo de extrair descritores das filas de RX/TX para aplicações que exigem latências mínimas.
- Adicionado suporte ao protocolo CAN XL (Controller Area Network eXtended Length), onde o tamanho do campo de dados foi aumentado para 2048 bytes para garantir a integração com redes TCP/IP, implementada a capacidade de tunelamento de quadros Ethernet e foi adicionado suporte a modulação por largura de pulso, permitindo a transmissão de dados a velocidades de 20 Mbit/s e acima.
- Adicionada suporte à estrutura sockaddr_unsized, uma variante da estrutura sockaddr, que utiliza um array com elementos flexíveis em vez de um array de tamanho fixo (sa_data[] em vez de sa_data[14], que basicamente era usado para referências a outras estruturas maiores).
- Foi adicionada a capacidade de usar a funcionalidade getsockname e getpeername através do subsistema io_uring.
- Adicionadas sysctl net.ipv4.tcp_rcvbuf_low_rtt e net.ipv4.tcp_comp_sack_rtt_percent para otimização de TCP.
- Adicionada suporte a links com largura de banda de 1600 Gbps (1.6T).
- Hardware
- Uma API para aproveitar as capacidades de hardware de conversão de cores foi adicionada ao subsistema DRM (Gerenciador de Renderização Direta), permitindo evitar a execução de tais transformações através de shaders ou execução de código na CPU. Para exibir conteúdo em monitores HDR, conversões complexas de cor agora podem ser realizadas pelo controlador de vídeo na fase antes e depois da mistura de camadas (blending), em vez da composição de conteúdo programática no buffer final de exibição. Além de reduzir a sobrecarga e o consumo de energia ao organizar a exibição em HDR, a funcionalidade proposta pode ser usada para reprodução correta de cores em editores de vídeo ou imagens.
- Adicionado driver ethosu para NPU Arm Ethos U65 e U85, destinados à aceleração de hardware da execução de modelos de IA.
- No driver i915 para GPU Lunar Lake e versões mais recentes, foi adicionada a suporte à melhoria de nitidez de imagem (Sharpening).
- Continua trabalho no driver drm (Gerenciador de Renderização Direta) Xe para GPU baseado na arquitetura Intel Xe, que é usada em placas gráficas Intel da família Arc e gráficos integrados, a partir dos processadores Tiger Lake. Suporte inicial para a arquitetura Xe3P foi adicionado, usada em GPUs Crescent Island e processadores da família com gráficos integrados Nova Lake.
- No driver AMDGPU, foi implementado suporte total para placas gráficas AMD da família GCN 1.0 'Southern Island' e 1.1 'Sea Islands', para as quais anteriormente era utilizado o driver Radeon. O driver AMDGPU foi atualizado para paridade com as capacidades do driver Radeon e ativado para as GPUs mencionadas por padrão. As placas GCN 1.x foram lançadas entre 2012 e 2019 e abrangem modelos como Radeon HD 77xx/78xx/79xx/87xx/88xx/89xx, Radeon R9 280, FirePro W4000-W9000, Radeon Sky 700/900, Radeon R9 265/270/370, Radeon R9 290/390, HD 7790/8870 e outras placas gráficas das famílias Radeon Rx 200/Rx 300. aumento um desempenho médio de 24%, a transição para AMDGPU permitiu implementar suporte ao API gráfico Vulkan 1.3 para esses GPUs. Além disso, o AMDGPU adicionou suporte a conectores analógicos e ao Video Coding Engine 1.0, além de utilizar por padrão a pilha DC (Display Core) para GPUs baseadas na microarquitetura Bonaire (Radeon HD 7790).
- No driver Nouveau são implementadas suporte ao acelerador de hardware NVJPG, presente no SoC Tegra210.
- No driver Panthor foi adicionada suporte ao GPU Mali-G1 e suporte inicial ao chip MediaTek MT8196.
- Adicionada suporte ao subsistema de som dos chips Intel Nova Lake S, notebooks HP com HDA CS35L41, além de interfaces de som CIX IPBLOQ HD e Onkyo SE-300PCIE.
- Continuou a integração de componentes do driver Nova para GPUs NVIDIA equipadas com firmwares GSP, usados desde a série NVIDIA GeForce RTX 2000 baseada na microarquitetura Turing. O driver é escrito em Rust. Na nova versão, foi iniciada a implementação de RPC e foi concluída. a realização da carga do coprocessador GSP (GPU System Processor).
- Adicionada suporte a placas ARM, SoC e dispositivos: Bananapi r4 pro, LinkEase EasePi R1, Qualcomm MSM8937 (Snapdragon 430), Renesas R-Car X5H, FriendlyElec NanoPi R76S, TI AM62L, Black Sesame Technologies C1200, Aspeed AST2600, Genio 1200 EVK, grinn geniosbc-510/700, Tanix TX9 Pro, Radxa Dragon Q6A, Tinker Board 3/3S, Aquila AM69, phyBOARD-Segin-i.MX91, i.MX 95 Verdin Evaluation Kit, Toradex SMARC iMX95, VIDIA Jetson Nano 2GB, Renesas rz/g3s, Indiedroid Nova, 24 variantes de placas Enclustra Mercury.
- Adicionado suporte para smartphones e tablets baseados no SoC Mediatek MT6582 (Alcatel yarisxl), Nvidia Tegra124 (Xiaomi Mi Pad) e Qualcomm MSM8939 (ASUS ZenFone 2). Adicionado suporte para laptops baseados em SoC Qualcomm sdm850, como o Huawei MateBook E 2019.
- Adicionado suporte a SoC e placas baseadas na arquitetura RISC-V: OrangePi R2S, OrangePi RV, Anlogic dr1v90, Tenstorrent Blackhole.
Ao mesmo tempo, a Fundação Latino-Americana de Software Livre formou uma variante novo kernel totalmente livre 6.19 — Linux-libre 6.19-gnu, limpo de elementos de firmwares e drivers que contêm componentes não livres ou partes de código cuja aplicação é restrita pelo fabricante. Na versão 6.19, o código para carregar firmwares binários foi removido do subsistema de som SDCA. O código de limpeza de blobs nos drivers Intel XE, Nova-Core, Qualcomm Iris, Venus e Q6V5, TI PRUeth, Intel iwlwifi, Marvell mwifiex, FourSemi fs210x, Realtek rt1320 e codecs de som TI tas2783 foi atualizado. A limpeza dos nomes dos blobs em arquivos dts (devicetree) para chips ARM foi realizada. A limpeza do driver STM C8SECTPFE DVB foi interrompida, removida do kernel.
Fonte: linux.org.ru
