Sistema de arquivos raiz do Linux em hardware personalizado

1

Eu tenho um SoC customizado e implementado em FPGA, baseado em um clone do processador ARM, no qual estou tentando inicializar o Linux (kernel 3.10).

Eu adicionei com sucesso suporte aos meus periféricos personalizados (um USART, Interrupt Controller e Timer), permitindo-me ver as mensagens printk exibidas pelo kernel até o ponto de tentar montar o sistema de arquivos raiz.

Tenho uma memória não volátil personalizada de 2 GB, acesso aleatório, leitura escrita, mapeada do endereço 0 para 0x7FFFFFFF a partir da qual o carregador de inicialização é executado e contém o kernel e a partição do sistema de arquivos. O bootloader copia o kernel para a RAM (256Mb, de 0x80000000 para 0x8FFFFFFF) e então passa o controle para o Linux, que falha no ponto: "Kernel panic - não sincronizando: VFS: Não é possível montar fs raiz no bloco desconhecido (0,0) ".

De minhas pesquisas de depuração e de internet, parece que o kernel não pode reconhecer minha memória não volátil, portanto não pode montar o sistema de arquivos.

Como eu digo ao kernel que ele deve inicializar a partir daquela memória, e qual código deve ser adicionado ao kernel? Por exemplo, seria possível fazer o kernel pensar que minha memória é um Nand e modificar os drivers Nand para acessá-lo corretamente?

Agradecemos antecipadamente por toda a ajuda e sugestões.

    
por user3130285 23.12.2013 / 19:11

1 resposta

0

Não sei o que você está fazendo agora com a sua "partição do sistema de arquivos". Mas você pode colocar um initrd no seu armazenamento não-volátil que se parece com a RAM, e depois fazer com que o seu bootloader diga ao Linux para usar o initrd.

A maioria dos initrds faz alguma configuração e então tenta montar novamente um sistema de arquivos raiz em um dispositivo de bloco. No seu caso, o seu initrd seria o seu verdadeiro sistema de arquivos raiz e você precisaria estar colocando utilitários como shells, etc. no initrd.

Ao inicializar o ARM usando o U-Boot, basicamente os comandos boot carregam o kernel e initrd de um dispositivo de armazenamento em um local fixo de RAM, e o endereço do initrd é passado para o kernel como um parâmetro de linha de comando, especificando o endereço.

Bem, o driver MTD pode pegar uma seção de RAM (há uma opção "Physical System RAM" no driver MTD em make menuconfig ) e transformá-lo em um dispositivo de bloco, se você realmente precisar de um dispositivo de bloco legível / gravável . Ele pode ser usado para montar a RAM da placa de vídeo como uma pequena partição de troca, por exemplo. Veja isto .

Acho que o comando para fazer isso seria modprobe phram phram=0x00100000;256MiB , se você tiver um sistema de arquivos de 256MByte no local de memória 0x00100000. Então modprobe mtdblock , que então faz /dev/mtdblock0 . Você pode então fazer coisas como mount /dev/mtdblock0 e tal. Então, você precisaria de um script pequeno em um initrd que faça o acima, em seguida, fsck /dev/mtdblock0 e, em seguida, inicia seu init ou qualquer que seja seu processo 1.

Você pode até mesmo ser capaz de especificar tudo isso na linha de comando do kernel de alguma forma, mas não tenho certeza se isso é suportado. Você pode querer usar um initrd pequeno mesmo assim para ser flexível.

    
por 23.12.2013 / 19:21