Existem partes no kernel escritas em assembly e elas teriam que ser reescritas para suportar 286.
Em relação ao ELKS, em seu FAQ eles indicam que é um subconjunto do kernel do Linux, então talvez tenham portado apenas as necessidades absolutas.
Eu não tenho um 286 nem pretendo rodar Linux em um. No entanto, como o 286 tem modo protegido, por que é freqüentemente afirmado que o Linux requer uma CPU 386 ou superior?
De link , parece que a versão ELKS do Linux pode rodar em um 286, isso está correto? Quais (se houver) modificações foram feitas para permitir que o kernel seja executado na CPU 286?
Agora, obviamente, eu entendo que um kernel compilado para um 386 não pode ser executado em uma CPU 286, que é de 16 bits. Então, minha pergunta é: por que o kernel Linux padrão não pode ser compilado para um 286, e então executado em um 286? O Linux requer suporte a hardware VM86?
Existem partes no kernel escritas em assembly e elas teriam que ser reescritas para suportar 286.
Em relação ao ELKS, em seu FAQ eles indicam que é um subconjunto do kernel do Linux, então talvez tenham portado apenas as necessidades absolutas.
Acho que a verdadeira resposta à minha pergunta é esta:
Toda grande arquitetura de CPU (ou grande revisão dela) requer algum código de suporte de montagem além do código C.
Mesmo que você tenha o GCC compilando o kernel do Linux no código de máquina 286 de 16 bits, ainda assim, faltaria o código de assembly compatível com o 286 de 16 bits.
Em outras palavras, o kernel seria, na melhor das hipóteses, apenas parcialmente construído. Qualquer código de montagem específico da arquitetura falharia na montagem, uma vez que simplesmente não é escrito para essa arquitetura.
Com base nisso, estou assumindo que isso é exatamente o que, por exemplo, ELKS e projetos similares fazem quando implementam o Linux no 286 ou outras arquiteturas - eles implementam esse código de suporte de montagem ausente.
O 80386 suporta paginação, além de 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 simples que basicamente define todos os registradores 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 trabalhar no modo segmentado sem paginação, o que provavelmente é muito trabalhoso.
Does Linux require hardware VM86 support?
Eu não sou um cara de montagem, mas de acordo com isso :
As the original implementation of the 32-bit extension of the 8086 architecture, the 80386 instruction set, programming model, and binary encodings are still the common denominator for all 32-bit x86 processors, this is termed x86, IA-32, or i386-architecture, depending on context.
O 386 representa um conjunto de instruções expandido do 286, então quem sabe o quão difícil é o porto seria. Evidentemente, quase ninguém se incomodou em tentar ... Acho que você pode perguntar às pessoas da ELKS sobre isso.
A maior razão é que o projeto GNU original visava a máquinas de 32 bits (como workstatons do Unix em meados da década de 1980) ao invés de se preocupar em suportar qualquer coisa menor, então todo o conjunto de ferramentas GNU era inadequado para geração de código de 16 bits. Portar o kernel Linux mais antigo, com maior número de segmentos de montagem, para o 286 teria sido mais fácil do que qualquer outro destino de portabilidade - se o GCC tivesse a capacidade de produzir 286 códigos de modo protegido. Mas apontar o GCC no 286 modo protegido seria um grande projeto para suportar um processador obsoleto.
O modo protegido 286 (PM) é fundamentalmente diferente do que o 386 oferece. Pense no 286 PM como um protótipo, que teve tantas deficiências que quase ninguém nunca usou, e a coisa toda foi completamente redesenhada desde o início para o 386.
Ele não usava um modelo de memória simples, ele usava um modelo segmentado como o modo real, o que significava que você tinha que saltar através de aros para acessar a memória em blocos maiores que 64kB de cada vez.
Era completamente incompatível com todos os programas (MS-DOS) disponíveis no momento, então, uma vez que você estivesse em PM, você não poderia usar nenhum dos programas que estava acostumado.
Você também não podia deixar o modo protegido novamente, a menos que você reiniciasse o PC, então os fabricantes criaram soluções criativas como colocar um sinalizador na RAM e escrever um valor mágico para o controlador de teclado, que apertaria o pino de reinicialização do processador. para reiniciar a máquina. A primeira coisa que o BIOS faria é detectar o sinalizador definido anteriormente, em que ele retornaria ao programa original em vez de executar a rotina POST, permitindo que o programa original continuasse sendo executado com a saída "PM".
Isso significava que o uso do 286 PM impedia que você executasse programas DOS normais sem um grande número de truques. No momento em que havia apenas programas do DOS, não valeu a pena o esforço de usar o PM.
Então, acabou sendo mais complicado trabalhar com o 286 PM do que apenas viver sem ele, e confiar no EMS e no XMS para acessar a memória extra. Um número de 286 placas-mãe tinha suporte a chipset para 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 torna o acesso à memória em um bloco de até 4 GB simples. A CPU pode entrar e sair da PM com algumas instruções, portanto não são necessários protocolos de reinicialização desajeitados. VM86 significa que na maioria das vezes você nem precisa sair do PM, você pode rodar programas DOS enquanto ainda está no PM.
Todas essas melhorias significaram que o 386 PM não era 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 são tipicamente 386 ou mais novos. Adicionando suporte para o 286 PM seria um esforço totalmente independente, com pouco ou nenhum código capaz de ser compartilhado com o completamente diferente 386 PM.
Por outro lado, o 386 PM funciona praticamente da mesma maneira até a última das CPUs de 32 bits, e mesmo além se você executar software de 32 bits em CPUs de 64 bits.
Recentemente, o kernel do linux abandonou o 386 como uma plataforma suportada e o kernel Linux NÃO suporta processadores Intel 286..80286 não é um processador de 32 bits, que é necessário para inicializar.
O Linux x86 não pode ser facilmente transferido 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, segmentos de memória e deslocamentos ainda tinham apenas 16 bits. Os programas ainda precisavam lidar com código e dados próximos / distantes.
Isso significa que o Linux / 286 precisaria de um kernel e uma API de usuário radicalmente diferentes do Linux / 386. Todos os arquivos de origem de montagem e muitos arquivos de origem C precisariam ser reescritos. Seria como a diferença entre programar para Win16 versus Win32.
Em suma, você não pode simplesmente dizer ao GCC para compilar uma CPU diferente. Cada pedaço de código precisaria ser reescrito para um ambiente de 16 bits.
Pelo que eu li, a maneira canônica de fazer o Linux rodar no 80286 seria rodá-lo dentro de uma máquina virtual. Isto é o que Fabrice Bellard fez aqui . Você teria que implementar a máquina virtual por conta própria ou portar uma.