Como Gilles menciona, em qualquer lugar que o FPU possa ser usado, o kernel precisa suportar salvar e restaurar seu estado. Como o espaço do usuário pode usar o FPU, isso precisa ser tratado em qualquer caso em comutadores de contexto ( ie , quando a CPU atual alterna de um thread para outro) - pelo menos, quando a execução anterior thread usou o FPU. Então, por que não estender isso ao kernel?
Existem algumas razões para evitar o uso do FPU no kernel:
- do ponto de vista da portabilidade, algumas arquiteturas não suportam o uso do FPU no kernel, portanto, o código genérico não pode confiar nele;
- salvar e restaurar o estado da FPU é caro e introduz certas restrições relacionadas à implementação (no x86 Linux, a preempção em particular precisa de uma consideração cuidadosa aqui).
Fazer o kernel evitar o uso do FPU significa que o custo do espaço do usuário pode ser reduzido: o estado do FPU só precisa ser restaurado após uma mudança de contexto ao retornar ao espaço do usuário (ao contrário de imediatamente após uma mudança de contexto), e não em todos os casos (somente quando as threads envolvidas realmente usam o FPU).
é possível usar o FPU (e MMX / SSE / AVX) no kernel, em código específico do x86, onde os benefícios superam os custos: assim ele acaba sendo usado no código de criptografia e RAID6. Esses e-mails do Linus fornecem mais alguns detalhes. Se você quiser usar o FPU, precisará colocar o bracket em todas as FPUs, usando o código entre kernel_fpu_begin
e kernel_fpu_end
, e certifique-se de que ele não possa falhar ou adormecer. Consulte arch/x86/include/asm/fpu/api.h
e arch/x86/kernel/fpu/core.c
para detalhes.
Para memcpy
, os ganhos de desempenho não superam o custo do uso da FPU.
(x86 tem uma arquitetura FPU bastante complexa, mas fornece todos os recursos necessários para permitir que um sistema operacional compartilhe o FPU: ele pode interceptar sempre que uma instrução FPU é emitida, o que permite que o kernel otimize processos que nunca usa o FPU, e pode indicar quando o estado da CPU e do FPU é capaz de divergir.Ele também fornece instruções para salvar e restaurar o estado do FPU - FSAVE
, FXSAVE
e XSAVE
dependendo do vintage da FPU O suporte a FPU é talvez o aspecto do design do 8086, no qual os projetistas tiveram a maior visão .