Como eu carrego o initrd na memória para ser passado ao kernel ao usar o kexec?

5

Como a porta MIPS de kexec não suporta o --initrd param, estou procurando soluções alternativas para imitar o recurso. De acordo com wiki Linux / MIPS , os kernels MIPS suportam rd_start e rd_size argumentos de linha de comando do kernel para especificar o localização do initrd. Eu estou querendo saber se seria possível carregar o initrd na memória e passá-lo ao longo dos parâmetros do kernel?

Se for possível, onde na memória devo carregar o arquivo e como carrego? Pensei em concatenar o kernel e o initrd em um arquivo, mas como obtenho o endereço em que kexec carregou o novo kernel?

Um pouco de fundo: eu tenho um WNDR3700 roteador wifi executando OpenWrt com um kernel kexec'd. Meu objetivo é inicializar em um kernel OpenWrt baunilha armazenado em usb para facilitar as atualizações. O problema (atualmente) é que os módulos usb não são construídos no kernel, mas são fornecidos como módulos de kernel carregáveis. Eu sou capaz de inicializar de usb para outro kernel usando um initramfs incorporado, mas usar um initramfs requer que eu compile o kernel, não é? Então, alternativamente, eu poderia incorporar initramfs / initrd em um binário / elf de kernel existente (sem qualquer ramdisk) e evitar recompilar o kernel?

Além disso, obviamente, compilar os módulos usb no kernel requer recompilar o kernel, então essa não é uma opção.

    
por Jani 29.12.2013 / 18:09

1 resposta

1

If it's possible, where in memory I should load the file and how do I load it?

Em dispositivos pequenos do Linux, você definiu regiões de memória:

$ cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00020000 00010000 "u-boot"
mtd1: 00102b20 00010000 "kernel"
mtd2: 006cd4e0 00010000 "rootfs"
mtd3: 00510000 00010000 "rootfs_data"
mtd4: 00010000 00010000 "art"
mtd5: 007d0000 00010000 "firmware"

Cuidado para não bloquear seu dispositivo.

    
por 08.03.2014 / 19:46