Новогоднее исследование ADSL-роутера на базе Linux — 0x5 — пишем первую программу



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 — пишем первую программу”»

  1. Здравствуйте! Вижу, хорошо поднаторели в общении с этими модемами. (: Может, знаете, каким образом можно пропатчивать CFE с целью расширения поддерживаемого списка плат (board id)? Ну например, я обнаружил, что в этот мопед можно залить прошивку от 2520u/bru/c, но ни ZTEшная, ни убрудэшная CFE эту прошивку попросту не запустят (а убруцэшные прошивки идут без CFE — поди ещё поищи к ним родную CFE), ибо там нет поддержки нужной платы…

    • С Наступившим! к сожалению, до туда пока не докопался 🙂

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение