Não possuo um 286 e não pretendo executar o Linux em um. No entanto, como o 286 possui modo protegido, por que se afirma frequentemente que o Linux requer uma CPU 386 ou superior?
Em http://tuxmobil.org/286_mobile.html , parece que a versão ELKS do Linux pode ser executada em um 286, está correto? Quais (se houver) modificações foram feitas para permitir que o kernel execute na CPU 286?
Agora, obviamente, entendo que um kernel compilado para um 386 não pode ser executado em uma CPU 286, que é de 16 bits. Portanto, minha pergunta é: por que o kernel padrão do Linux não pode ser compilado para um 286 e depois executado no 286? O Linux exige suporte a hardware VM86?
linux-kernel
hardware-compatibility
ioctlvoid
fonte
fonte
Respostas:
O modo protegido (PM) 286 é fundamentalmente diferente do que o 386 oferece. Pense no 286 PM como um protótipo, que tinha tantas deficiências que quase ninguém nunca o usou, e a coisa toda foi completamente redesenhada do zero para o 386.
Ele não usava um modelo de memória plana, usava um modelo segmentado como o modo real, o que significava que era preciso pular os bastidores para acessar a memória em blocos maiores que 64kB por vez.
Era completamente incompatível com todos os programas (MS-DOS) disponíveis no momento; portanto, quando você estava no PM, não podia usar nenhum dos programas a que estava acostumado.
Você também não podia sair do modo protegido novamente, a menos que reiniciasse o PC, então os fabricantes criaram soluções criativas, como colocar um sinalizador na RAM e escrever um valor mágico no controlador do teclado, o que acionaria o pino de redefinição da CPU para reiniciar o PC. máquina. A primeira coisa que o BIOS faria é detectar o sinalizador definido anteriormente, onde retornaria ao programa original em vez de executar a rotina POST, permitindo que o programa original continuasse executando após "sair" do PM.
Isso significava que o uso do 286 PM impedia a execução de programas DOS normais sem um grande número de truques. Numa época em que havia apenas programas DOS, não valia a pena o esforço de usar o PM.
Portanto, acabou sendo mais complicado trabalhar com o 286 PM do que apenas viver sem ele, e contar com o EMS e o XMS para acessar a memória extra. Várias 286 placas-mãe tinham suporte de chipset para o EMS, para que você pudesse usar toda a memória extra do sistema sem a necessidade de PM.
A Intel reconheceu essas deficiências e produziu um novo PM completamente diferente no 386. O modelo de memória plana simplifica o acesso à memória em um pedaço de até 4 GB. A CPU pode entrar e sair da PM com algumas instruções, para que não sejam necessários protocolos de reinicialização desajeitados. VM86 significa que na maioria das vezes você nem precisa sair do PM, você pode executar programas DOS enquanto ainda está no PM.
Todas essas melhorias fizeram com que o 386 PM não fosse apenas mais funcional, mas também significativamente mais compatível.
Em outras palavras, a única coisa em comum entre o modo protegido 286 e 386 é o nome. É por isso que os sistemas operacionais PM geralmente são 386 ou mais recentes. Adicionar suporte para o 286 PM seria um esforço totalmente independente, com pouco ou nenhum código capaz de ser compartilhado com o 386 PM completamente diferente.
Por outro lado, o 386 PM funciona da mesma maneira até a última das CPUs de 32 bits, e mais além se você executar o software de 32 bits nas CPUs de 64 bits.
fonte
Existem partes no kernel gravadas em assembly e elas teriam que ser reescritas para suportar 286.
Com relação ao ELKS, nas perguntas frequentes, eles indicam que é um subconjunto do kernel do Linux, então talvez eles tenham apenas as necessidades absolutas.
fonte
Eu acho que a verdadeira resposta para minha pergunta é esta:
Todas as principais arquiteturas de CPU (ou suas principais revisões) requerem algum código de suporte à montagem além do código C.
Mesmo se você conseguisse que o GCC compilasse o kernel do Linux no código de máquina 286 de 16 bits, ainda estaria faltando o código essencial de montagem compatível com 286 de 16 bits.
Em outras palavras, o kernel seria apenas parcialmente construído. Qualquer código de montagem específico da arquitetura falha ao montar, pois simplesmente não é escrito para essa arquitetura.
Com base nisso, estou assumindo que é exatamente isso que, por exemplo, o ELKS e projetos similares fazem quando o Linux é implementado no 286 ou em outras arquiteturas - eles implementam esse código de suporte à montagem ausente.
fonte
O 80386 suporta paginação além da segmentação de memória, enquanto o 286 suporta apenas segmentação de memória. O Linux depende muito do suporte à paginação, ou seja, usa um esquema de memória plana que basicamente define todos os registros de segmento como 0 e usa paginação para gerenciar aplicativos. Para portar o Linux para o 286, o gerenciador de memória fundamental precisa de uma reformulação completa para funcionar no modo segmentado sem paginação, o que provavelmente é muito trabalhoso.
fonte
Eu não sou um cara de montagem, mas de acordo com isso :
O 386 representa um conjunto de instruções expandido do 286, para quem sabe o quão difícil seria a porta. Evidentemente, quase ninguém se deu ao trabalho de tentar ... Acho que você pode perguntar ao pessoal do ELKS sobre isso.
fonte
A maior razão é que o projeto original GNU se destinava a máquinas de 32 bits (como as estações de trabalho Unix de meados dos anos 80), em vez de se preocupar em oferecer suporte a algo menor, de modo que toda a cadeia de ferramentas GNU era inadequada para a geração de código de 16 bits. Portar o kernel Linux inicial, pesado em conjunto e usando segmentos para o 286 seria mais fácil do que qualquer outro destino de portabilidade - se o GCC tivesse a capacidade de produzir código em modo protegido 286. Mas apontar o GCC para o modo protegido 286 teria sido um projeto enorme para suportar um processador obsoleto.
fonte
Recentemente, o kernel do linux abandonou o 386 como uma plataforma suportada e o kernel do Linux NÃO suporta processadores Intel 286. O 80286 não é um processador de 32 bits, necessário para inicializar.
fonte
O Linux x86 não pode ser facilmente transportado para o 80286 porque é um processador de 16 bits e o Linux x86 requer um processador de 32 bits.
Mais especificamente, os registros no 286 ainda tinham apenas 16 bits de largura. Nenhum dos registros EX estava disponível. Além disso, os segmentos e deslocamentos da memória ainda tinham apenas 16 bits. Os programas ainda tinham que lidar com código e dados próximos / remotos.
Isso significa que o Linux / 286 precisaria de um kernel e API de usuário radicalmente diferente do Linux / 386. Todo arquivo de origem do assembly e muitos arquivos de origem C precisariam ser reescritos. Seria a diferença entre a programação do Win16 e do Win32.
Em resumo, você não pode simplesmente dizer ao GCC para compilar para uma CPU diferente. Cada pedaço de código precisaria ser reescrito para um ambiente de 16 bits.
fonte
Pelo que li, a maneira canônica de executar o Linux no 80286 seria executá-lo dentro de uma máquina virtual. Foi o que Fabrice Bellard fez aqui . Você precisaria implementar a máquina virtual ou porta um.
fonte