0x0 — введение
0x1 — разбираем 🙂
0x2 — знакомимся с программной частью
0x3 — формат прошивки
0x4 — модифицируем файловую систему
0x5 — пишем первую программу
Вчера мы попробовали технику изменения корневой файловой системы и даже написали простейший исполняемый скрипт 🙂
Сегодня же попробуем написать Hello World для нашего модема!
Как же компилировать программы для встраиваемых систем?
Для этого используется toolchain.
Toolchain — это набор программ, необходимых для создания других программ.
Фактически — это набор из нескольких исполняемых файлов:
препроцессор, компилятор, линкер и т.д.
Всё это и есть toolchain.
Обычно, мы пишем программы на той же машине, на которой она будет работать (т.е. стандартный ПК x86), но при разработке программ для встраиваемых систем необходимо использовать так называемый кросс-компилятор. Т.е. компилятор работает на одной платформе (x86), а генерируемый им код будет работать на другой (например, ARM, а в нашем случае — MIPS).
В Linux есть свой родной toolchain — это известный GCC, но с его помощью вы не сможете писать программы для АРМ-ов.
Поэтому требудется достать необходимый кросс-компилятор.
Кросс-компилятор можно скачать готовый, а можно собрать из исходников.
Пока остановимся на первом варианте 🙂
Идём на фтп-ник D-link-а:
ftp://ftp.dlink.ru/pub/ADSL/
— здесь можно скачать прошивки под различные версии ADSL-модемов.
Но самая интересная директория — это GPL_source_code
ftp://ftp.dlink.ru/pub/ADSL/GPL_source_code/
Да-да, под действием сообщества и того факта, что Linux распространяется под лицензией GPL компания D-link выложила исходные коды прошивок, используемого ядра Linux-а и toolchain для их сборки!
Нас интересует вот этот наборчик для ADSL модема D-link 2500U:
ftp://ftp.dlink.ru/pub/ADSL/GPL_source_code/RU_DSL-2500U/RU_DSL-2500U_3-06-04-3C_GPL.tar.gz (100Mb)
Скачиваем и распаковываем 🙂
В архиве содержатся 4 файла:
consumer_install README RU_DSL-2500U_3-06-04-3C_consumer.tar.gz RU_DSL-2500U_3-06-04-3C_uclibc_crosstools_3.4.2_0.9.27.tar.gz
посмотрим README:
RU_DSL-2500U Open Source Release This release contains all of the files needed to build a RU_DSL-2500U image. To build an image, please follow the below process: 1. System Request: Redhat Linux 9.0 2. All operations should be performed as the "root" user 3. Install tools and source code #./consumer_install 4. Build image: # cd RU_DSL-2500U_3-06-04-3C # make PROFILE=RU_DSL-2640U The final image is located in the targets/RU_DSL-2500U subdirectory. Specify this image in the RU_DSL-2500U Web interface image upgrade item in order to upgrade the device image.
consumer_install — это скрипт инсталляции набора (необходимо запускать под root-ом)
он распакует RU_DSL-2500U_3-06-04-3C_consumer.tar.gz который содержит:
bcmdrivers/ hostTools/ kernel/ shared/ targets/ userapps/ Makefile version.make
— исходники ядра, драйвера и утилиты (так необходимую нам вчера версию mksquashfs версии 2.0 с поддержкой LZMA я нашёл именно здесь 😉 в директории hostTools)
Главная проблема в том, что нормально работать этот набор будет только под
Redhat Linux 9.0
В принципе, можно будет попробовать поставить 🙂
Скачать можно здесь:
ftp://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/
3 iso-ника:
ftp://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc1.iso
ftp://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc2.iso
ftp://archive.download.redhat.com/pub/redhat/linux/9/en/iso/i386/shrike-i386-disc3.iso
Но у нас ведь уже стоит Ubuntu — попробуем — может и под ней получится 🙂
Выполняем установку, отвечая Y на вопросы 🙂
Всё успешно ставится, но вот как дело доходит до toolchain-а выпадает ошибка.
Дело в том, что тот toolchain, который идёт в составе RU_DSL-2500U_3-06-04-3C_GPL.tar.gz:
RU_DSL-2500U_3-06-04-3C_uclibc_crosstools_3.4.2_0.9.27.tar.gz
— содержит:
uclibc-crosstools-common.i386.rpm uclibc-crosstools-mips.i386.rpm
— т.е. представляет собой два rpm-пакета (установочные пакеты для Red Hat Linux) и в Ubuntu устанавливаться они не станут 🙂
Но выходе есть 🙂
Существует программа Alien которая конвертирует пакеты из одного установочного формата в другой (это не означает что rpm всегда будут работать в вашей системе).
Запустите команду для установки Alien и других необходимых пакетов:
sudo apt-get install alien
Для конвертации пакета из rpm в debian, используется следующая команда:
sudo alien uclibc-crosstools-common.i386.rpm sudo alien uclibc-crosstools-mips.i386.rpm
после этих команд получим два deb-файла.
Для инсталляции пакетов воспользуемся утилитой dpkg, которая является внутренним менеджером пакетов в Debian и Ubuntu.
sudo dpkg -i uclibc-crosstools-common_3.4.2-13_i386.deb sudo dpkg -i uclibc-crosstools-crosstools-mips_3.4.2-13_i386.deb
результат — появление директории:
/opt/toolchains/uclibc-crosstools_gcc-3.4.2_uclibc-20050502/
,в которой содержится заветный кросс-компилятор под платформу MIPS
Довольно распространённый кросс-компилятор под ARM (т.е. им можно собирать программы под тот же BeagleBoard) — это CodeSourcery.
скачать бесплатную lite-версию CodeSourcery можно здесь:
http://www.codesourcery.com/sgpp/lite/arm/portal/release1600
— есть версии и под Windows и под Linux.
Попробуем написать долгожданный Hello World 🙂
создадим в /opt/toolchains/uclibc-crosstools_gcc-3.4.2_uclibc-20050502/
файл hello.c
// // // test // // robocraft.ru // // compile: // sudo ./bin/mips-uclibc-gcc -o hello hello.c // #include <stdio.h> int main() { printf("[i] Start...\n"); // // here will be terrible piece of code :) // printf("[i] End.\n"); return 0; }
чтобы скомпилировать выполним команду:
sudo ./bin/mips-uclibc-gcc -o hello hello.c
скомпилировалось!
исходный код и скомпилированная программа:
hello.tar.gz
остаётся забросить её в нашу файловую систему.
поместим программу hello в тоже место, что и скрипт: usr/bin/
снова собираем файловую систему
# ./mksquashfs squashfs-root/ sq4.bin -be -no-fragments -noI -all-root -noappend -lzma -b 65536
и получаем новую версию файла корневой файловой системы:
sq4.bin
повторяем сборку прошивки с помощью утилиты packImage.exe:
C:\temp\ParseImage\Release> packImage.exe bcm.bin cfe.bin sq4.bin kernel.bin
Получаем новую прошивку
result-sq4-hello.bin
Заливаем её в модем. Ждём пока он перезагрузится и подключаемся telnet-ом.
Запускаем sh.
момент истины
# cd /usr/bin # ls -asl 0 lrwxrwxrwx 1 0 0 17 tftp -> ../../bin/busybox 0 lrwxrwxrwx 1 0 0 17 ftpget -> ../../bin/busybox 0 -rwxrwxrwx 1 0 0 37 mytest 1 lrwxrwxrwx 1 0 0 17 test -> ../../bin/busybox 0 lrwxrwxrwx 1 0 0 17 logger -> ../../bin/busybox 0 lrwxrwxrwx 1 0 0 17 [ -> ../../bin/busybox 1 lrwxrwxrwx 1 0 0 17 tty -> ../../bin/busybox 7 -rwxr-xr-x 1 0 0 7467 hello 0 lrwxrwxrwx 1 0 0 17 expr -> ../../bin/busybox # ./hello [i] Start... [i] End.
раааботает! 🙂
Наша собственная программа работает на этой маленькой коробочке! Это же круто! 🙂
далее: 0x6 — последовательный порт
Ссылки
http://en.wikipedia.org/wiki/Toolchain
http://www.uclibc.org/toolchains.html
Программы:
hello.tar.gz
0 комментариев на «“Новогоднее исследование ADSL-роутера на базе Linux — 0x5 — пишем первую программу”»
Здравствуйте! Вижу, хорошо поднаторели в общении с этими модемами. (: Может, знаете, каким образом можно пропатчивать CFE с целью расширения поддерживаемого списка плат (board id)? Ну например, я обнаружил, что в этот мопед можно залить прошивку от 2520u/bru/c, но ни ZTEшная, ни убрудэшная CFE эту прошивку попросту не запустят (а убруцэшные прошивки идут без CFE — поди ещё поищи к ним родную CFE), ибо там нет поддержки нужной платы…
С Наступившим! к сожалению, до туда пока не докопался 🙂
феерично, жги еще