ЗАО «ЗЭО»
Техническая поддержка пользователей => ОС Linux, U-Boot => Тема начата: asv от 26 Августа, 2009, 16:14:46
-
Не надо под Win, поставьте виртуальную машину с Debian или Ubuntu и собирайте в них.
-
У вас старая сборка... в более её перезапускают.
"Продолжаем разговор" (с) Карлсон.
Значит теперь вопрос по Линксу ( может это офтоп, конечно, но это в рамках вопроса про железку, да и не хочется темы плодить). Виртуальную машину с 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" имеется. Однако сборка не заканчивается. Что делать?
-
Добавлять пусть к arm/4.1.1-920t/arm-linux/bin/gcc не нужно. gcc должен вызвываться обычный (не cross). Уберите это из PATH.
Конфигурацию делали (*_defconfig)?
PS. Linux пишеться как Linux.
-
Добавлять пусть к 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)?
Да, делал.
-
Кстати, а на сайте документации вроде явно указано, что GCC должен быть arm-овский. Или из нижеследующегл это не следует?
Сборка ядра
1.
Установите переменные окружения
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnu-
где arm-linux-gnu- — префикс используемого инструментария
-
1. К arm-linux-gcc путь указывать
2. К gcc (из директории arm) -- не указывать
3. CROSS_COMPILE задавать как написано
При сборке ядра собираются программы для работы на host'е. Это делается gcc (без префиксов).
После чего ядро собирается для указанной архитектуры (ARCH) указанным cross-компилятором (CROSS_COMPILE) arm-linux-gcc.
-
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
-
открой файл kernel/linux-2.6.20.4/scripts/mod/sumversion.c в каком нибудь редакторе и допиши
#define PATH_MAX 1024
-
Вы собираете для 2.6.20.4!
Последние 2.6.20.21, попробуйте их.
PS. Ошбка исправляется добавлением строки
#include <limits.h>
в scripts/mod/sumversion.c
-
Вы собираете для 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 с корневой файловой системой на каком нибудь носителе, а не на рам-диске. Лучше всего пока на внутреннем флеше. И с подключенным по умолчанию тачскрином. Учитывая "сложности" с которыми я столкнулся на этапе тестовой сборки ядра.. это будет совсем не просто. Может подскажете последовательность действий от и до?. Документацию в сети я читаю, но, есть много тонкостей. ???
-
Один вопрос снимается, образ ядра я нашел. Это zImage, как я понял
-
> Вопрос немного не по теме - как сохранить в 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 файловой системы. И начать с конфигурацией _по_умолчанию_!
Потом разберётесь как образ ядра и ФС записать на плату.
-
Йес. Ядро собрал 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
-
Config.in править нет необходимости
-
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 УЖЕ НЕ ПУСТЫЕ. т.е система именно их юзает для своих нужд, хотя корень указыавет на рам диск. (все это с жуткими задержками отклика тиона)
Короче - дурная голова рукам покоя не дает. Что я сделал не так?
-
> распечаталось содержимое рамдиска, а вовсе не моей флешки.
Посмотрите внимательно лог ядра, скорее всего все-равно используется ramdisk, так как ядро смогло его найти.
В U-Boot (в переменной bootcmd) выполняется копирование ramdisk из в Flash в RAM, по адресу ожидаемому ядром.
Нужно убрать это копирование, тогда у ядра не будет возможности найти ramdisk.
-
> распечаталось содержимое рамдиска, а вовсе не моей флешки.
Посмотрите внимательно лог ядра, скорее всего все-равно используется ramdisk, так как ядро смогло его найти.
В U-Boot (в переменной bootcmd) выполняется копирование ramdisk из в Flash в RAM, по адресу ожидаемому ядром.
Нужно убрать это копирование, тогда у ядра не будет возможности найти ramdisk.
Убрать не получается. Да и не сказано в документации ничего про это. Вилы, короче. Но больше всего напрягло, что при этом система что-то у пишет на флешку в каталоги /sys и /proc
-
1. Должно получиться. Смотрите описание U-Boot.
2. Что же пишется в /proc /sys ?
-
Получилось!!! Опишу подробно (мне так этой подробности не хватало поначалу :-\)
- Поставил 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, прописав туда управление системой с помощью тачскрина.
Всем спасибо :)
-
Инструментарий тоже 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. результат от же.
-
Достаточно просто распаковать в директорию /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-
-
Сделал как посоветовали.
Компиляция идет. :-) Спасибо!