Официальный форум СВД Встраиваемые Системы
29 Март, 2024, 15:48:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Технология сжатия загрузочного образа QNX4  (Прочитано 9260 раз)
Олег Большаков
Легенда

Сообщений: 3140



« : 19 Март, 2010, 16:01:26 »

Технология сжатия загрузочного образа QNX4

Иногда возникает необходимость подготовки нестандартных загрузочных образов QNX4. В этом случае становится существенным ограничение на размер загрузочного образа QNX4. Суммарный размер всех необходимых программных модулей и драйверов может превышать 640 килобайт. Как же быть в этом случае?

Для решения проблемы была подготовлена библиотека программ в составе:

 - Библиотека LZF 3.5 для QNX4 (файлы lzf.h, lzf.lib)
 - Вспомогательный заголовочный файл ramdisk.h
 - Исходный код утилиты генерации сжатого образа в виде модуля на языке Си (файл mkcram.c)
 - Исходный код программы распаковки сжатого образа (файл rdload.c)
 - Исходный код утилиты отложенного запуска программ (файл wstart.c)
 - Файл построения загрузочного образа (usb.build)
 - Сценарий дозагрузки дополнительных драйверов и программ (файл prestart)
 - Каталог с дополнительными драйверами и программами (ram)
 - Сценарий сборки образа (Makefile)

В основу положена довольно простая идея -- сжать часть драйверов и программ. В результате получаем образ необходимого размера.

Как это работает

Попробуем подготовить образ загрузочной дискеты (впоследствии образ можно использовать для подготовки загрузочного CD-ROM). Дискета состоит из двух частей -- обычного загрузочного образа QNX4, в который входят модули boot, Proc32, Slib32, EFsys.ram и сжатого образа. Сжатый образ представляет собой самораспаковывающийся архив, содержащий модули Fsys, Fsys.atapi, mount, sh. Чтобы подготовить дискету достаточно набрать команду make в каталоге cramdisk.

При необходимости можно изменить состав сжатого образа. Для этого достаточно заменить (добавить или удалить) файлы из каталога ram. После этого следует отредактировать загрузочный скрипт prestart. На базе загрузочной дискеты можно подготовить, например, образ для загрузки с USB CD-ROM.

Стоит обратить внимание на командный интерпретатор sh, входящий в предлагаемый к скачиванию архив. Размер программы составляет всего 18 килобайт.

cramdisk-qnx4-20100322.tar.gz

Код:
$ cksum cramdisk-qnx4-20100322.tar.gz
2311449461 132106 cramdisk-qnx4-20100322.tar.gz

Ссылка на универсальный загрузочный образ от deadarcher.
« Последнее редактирование: 02 Март, 2023, 14:52:29 от Андрей Докучаев » Записан
Василий Дмитриев
Ветеран

Сообщений: 363



« Ответ #1 : 22 Март, 2010, 13:18:41 »

Очень полезная вещь  I'm so happy
Записан

Санкции! Запрещаю Бараку Обаме и членам конгресса США читать мои посты!
gefest
Интересующийся

Сообщений: 1


« Ответ #2 : 17 Ноябрь, 2011, 13:48:19 »

Спасибо"
Записан
clonN01
Интересующийся

Сообщений: 2


« Ответ #3 : 13 Декабрь, 2011, 09:21:34 »

Не просто полезная, а еще и нужная.
Записан
clonN01
Интересующийся

Сообщений: 2


« Ответ #4 : 13 Декабрь, 2011, 16:27:13 »

Большое человеческое спасибо ! Все прекрасно отработало. Была проблема с целевой машиной, где ВСЕ USB порты были UHCI.
Ядро с io-usb-ehci  не могло монтировать флешку. Но по этой методике ядро с полным io-usb прекрасно отработало. Особое спасибо за исходные тексты, очень полезно для понимания что происходит. 
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #5 : 13 Декабрь, 2011, 22:15:23 »

Приятно слышать, что наши наработки полезны пользователям. Smiley
Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #6 : 11 Июнь, 2012, 14:55:33 »

Ожидал немного другого: сжатого образа с распаковщиком в начале (как в Linux).
Но это тоже то, что нужно. Я задолбался пытаться сделать такую дискету.
Есть вопросы (сейчас только прочитал описание и скачал архив, ещё ничего не смотрел и не делал):
1. Для чего нужен Efsys.ram? Почему нельзя обойтись Fsys -r , засунутым в образ?
2. Я пытался сделать сам, "штатными" средствами. Отсюда:
а. Почему, когда я засовываю 56-кб gzip, образ увеличивается где-то на 200 Кб?
Что он тянет за собой?
б. Почему всё подвисает и не работает, хотя похоже сделано правильно?
Т.е., у меня была ФС в файле, сжатая gzip. Флопик монтировался, как /f/a (на qnx.org.ru
писали, что возможно монтировать в несуществующий каталог).
Затем, создавался RAM диск, на который, gzip-ом из образа должен был распаковаться файл с флопика.
После этого /dev/ram монтировался, как корень. Я пытался использовать Fsys -r .
Почему такая схема не работает?
Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #7 : 11 Июнь, 2012, 15:11:38 »

И почему liblzf? XZ-utils никак не прикрутить?
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #8 : 11 Июнь, 2012, 21:41:38 »

A.N., постараюсь ответить на Ваши вопросы. При добавлении файлов в загрузочный образ может применяться выравнивание, но 56кб не может выравниваться до 200. Попробуйте при построении образа передать ключ -v утилите buildqnx.

Почему Вы всё делаете правильно, но у Вас не работает, я сказать не могу. Самый очевидный ответ — что-то не учли.

Здесь предлагается рабочий вариант загрузочного образа. Вы вправе самостоятельно доработать его с учётом Ваших специфических требований и заменить порядок запуска драйверов и библиотеку компрессии.
Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #9 : 12 Июнь, 2012, 08:49:19 »

Так это понятно, что если бы я всё сделал правильно, получился бы рабочий образ. Smiley
Хотелось бы понять, что неправильно.
Последнее, что у меня заработало - это образ, который содержит минимум всего,
плюс gzip и tar на флопике. RD делался через Fsys -r, на него распаковывался tar.gz.
В принципе, ещё tar возможно было убрать, если сделать образ ФС.
Потом, мне захотелось сделать сжатую ФС и монтировать в корень, ну типа initrd.

Хотелось бы, всё-таки понять:
1. Насколько я понимаю, Efsys.ram не поддерживает симлинки (а хотелось бы),
в отличие от RD Fsys? Почему Efsys.ram, а не Fsys -r?
2. Зачем нужен wstart? Почему нельзя написать /ram/sh /ram/prestart,
и зачем он ждёт 5 секунд (и почему не добавить это, если нужно, в prestart)?
3. Почему /dev/ramdisk открывается на чтение-запись (вроде, из него ничего не читается)?
И, вообще, а возможно ли обойтись без буфера для распаковки? Ведь RD тоже в памяти...
Может, возможно как-то получать его адрес и использовать его в качестве буфера, напрямую? o.O
4. Не очень понятно, почему возможно сделать так:
/ram/mount -p /dev/hd0.0 /dev/hd0.0t77 / ? Вообще, корня нет, как получается у Efsys.ram монтировать RD в корень?
Могу ли я сделать так: /ram/mount /dev/ramdisk / ?
5. А штатными средствами, не прибегая к C, всё это возможно сделать?

P.S.:
Кстати, вы в rdload, вместо 'Useage' написали. %-)

P.P.S.:
QNX 4 под рукой, пока что нет, так что не проверяю.
Завтра притащу к себе vmdk с ней.
« Последнее редактирование: 12 Июнь, 2012, 08:54:25 от A.N. » Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #10 : 23 Июнь, 2012, 07:07:07 »

Не работает.  Sad Говорит, что слишком большой размер образа получается и обламывается при загрузке. Что делать?
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #11 : 23 Июнь, 2012, 08:43:12 »

Не работает.  Sad Говорит, что слишком большой размер образа получается и обламывается при загрузке. Что делать?

Надо уменьшить размер образа. Оставьте в нём только самое необходимое, а остальное переместите в RAM-диск, например.
Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #12 : 23 Июнь, 2012, 09:43:04 »

Эм, я не совсем правильно задал вопрос.
Как делать так, чтобы система загрузилась, не уменьшая размер образа?
Т.е., как реализовать загрузку для образа произвольного размера?

P.S.:
Так-то я вынес образ на дискетку.
Пока что, не работает...
Я пытаюсь сделать так:
in_kernel/Fsys
$ Fsys -r 2048

$ Fsys.floppy &
$ mount /dev/fd0 /f
$ wstart 1 /f/rdload /dev/ram
$ mount /dev/ram /ram

Но здесь есть большой минус.
Например, я хочу сделать загрузочную флешку.
Если всё в образе, проблем не возникнет: достаточно его кинуть на флешку
и добавить в меню загрузчика так, чтобы он был загружен в память перед запуском.

А в случае вынесения ФС в отдельный файл, придётся переделывать образ...
(ну наверное: я не знаю есть ли у grub2, например, штатные средства загрузки
для qnx, типа команд kernel и initrd)...
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #13 : 26 Июнь, 2012, 06:53:09 »

На данный момент размер загрузочного образа QNX4 ограничен примерно 640Кб. Проще всего подготовить загрузочные образы для всех используемых типов носителей (USB, CD-ROM и т.д.), а всё остальное перенести в раздел на загрузочном носителе.
Записан
A.N.
Интересующийся

Сообщений: 7


« Ответ #14 : 28 Июнь, 2012, 17:32:06 »

Печально. Sad
Кстати, у вас ожидание реализовано через sleep.
Не заработало на ВМ (нужно задержки "угадывать", что неудобно).
Лучше сделать через stat().
Могу изменённый вариант wstart отправить, если лениво поменять, и нужен. %-)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2020 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 16 Январь, 2024, 07:32:04