Linux em um 286?

15

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?

ioctlvoid
fonte
6
16 bits é um exagero. 8 bits são suficientes para executar o Linux. Veja o projeto de Dmitry Grinberg.
Marco
O Minix foi executado no 8086 (8 bits, 128KiB RAM IIRC). O Xenix da Microsoft rodou no 80286. Alguma alma demente tentou calçar o Linux no 8086 também (com algum sucesso). Mas não, a "experiência completa do Linux" não será possível em uma máquina tão limitada.
vonbrand
Você pode calçar o Linux para rodar em dispositivos muito limitados. Mas isso não será muito útil como uma máquina de desktop, por exemplo. A menos que você indique seus objetivos, é difícil saber se o 'Linux on 286' é viável para você.
9000:

Respostas:

4

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.

Malvineous
fonte
3

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.

Didi Kohen
fonte
1
Havia um coprocessador matemático para o 286, o 80287.
Renan
3

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.

ioctlvoid
fonte
3

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.

Revanth Kamaraj
fonte
2

O Linux exige suporte a hardware VM86?

Eu não sou um cara de montagem, mas de acordo com isso :

Como a implementação original da extensão de 32 bits da arquitetura 8086, o conjunto de instruções 80386, o modelo de programação e as codificações binárias ainda são o denominador comum para todos os processadores x86 de 32 bits, denominado x86, IA-32 ou i386 -arquitetura, dependendo do contexto.

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.

Cachinhos Dourados
fonte
2

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.

O Lunático
fonte
1

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.

Flukas88
fonte
5
Linux foi originalmente escrito em um 386 em 1991. Até então 286 do já eram velhos, e a árvore do kernel principal nunca teve qualquer código portado para apoiar 286.
Flukas88
Pode ser, mas a pergunta ainda era por que é esse o caso? Não por que foi tomada a decisão de descartar o suporte ao 286/386 (o que é óbvio), mas quais são as razões técnicas para o suporte a um processador tão antigo não ser fácil. Ou seja, por que o kernel EXIGE uma CPU de 32 bits? Por que o kernel não pode ser compilado para um 286?
Ioctlvoid
O kernel também não tinha o coprocessador aritmético, conforme os requisitos?
Bonsi Scott
Não, o kernel suporta emulação matemática, pelo menos isso antes. Portanto, você pode até executar o kernel do Linux em uma CPU com uma FPU quebrada. No entanto, o 286 ainda apoiou um co-processador matemático, o 80287.
ioctlvoid
Em uma parte editada da minha resposta, indiquei que a emulação é implementada no kernel do Linux. Foi usado até para portar o Linux no S / 390 (também conhecido como IBM Mainframe), pois não tinha uma unidade de ponto flutuante no momento em que foi portado.
Didi Kohen
1

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.

toejam
fonte
1
Por favor, considere o uso de descontos para aumentar a legibilidade.
lord.garbage
0

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.

user1095108
fonte