O que é necessário para executar o software de usuário de 64 bits em um kernel de 32 bits?

9

No Linux e Windows, estou acostumado com a situação que eu preciso de um kernel de 64 bits para ter um sistema com multiarch / WoW onde eu possa rodar softwares de 32 e 64 bits lado a lado. / p>

E então, anos atrás, me surpreendeu quando alguém me mostrou que o MacOS 10.6 Snow Leopard podia rodar aplicativos de 64 bits com o kernel no modo de 32 bits. Isso pode ser esquecido em grande parte 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 o 64-bit para iOS e Android.

Minha pergunta: O que seria necessário para obter o mesmo recurso 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. Quais são os requisitos gerais embora? Alguma vez já foi proposto um patch ou uma prova de conceito?

No mundo incorporado, acho que isso seria especialmente útil, já que o suporte para 64 bits pode ficar para trás por muito tempo nos drivers de dispositivos.

    
por jdonald 13.11.2018 / 06:09

2 respostas

16

A execução de aplicativos de 64 bits requer algum suporte do kernel: o kernel precisa, pelo menos, configurar tabelas de páginas, interromper tabelas etc. conforme necessário para suportar a execução de código de 64 bits na CPU e precisa salvar Contexto de 64 bits ao alternar entre aplicativos (e de aplicativos para o kernel e vice-versa). Assim, um kernel puramente de 32 bits não é compatível com o espaço do 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 para 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 alterações são feitas, e qualquer coisa fora do kernel não é realmente suportada pelos desenvolvedores do kernel. Suportar userland de 32 bits com um kernel de 64 bits é certamente útil e vale a pena 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 -bit ...

    
por 13.11.2018 / 08:12
3

O Snow Leopard conseguiu executar binários de 64 bits em uma CPU Intel de 64 bits.

Também foi possível inicializar com um kernel de 64 bits quando o seu efi já era de 64 bits (meu lote de produção do Macbook "transition-model" pro já era uma máquina desse tipo).

Não houve emulação envolvida, você acabou de pagar um custo de desempenho menor ao inicializar no modo de 32 bits.

Em CPUs de 32 bits, você não poderá fazer isso, pois não tem idéia de como interpretar o código de 64 bits. A menos que você esteja emulando um software, o que seria lento para esse tipo de classe incorporada de máquinas tradicionalmente fraca.

    
por 13.11.2018 / 07:03