Executando o kernel do linux e o Ubuntu no processador customizado

1

Esta é uma questão dificilmente teórica, já que muitos têm feito isso, embora haja muito pouca informação sobre os processos subjacentes.

Estou desenvolvendo um processador personalizado baseado em MIPS no qual gostaria de executar o Ubuntu. Estou bastante perplexo sobre o que fazer depois de projetar o conjunto de instruções e a própria arquitetura do computador. Eu preciso ser capaz de rodar um kernel e sistema operacional, mas como isso tudo se encaixa?

No momento, estou pesquisando sobre como criar um compilador para o kernel do Linux gerar a linguagem de montagem apropriada. Esse é um bom caminho a percorrer? O que eu preciso fazer depois disso?

    
por xupv5 24.11.2012 / 12:14

2 respostas

6

No lado da arquitetura, você precisa de mais do que um conjunto de instruções e uma arquitetura de computador. Você também precisa ter:

  • Uma CPU de alguma forma (emulador, FPGA, silício…).
  • Uma maneira de inicializar esse processador: uma maneira de colocar o sistema operacional na memória que o processador executa no momento da inicialização. A maioria dos processadores inicializa o código armazenado na ROM, que ativa algum tipo de memória flash e ramifica para ele, ou que carrega algum código de alguma mídia de armazenamento na RAM e ramifica para ele. O próximo estágio é um gerenciador de inicialização do sistema operacional.
  • Alguns periféricos - no mínimo, RAM, algum tipo de controlador de armazenamento e alguns dispositivos de entrada / saída.

No lado do software, você precisará:

  • Um compilador. Como você está usando a arquitetura MIPS, qualquer compilador existente que esteja segmentando o MIPS deve ser suficiente. Se o seu conjunto de instruções estender o conjunto básico de instruções MIPS (por exemplo, com registros extras), você pode precisar estender o montador de acordo.
  • Um kernel. O Linux para MIPS já existe. Você terá que adicionar suporte para o que você personalizou em sua arquitetura: boot, MMU,…
  • Drivers. Você precisará criar drivers para todas as partes da arquitetura do computador que não foram desenvolvidas off-the-shelf.
  • Um gerenciador de inicialização. Geralmente há coisas no bootloader que são muito específicas da arquitetura, mas você provavelmente pode adicionar o suporte necessário a um gerenciador de inicialização existente, por exemplo, adicionando uma definição de máquina a U-Boot .
  • E isso é tudo. Uma vez que você tenha um kernel e um gerenciador de inicialização, os programas de usuário devem funcionar. Atualize o kernel e o carregador de inicialização de uma distribuição existente, faça a compilação cruzada no seu PC e instale. O Ubuntu não suporta MIPS, mas o Debian faz ( mips ou mipsel dependendo do endianness).
por 24.11.2012 / 15:41
1

Você conseguiu muito trabalho, suponho (parece um projeto de muitos anos, se você me perguntar). Você não vai realmente fazer tudo isso, certo?

Sim, o próximo passo seria escrever (ou melhor: porta) algum tipo de compilador (eu acho que primeiro você quer usar um compilador cruzado do seu PC atual).

Eu acho que portar um compilador existente (como gcc) pode ser a tarefa mais fácil (ele suporta muitas arquiteturas já, no entanto eu nunca fiz algo assim, talvez os documentos internos do GCC ajudarão você.

Depois que você tiver instalado e executando seu compilador, eu vou experimentar alguns programas básicos do tipo microcontrolador (por exemplo, deixar um led em uma das portas de dados piscar, etc.) e alguns programas de teste apenas para ver se tudo está funcionando como esperado.

O próximo passo pode ser implementar um gerenciador de partida que carregará seu kernel. Eu não sei se sua arquitetura vai usar um BIOS / EFI ou algo semelhante, mas isso é outra coisa a considerar ao projetar um gerenciador de inicialização.

Depois disso, é hora de chegar ao kernel. Comece com uma configuração mínima do kernel e tente colocá-lo em funcionamento. Você precisará portar o kernel para sua arquitetura (que inclui a configuração de todos os arquivos de cabeçalho dependentes do arco, escrever módulos para acessar seu hardware, um driver serial para que você possa acessar o shell, etc.), novamente um processo bastante extenso .

Btw .: Espero que sua arquitetura tenha uma unidade de mapeamento de memória ou você se deparará com algum problema sério mais tarde (se não tiver examinado µClinux que é capaz de executar um kernel sem mmu, mas eu duvido seriamente que você seria capaz de executar um sistema operacional de desktop completo.

Você pode querer dar uma olhada no kernel do Android ou OpenWRT, ambos em execução em dispositivos incorporados.

Quando o kernel for portado (daqui a muitos anos, se você estiver tentando fazer isso sozinho), você continuará com a área de usuário. Eu começaria com o porting busybox, o compilador e algumas ferramentas básicas do UNIX como openssh, cron, etc.

Depois disso (supondo que você já tenha uma GPU em funcionamento anexada ao seu sistema) você teria que escrever um driver de GPU e tentar obter o Servidor X (ou seu substituto wayland ). Tenha em mente que você precisará implementar a aceleração 2D / 3D para colocar o desktop do Ubuntu em funcionamento.

Finalmente, a tarefa é portar o máximo possível de pacotes do Ubuntu para sua plataforma.

Então, para concluir: Você gastou muito do seu tempo desenvolvendo sua própria arquitetura de CPU, mas você está no início de obter uma distribuição linux completa para rodar nela. Espero que você esteja apenas escrevendo um livro sobre o processo e não vai realmente fazê-lo, porque você está se colocando em uma séria carga de trabalho para os próximos anos.

No entanto, espero poder dar uma breve olhada no processo (e espero não ter esquecido nada importante). Boa sorte.

    
por 24.11.2012 / 15:24