обновление ядра через /dev/mtd

#linux #embedded #kernel

#linux #встроенный #ядро

Вопрос:

Я работаю над встроенным устройством, где образ ядра хранится внутри /dev / mtd4 части flash. Я хотел бы обновить это ядро без Uboot.

Как это возможно ? Я пытался вызвать:

 echo ./kernel.bin > /dev/mtdblock4 
 

но это не работает. Сохраненные данные не распознаются как ядро при следующей загрузке.

Комментарии:

1. Вы, вероятно, хотите cat , а не echo , например cat ./kernel.bin > /dev/mtdblock4

2. Да, конечно. Я упомянул об этом, когда нашел ./kernel.bin sting, написанный в моем /dev/mtd … cat ./kernel.bin > /dev/mtdblock4 работает идеально.

Ответ №1:

Комментарии:

1. На моей флэш-памяти NAND flashcp сломал мои корневые файлы, пока flash_eraseall nandwrite -p работал. — может быть, нам следует позаботиться об описании инструмента «Копирует данные в NOR flash»?

Ответ №2:

По крайней мере, это должно быть cat kernel.bin > /dev/mtdblock4 , но это, вероятно, тоже не сработает.

И это зависит от того, как на самом деле загружено ваше ядро (что такое загрузчик).

Комментарии:

1. Это работает. Я упомянул об этом сбое, когда нашел строку ./kernel.bin, записанную в моем /dev/mtd… cat ./kernel.bin > /dev/mtdblock4 работает идеально.

2. Мне пришлось -1 это, что касается устройств на основе NAND (большинство), вы должны стереть флэш-память перед записью на нее; простая запись в нее не дает правильных результатов. Другие ответы здесь описывают правильные подходы.

3. Это удаление, вероятно, является задачей драйвера устройства. Когда вы видите файловую систему, это не имеет значения

4. Однако стоит отметить, что драйвер устройства, работающий в загруженном ядре, может не иметь достаточно подробной информации об оборудовании, плохой схеме блоков и т. Д., Чтобы его можно было безопасно использовать для записи. И в других случаях это возможно. По сути, это попытка типа «ну, давайте посмотрим, сработает ли простой подход в этом случае».

5. Это плохой совет! Вы никогда не должны записывать на flash, предварительно не удалив его!. Ответ @Luke’s — гораздо лучший и более разумный способ переписать образ ядра

Ответ №3:


Я никогда не использовал flashcp. Где я могу его получить? Я использую flash_erase или flash_eraseall, а затем nandwrite. Если у вас нет этих утилит, вы можете получить исходный код здесь и создать их для своей цели.

Для обновления моей системы я использую:

 # /usr/bin/flash_erase /dev/mtd3
# /usr/bin/nandwrite -m -p /dev/mtd3 /uImage
 

Это флэш-память NAND? Если это так, я не думаю, что echo или cat будут правильно пропускать плохие блоки для вас.

Ответ №4:

Для обновления различных блоков mtd я использую следующую процедуру:

# flash_eraseall /dev/mtd3
# dd if="kernel.bin" of=/dev/mtd3 bs=16k conv=синхронизация

Ответ №5:

У меня также есть устройство, на котором я обновляю образ ядра и использую uBoot. Мой рабочий процесс:

  • Я переношу новый файл образа в каталог устройств tmp
  • Я удаляю каталог flash mtd:

    flash_eraseall /dev/mtd3

  • затем я копирую из tmp в каталог flash (/tmp/ —> /dev/mtd3)

    flashcp /tmp/uImage /dev/mtd3

Я надеюсь, что это поможет, с уважением