No Linux e no Windows, estou acostumado com a situação de precisar de um kernel de 64 bits para ter um sistema com multiarch/WoW onde posso executar software de 32 e 64 bits lado a lado.
E então, anos atrás, fiquei impressionado quando alguém me mostrou que o MacOS 10.6 Snow Leopard poderia executar aplicativos de 64 bits com o kernel no modo de 32 bits. Isso pode ser amplamente esquecido agora porque foi uma transição tecnológica única. Com o hardware à frente da curva no espaço móvel, até onde eu sei, isso nunca foi necessário na mudança para 64 bits para iOS e Android.
Minha pergunta: O que seria necessário para obter a mesma capacidade em um kernel Linux de 32 bits (i386 ou armhf)?
Eu entendo que isso provavelmente não é trivial. Se fosse, a Microsoft poderia ter colocado o recurso no Windows XP de 32 bits. Mas quais são os requisitos gerais? Já houve uma proposta de patch ou prova de conceito?
No mundo incorporado, acho que isso seria especialmente útil, pois o suporte de 64 bits pode ficar para trás por muito tempo nos drivers de dispositivo.
A execução de aplicativos de 64 bits requer algum suporte do kernel: o kernel precisa pelo menos configurar tabelas de páginas, tabelas de interrupção etc. contexto ao alternar entre aplicativos (e de aplicativos para o kernel e vice-versa). Assim, um kernel puramente de 32 bits não pode suportar espaço de usuário de 64 bits.
No entanto, um kernel pode executar código de 32 bits no espaço do kernel, enquanto suporta código de 64 bits no espaço do usuário. Isso envolve um tratamento semelhante ao suporte necessário para executar aplicativos de 32 bits com um kernel de 64 bits: basicamente, o kernel precisa suportar as interfaces de 64 bits que os aplicativos esperam. Por exemplo, ele precisa fornecer algum mecanismo para o código de 64 bits chamar o kernel e preservar o significado dos parâmetros (em ambas as direções).
A questão então é se vale a pena. No Mac e em alguns outros sistemas, um caso pode ser feito, pois o suporte ao código do kernel de 32 bits significa que os drivers não precisam fazer a troca simultaneamente. No Linux, o modelo de desenvolvimento é diferente: qualquer coisa no kernel é migrada conforme necessário quando grandes mudanças são feitas, e qualquer coisa fora do kernel não é realmente suportada pelos desenvolvedores do kernel. O suporte à área de usuário de 32 bits com um kernel de 64 bits é certamente útil e vale o esforço (pelo menos, foi quando o suporte x86-64 foi adicionado), não tenho certeza se há um caso a ser feito para 64 bits em 32 -pedaço...
Snow Leopard foi capaz de executar binários de 64 bits em uma CPU Intel de 64 bits.
Também foi capaz de inicializar com um kernel de 64 bits quando seu efi já era de 64 bits (meu lote de produção do Macbook "transition-model" pro já era uma máquina dessas).
Não houve emulação envolvida, você apenas pagou um custo de desempenho menor ao inicializar no modo de 32 bits.
Em CPUs puras de 32 bits, você não poderá fazer isso, pois eles não têm ideia de como interpretar código de 64 bits. A menos que você esteja emulando com software, o que seria muito lento para esse tipo de classe de máquinas incorporadas tradicionalmente fracas.