ЗАО «ЗЭО»

Техническая поддержка пользователей => ОС Linux, U-Boot => Тема начата: asv от 26 Августа, 2009, 16:14:46

Название: Сборка ядра
Отправлено: asv от 26 Августа, 2009, 16:14:46
Не надо под Win, поставьте виртуальную машину с Debian или Ubuntu и собирайте в них.
Название: Сборка ядра
Отправлено: Prilad от 27 Августа, 2009, 17:41:21
У вас старая сборка... в более её перезапускают.

"Продолжаем разговор" (с) Карлсон.

Значит теперь вопрос по Линксу ( может это офтоп, конечно, но это в рамках вопроса про железку, да и не хочется темы плодить). Виртуальную машину с Ubuntu я поставил. Инструментарий тоже arm-gcc-4.1.1-920t (не сам, помогли знатоки). Теперь решил пойти прямо по инструкции, скачал с сайта http://www.kernel.org/ дистрибутив ядра (linux-2.6.20.4), пропатчил. Пока, вроде Все хорошо.
 
Но дальше, при окончательной сборке ( 'make' ) возникли проблемы.

Во-первых - в каталоге с установленным инструментом несколько компиляторов:

arm/4.1.1-920t/bin/arm-linux-gcc
arm/4.1.1-920t/arm-linux/bin/gcc

Указал путь к обоим, настроил переменную 

export CROSS_COMPILE=arm-linux- ( т.е для запуска файла 'arm-linux-gcc' )

сборка пошла, но остановилась на ошибке:

  CC      init/initramfs.o
  CC      init/calibrate.o
  LD      init/built-in.o
  GEN     usr/initramfs_data.cpio.gz
/home/ale/Tion/linux-kernel/linux-2.6.20.4/scripts/gen_initramfs_list.sh: line 279: usr/gen_init_cpio: не могу запустить бинарный файл
make[1]: *** [usr/initramfs_data.cpio.gz] Ошибка 126
make: *** [usr] Ошибка 2

и все. Я опять сел. Вроде в указанном каталоге файл "gen_init_cpio" имеется. Однако сборка не заканчивается. Что делать?







Название: Сборка ядра
Отправлено: asv от 27 Августа, 2009, 21:05:07
Добавлять пусть к arm/4.1.1-920t/arm-linux/bin/gcc не нужно. gcc должен вызвываться обычный (не cross). Уберите это из PATH.

Конфигурацию делали (*_defconfig)?

PS. Linux пишеться как Linux.
Название: Re: Сборка ядра
Отправлено: Prilad от 27 Августа, 2009, 21:25:07

Добавлять пусть к arm/4.1.1-920t/arm-linux/bin/gcc не нужно. gcc должен вызвываться обычный (не cross). Уберите это из PATH.


Если не указывать путь к gcc, а только задать переменную
 
export ARCH=arm

то результатом команды make является:

ale@ale-desktop$ make
scripts/kconfig/conf -s arch/arm/Kconfig
  CHK     include/linux/version.h
  SYMLINK include/asm-arm/arch -> include/asm-arm/arch-ep93xx
make[1]: `include/asm-arm/mach-types.h' не требует обновления.
  CHK     include/linux/utsrelease.h
  CC      arch/arm/kernel/asm-offsets.s
cc1: ошибка: некорректный ключ "-mlittle-endian"
cc1: ошибка: некорректный ключ "-mapcs"
cc1: ошибка: некорректный ключ "-mno-sched-prolog"
cc1: ошибка: некорректный ключ "-mabi=apcs-gnu"
arch/arm/kernel/asm-offsets.c:1: ошибка: некорректное значение (armv4t) для ключа -march
arch/arm/kernel/asm-offsets.c:1: ошибка: некорректное значение (arm9tdmi) для ключа -mtune=
make[1]: *** [arch/arm/kernel/asm-offsets.s] Ошибка 1
make: *** [prepare0] Ошибка 2



Конфигурацию делали (*_defconfig)?


Да, делал.
Название: Re: Сборка ядра
Отправлено: Prilad от 27 Августа, 2009, 21:34:00
Кстати, а на сайте документации вроде явно указано, что GCC должен быть arm-овский. Или из нижеследующегл это не следует?

Цитировать
Сборка ядра
   1.
      Установите переменные окружения
      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnu-
      где arm-linux-gnu- — префикс используемого инструментария

Название: Re: Сборка ядра
Отправлено: asv от 27 Августа, 2009, 23:26:29
1. К arm-linux-gcc путь указывать
2. К gcc (из директории arm) -- не указывать
3. CROSS_COMPILE задавать как написано

При сборке ядра собираются программы для работы на host'е. Это делается gcc (без префиксов).
После чего ядро собирается для указанной архитектуры (ARCH) указанным cross-компилятором (CROSS_COMPILE) arm-linux-gcc.
Название: Re: Сборка ядра
Отправлено: Prilad от 28 Августа, 2009, 14:52:07
1. К arm-linux-gcc путь указывать
2. К gcc (из директории arm) -- не указывать
3. CROSS_COMPILE задавать как написано

При сборке ядра собираются программы для работы на host'е. Это делается gcc (без префиксов).
После чего ядро собирается для указанной архитектуры (ARCH) указанным cross-компилятором (CROSS_COMPILE) arm-linux-gcc.


Все сделал, как Вы указали. Указал путь к arm-linux-gcc. Иначе совсем его не находила система. 
Указал

    export CROSS_COMPILE=arm-linux-

однако все равно в ответ на команду make  высыпались ошибки

ale@ale-desktop$ make
  CHK     include/linux/version.h
make[1]: `include/asm-arm/mach-types.h' не требует обновления.
  CHK     include/linux/utsrelease.h
  CC      arch/arm/kernel/asm-offsets.s
  GEN     include/asm-arm/asm-offsets.h
  HOSTCC  scripts/mod/sumversion.o
scripts/mod/sumversion.c: В функции ‘get_src_version’:
scripts/mod/sumversion.c:384: ошибка: ‘PATH_MAX’ не описан (первое использование в этой функции)
scripts/mod/sumversion.c:384: ошибка: (Сообщение о неописанном идентификаторе выдается один раз
scripts/mod/sumversion.c:384: ошибка: для каждой функции, в которой он используется.)
scripts/mod/sumversion.c:384: предупреждение: неиспользуемая переменная ‘filelist’
make[2]: *** [scripts/mod/sumversion.o] Ошибка 1
make[1]: *** [scripts/mod] Ошибка 2
make: *** [scripts] Ошибка 2

Название: Re: Сборка ядра
Отправлено: scad от 28 Августа, 2009, 15:25:19
открой файл kernel/linux-2.6.20.4/scripts/mod/sumversion.c в каком нибудь редакторе и допиши
#define PATH_MAX 1024
Название: Re: Сборка ядра
Отправлено: asv от 28 Августа, 2009, 15:29:48
Вы собираете для 2.6.20.4!
Последние 2.6.20.21, попробуйте их.

PS. Ошбка исправляется добавлением строки
#include <limits.h>
в scripts/mod/sumversion.c
Название: Re: Сборка ядра
Отправлено: Prilad от 29 Августа, 2009, 11:31:29
Вы собираете для 2.6.20.4!
Последние 2.6.20.21, попробуйте их.

PS. Ошбка исправляется добавлением строки
#include <limits.h>
в scripts/mod/sumversion.c


Да, я собираю 2.6.20.4, потому что у меня в машинке стоит такая сборка. И мне было принципиально важно понять, смогу ли я пройти путь сборки и загрузки ядра в совершенно незнакомом пока для меня Linux-е.
Наконец добился окончания сборки (благодаря вашим советам). Но!

Вопрос немного не по теме - как сохранить в Ubuntu  переменные, которые необходимы для сборки, такие как export PATH=... ,  export ARCH=... .
Мне при каждом запуске системы приходится вручную прописывать эти команды, а хотелось бы, что бы они прописывались автоматом при старте Ubuntu.

Второй вопрос уже ближе к теме. Я, конечно, сейчас попробую собрать по умолчанию версию 2.6.20.21. Вопрос - какой (какие) файл (файлы) является РЕЗУЛЬТАТОМ сборки? Сейчас у меня в каталоге kernel-linux в результате сборки появился бинарный файл vmlinux, размером 4.4 Мб. Имеенно он является образом системы, с которым можно работать дальше (прикручивать u-boot) ?

Третий вопрос - включена ли в сборку ядра оболочка Opie? Или ее надо прикручивать как модуль?

Я, конечно, продолжу копать. Задача у меня простая - собрать образ для тион-про2 с корневой файловой системой на каком нибудь носителе, а не на рам-диске. Лучше всего пока на внутреннем флеше. И с подключенным по умолчанию тачскрином. Учитывая "сложности" с которыми я столкнулся на этапе тестовой сборки ядра.. это будет совсем не просто. Может подскажете последовательность действий от и до?. Документацию в сети я читаю, но, есть много тонкостей. ???
Название: Re: Сборка ядра
Отправлено: Prilad от 29 Августа, 2009, 12:05:24
Один вопрос снимается, образ ядра я нашел. Это zImage, как я понял
Название: Re: Сборка ядра
Отправлено: asv от 29 Августа, 2009, 12:07:08
> Вопрос немного не по теме - как сохранить в Ubuntu  переменные, которые необходимы для сборки, такие как export PATH=... ,
> export ARCH=... .
> Мне при каждом запуске системы приходится вручную прописывать эти команды, а хотелось бы, что бы они прописывались
> автоматом при старте Ubuntu.

Это никоим образом не имеет отношения к Ubuntu (как к дистрибутиву, чем он является).
Это задача того интерпретатора (shell'a) которым вы пользуетесь (они разнообразны, но у вас сейчас bash).
Поэтому то что вы хотите можно сделать (1) через файл инициализации .bashrc (в вашей домашней директории, см.
значение переменной окружения $HOME). Но так про них быстро забываешь и неожиданно вспоминаешь при сборке чего-то
для host'а. Или же (2) оформить желаемые команды в отдельный файл (т.н. скрипт или сценарий) и выполнять его перед
тем как что-либо собрать для target'а. Или (3) пользоваться системами сборки: Buildroot (Crater), PTXdist (в этом случае
сложность только в их настройке под свои задачи, но воспроизводимость результата значительно лучше).


> Второй вопрос уже ближе к теме. Я, конечно, сейчас попробую собрать по умолчанию версию 2.6.20.21. Вопрос - какой (какие)
> файл (файлы) является РЕЗУЛЬТАТОМ сборки? Сейчас у меня в каталоге kernel-linux в результате сборки появился бинарный файл
> vmlinux, размером 4.4 Мб. Имеенно он является образом системы, с которым можно работать дальше (прикручивать u-boot) ?


Для U-Boot это отдельная история, см.
http://www.zao-zeo.ru/dokuwiki/doku.php/u-boot#образ


> Третий вопрос - включена ли в сборку ядра оболочка Opie? Или ее надо прикручивать как модуль?

Нет, ядро это только ядро. Opie -- это программы, библиотеки и пр. файлы.
Opie можно собрать с помощью Crater'а:
http://www.zao-zeo.ru/dokuwiki/doku.php/linux#различные_сборки_кфс

Ядро тоже можно собрать с помощью Crater'а.


> Задача у меня простая - собрать образ для тион-про2 с корневой файловой системой на каком нибудь носителе, а не на рам-диске.
> Лучше всего пока на внутреннем флеше. И с подключенным по умолчанию тачскрином. Учитывая "сложности" с которыми я
> столкнулся на этапе тестовой сборки ядра.. это будет совсем не просто. Может подскажете последовательность действий от и до?

Берёте
http://www.zao-zeo.ru/media/files/crater-1.0.0_svn747.tar.gz
и делаете как в
http://www.zao-zeo.ru/dokuwiki/doku.php/crater

Нужно отметить создание jffs2 файловой системы. И начать с конфигурацией _по_умолчанию_!
Потом разберётесь как образ ядра и ФС записать на плату.
Название: Re: Сборка ядра
Отправлено: Prilad от 29 Августа, 2009, 16:18:42
Йес. Ядро собрал crater-ом. Пришлось, правда, подправить файл "config.in", прописав там путь к установленному gcc, который ранее указывал на "3.6..."

config TOOLCHAIN_DIR
        string "Toolchain and header file location?"
        default "/usr/local/arm/4.1.1-920t"

В результате появилось по 2 файла в 2-х каталогах в "Images"

9312/
   ramdisk
   rootfs.jffs2

TION_PRO2/
  uImage
  zImage

Теперь разбираюсь с U-Boot
Название: Re: Сборка ядра
Отправлено: asv от 29 Августа, 2009, 22:45:32
Config.in править нет необходимости
Название: Re: Сборка ядра
Отправлено: Prilad от 30 Августа, 2009, 12:13:14
Config.in править нет необходимости


Возможно, но без этой правки процес сборки вылетал по ошибке.

Ладно, я решил воспользоваться советом http://www.zao-zeo.ru/dokuwiki/doku.php/linux#usb-flash и просто перенести КФС на флешку. Создал на ней ext2 раздел, подмонтировал ее в тион и скопировал "все" папки из раздела root рамдиска тиона. При копировании /sys и /proc возникли проблемы с ограничением доступа. Тогда я примонтировал образ рамдиска, созданный crater-ом, в Ubuntu и убедился, что изначально на рамдиске эти каталоги пустые. Сразу возник вопрос: - эти каталоги используются системой для оперативной работы? Значит их нельзя располагать на флешке, иначе будут жуткие тормоза.  А пока я оставил эти каталоги на флешке пустыми.

Перезапустил тион, остановился в U-Boot. Командой "$ setenv" поменял переменную bootargs, указав в ней root=/dev/sda1, и продолжил загрузку командой "$ boot".

Загрузка прошла, даже запустился терминал. И во тут появились станности. Opie так и не запустился, на терминале - жуткие тормоза (что я и предсказывал), а вот результат команды
/# ls -l
поверг меня в легкий шок - распечаталось содержимое рамдиска, а вовсе не моей флешки. Тогда я подмонтровал флешку, и убедился, что на ней каталоги /proc и /sys УЖЕ НЕ ПУСТЫЕ. т.е система именно их юзает для своих нужд, хотя корень указыавет на рам диск. (все это с жуткими задержками отклика тиона)

Короче - дурная голова рукам покоя не дает. Что я сделал не так?
Название: Re: Сборка ядра
Отправлено: asv от 30 Августа, 2009, 15:00:21
> распечаталось содержимое рамдиска, а вовсе не моей флешки.

Посмотрите внимательно лог ядра, скорее всего все-равно используется ramdisk, так как ядро смогло его найти.

В U-Boot (в переменной bootcmd) выполняется копирование ramdisk из в Flash в RAM, по адресу ожидаемому ядром.
Нужно убрать это копирование, тогда у ядра не будет возможности найти ramdisk.
Название: Re: Сборка ядра
Отправлено: Prilad от 30 Августа, 2009, 18:28:39
> распечаталось содержимое рамдиска, а вовсе не моей флешки.

Посмотрите внимательно лог ядра, скорее всего все-равно используется ramdisk, так как ядро смогло его найти.

В U-Boot (в переменной bootcmd) выполняется копирование ramdisk из в Flash в RAM, по адресу ожидаемому ядром.
Нужно убрать это копирование, тогда у ядра не будет возможности найти ramdisk.


Убрать не получается. Да и не сказано в документации ничего про это. Вилы, короче. Но больше всего напрягло, что при этом система что-то у пишет на флешку в каталоги /sys и /proc
Название: Re: Сборка ядра
Отправлено: asv от 31 Августа, 2009, 13:34:48
1. Должно получиться. Смотрите описание U-Boot.

2. Что же пишется в /proc /sys ?


Название: Re: Сборка ядра
Отправлено: Prilad от 03 Сентября, 2009, 08:56:54
Получилось!!! Опишу подробно (мне так этой подробности не хватало поначалу  :-\)

- Поставил CF  карточку на IDE-переходнике. (дополнительно на переходнике бросил проводок с 20й ножки разъема на питание карточки. На моем переходнике питание от IDE не было разведено).

- Подключил нульмодемным кабелем к компу, на компе врубил gktterm из ubuntu. Настроит компорт на скорость 57600

- Включил тион, дождался полной загрузки.

- Из терминала (не монтируя CF) создал на ней ext2 раздел  (указав размер блока = 1024) командой
         # mke.2fs /dev/hda1 -b1024

- Примонтировал CF
         # mkdir /mnt/hda1
         # mount /dev/hda1 /mnt/hda1

- Скопировал ФС (каждый каталог отдельно) . Не копировал каталоги /proc, /mnt, /sys
         # cp -a /Applications /mnt/hda1/Applications
         ...

- Создал пустые каталоги, которые не копировал
         # mkdir /mnt/hda1/proc
         ...

- Перезапустил Тион-про2 (кн. RESET на плате)

- Остановил загрузку на этапе u-boot (нажав в окне терминала любую клавишу в начале загрузки)

- Изменил ДВЕ переменные окружения u-boot. Веделленым шрифтом указаны фрагменты, которые изменились. Остальную часть строки я просто повторил без изменений
        $ setenv bootargs root=/dev/hda1 console=ttyAM0,57600 video=ep93xxfb:vout=1,vmode=16
(эта запись устанавливает в качестве КФС устройство hda1, т.е CF-карточку)
        $ setenv bootcmd bootm ${kern_fladdr} ${rd_addr}
(ранее переменная bootcmd выглядела так:   bootcmd=Echo Copy RAM-disk; cp.b ${rd_fladdr} ${rd_addr}; bootm ${kern_fladdr} ${rd_addr}. Т.е я исключил команду копирования рам-диска в память)

- Сохранил переменные окружения во флеш тиона
       $ saveenv

- Перезапустил тион.

Все. Теперь у меня файловая система на CF карте, и я имею возможность изменить скрипт /sbin/start-opie, прописав туда управление системой с помощью тачскрина.

Всем спасибо :)
Название: Re: Сборка ядра
Отправлено: ZVV1986 от 30 Мая, 2014, 15:03:39
Цитировать
Инструментарий тоже arm-gcc-4.1.1-920t (не сам, помогли знатоки).

Достаточно просто распаковать в директорию /usr/local/arm? (так сделал) Сам использую debian.
Потом при make выдает

make: arm-linux-gnu-gcc: команда не найдена.
То есть я не доустановил компилятор(что тогда надо сделать)?
или я неправильно задал CROSS_COMPILE - "CROSS_COMPILE=arm-linux-gnu-"?
Пробовал и другие варианты для CROSS_COMPILE. результат от же.
Название: Re: Сборка ядра
Отправлено: asv от 30 Мая, 2014, 15:47:15
Цитировать
Достаточно просто распаковать в директорию /usr/local/arm? (так сделал) Сам использую debian.

Распаковать надо именно туда, где этот компилятор был первоначально
установлен при сборке.  Может быть сейчас с этим стало проще, но раньше было
такое требование. Угадали или нет, будет видно в дальнейшем при сборке.

В Debian можно подключить репозиторий emdebian и поставить arm компилятор из
него.

Цитировать
make: arm-linux-gnu-gcc: команда не найдена.
То есть я не доустановил компилятор(что тогда надо сделать)?
или я неправильно задал CROSS_COMPILE - "CROSS_COMPILE=arm-linux-gnu-"?
Пробовал и другие варианты для CROSS_COMPILE. результат от же.

Если вы не добавили каталог, в который распаковали компилятор, в переменную
окружения PATH, то надо указывать в CROSS_COMPILE полный путь, например,
CROSS_COMPILE=/usr/local/arm/4.1.1-920t/bin/arm-linux-
Название: Re: Сборка ядра
Отправлено: ZVV1986 от 30 Мая, 2014, 16:13:34
Сделал как посоветовали.

Компиляция идет. :-) Спасибо!