Sistema de arquivos raiz Linux em hardware personalizado

Sistema de arquivos raiz Linux em hardware personalizado

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

Adicionei com sucesso suporte aos meus periféricos personalizados (um USART, controlador de interrupção e temporizador), permitindo-me ver as mensagens printk exibidas pelo kernel até o ponto de tentar montar o sistema de arquivos raiz.

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

Pelas minhas pesquisas de depuração e na Internet, parece que o kernel não consegue reconhecer minha memória não volátil e, portanto, não consegue montar o sistema de arquivos.

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

Agradecemos antecipadamente por toda ajuda e sugestões.

Responder1

Não tenho certeza do que você está fazendo agora com sua "partição do sistema de arquivos". Mas você pode colocar um initrd em seu armazenamento não volátil que se parece/age como RAM, e então fazer com que seu bootloader diga ao Linux para usar o initrd.

A maioria dos initrds faz algumas configurações e depois tenta remontar um sistema de arquivos raiz em um dispositivo de bloco. No seu caso, seu initrd seria seu sistema de arquivos raiz real e você precisaria colocar utilitários como shells, etc. no initrd.

Ao inicializar no ARM usando U-Boot, basicamente os comandos de inicialização carregam o kernel e o initrd de um dispositivo de armazenamento em um local fixo de RAM e, em seguida, 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 on make menuconfig) e transformá-la 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 gráfica como uma pequena partição swap, por exemplo. Veja isso.

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 mtdblocko que então faz /dev/mtdblock0. Você pode então fazer coisas assim mount /dev/mtdblock0e tal. Então você precisaria de um pequeno script em um initrd que faça o acima, então fsck /dev/mtdblock0, e então inicie o seu initou qualquer que seja o seu processo 1.

Você pode até 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 pequeno initrd de qualquer maneira, apenas para ser flexível.

informação relacionada