Линукс на плате Марсоход2 успешно стартует и монтирует RAM Disk

linux pinguin
Итак, Линукс на плате Марсоход2 успешно стартует и монтирует RAM Disk и запускает пользовательскую программу sbin/init с RAM диска.

Честно говоря не думал, что это будет так трудно. Потратил все новогодние праздники. Самое главное не очень понятно почему это так происходит. Оригинальные инструкции проекта Amber с сайта OpenCores то ли не совсем корректные, то ли каким-то образом устарели. Если следовать им, то не получается откомпилировать ядро, возникает масса проблем при компиляции и конфигурировании ядра. Проходилось много дебажить. Последняя проблема, которую я встретил – неправильно выполнялся mmap исполняемого пользовательского файла. В конце концов похоже все работает.

Теперь все позади.
Я слелал коммиты на нашей странице GitHub посвященной Amber и линуксу на плате Марсоход2. Теперь, я надеюсь, Вы сможете без проблем сами откомпилировать ядро и запустить его.


Теперь RAM диск успешно монтируется и с него запускается уже «пользовательская программа» init. В нашем случае она ничего особо толкового не делает, просто пишет “Hello, World! Hello, Marsohod!

Вот собственно вывод из консоли терминала (я использую программу TeraTerm):


Linux version 2.4.27-vrs1 (nick@ubuntu) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-46) ) #1 Tue Jan 22 23:48:37 PST 2013
CPU: Amber 2 revision 0
Machine: Amber-FPGA-System
On node 0 totalpages: 256
zone(0): 256 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyAM0 mem=8M root=/dev/ram
19.91 BogoMIPS (preset value used)
Memory: 8MB = 8MB total
Memory: 6304KB available (783K code, 222K data, 64K init)
Dentry cache hash table entries: 4096 (order: 0, 32768 bytes)
Inode cache hash table entries: 4096 (order: 0, 32768 bytes)
Mount cache hash table entries: 4096 (order: 0, 32768 bytes)
Buffer cache hash table entries: 8192 (order: 0, 32768 bytes)
Page-cache hash table entries: 8192 (order: 0, 32768 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ttyAM0 at MMIO 0x16000000 (irq = 1) is a WSBN
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with no serial options enabled
ttyS00 at 0x03f8 (irq = 10) is a 16450
ttyS01 at 0x02f8 (irq = 10) is a 16450
RAMDISK driver initialized: 16 RAM disks of 208K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 4096 buckets, 32Kbytes
TCP: Hash tables configured (established 4096 bind 8192)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 200 blocks [1 disk] into ram disk... done.
Freeing initrd memory: 208K
VFS: Mounted root (ext2 filesystem) readonly.
Freeing init memory: 64K
BINFMT_FLAT: Loading file: /sbin/init
Mapping is 2b0000, Entry point is 8068, data_start is 8e4c
Load /sbin/init: TEXT=2b0040-2b8e4c DATA=2b8e50-2b8e83 BSS=2b8e83-2b8e88
start_thread(regs=0x21f9fa4, entry=0x2b8068, start_stack=0x2affb4)
Hello, World!
Hello, Marsohod!



Итак, на GitHub есть теперь такой таг: linux-mounts-ramdisk-with-hello-world

Это на сегодня последняя версия системы на кристалле Amber в плате Марсоход2.
В новой папке sw/vmlinux-my теперь мои файлы и моя инструкция.
Я использую ОС Ubuntu, как рабочее место для сборки ядра.

Чтобы построить ядро Linux для Amber ARM нужно:

  • Задать переменную окружения ссылающуюся на нашу рабочую папку Amber-Marsohod2, например:

export AMBER_BASE=/home/nick/Amber-Marsohod2/

  • Создать папку для работы с ядром и перейти туда, например

mkdir /home/nick/my-linux
export LINUX_WORK_DIR=/home/nick/my-linux
cd ${LINUX_WORK_DIR}

  • Взять архив ядра Линукс по ссылке:

wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.27.tar.gz

  • Разархивировать и создать символическую ссылку для удобства

tar zxf linux-2.4.27.tar.gz
ln -s linux-2.4.27 linux

  • Cкопировать сюда, в  ${LINUX_WORK_DIR}, патчи

cp ${AMBER_BASE}/sw/vmlinux-my/patch-2.4.27-vrs1.bz2 .
cp ${AMBER_BASE}/sw/vmlinux-my/patch-2.4.27-myamber2.tar-gz .

  • Разархивировать патчи

bzip2 -d patch-2.4.27-vrs1.bz2
tar -zxf patch-2.4.27-myamber2.tar.gz


Первый патч от компании ARM, второй патч patch-2.4.27-myamber2.tar.gz создан мной, по результатам моих исследований. Он включает в себя все изменения из оригинального проекта Amber, но имеет и мои исправления.

  • Зайти в папку Linux и наложить патчи

cd ${LINUX_WORK_DIR}/linux
patch -p1 < ../patch-2.4.27-vrs1
patch -p1 < ../patch-2.4.27-myamber2

  • Выбрать конфирурацию ядра

make a5k_config

  • Применить конфигурацию – это довольно странный шаг, но ничего умнее я не придумал

make menuconfig

Появляется диалоговое меню для редактирования конфигурации, но ничего делать не нужно, просто выйти и сохранить.

  • Просканировать зависимости

make dep

  • Компилировать ядро

make vmlinux

Все, готово! Появляется нужный нам файл vmlinux.

Создания образа initrd, initial ram disk.


Для этой процедуры я сделал скрипт, который нужно просто запустить: create_initrd.
Есть правда и ложка дегтя.
Запускаемый файл /sbin/init должен быть формата FLT – это специальный простой формат исполняемого файла, который обычно используется не в Linux, а в uClinux.

Все бы было хорошо, но используемый мною компилятор arm-none-linux-gnueabi-gcc не умеет создавать файлы такого типа. В принципе не умеет. Умеет только ELF файлы создавать, а они у меня все еще не запускаются.

Пришлось все таки с сайта Mentor скачивать другой компилятор для ОС uClinux.
Это Sourcery_G++_Lite. Сам компилятор это arm-uclinuxeabi-gcc.

Вот им компилятором теперь и нужно все делать.
Нужно сперва им откомпилировать sw/hello-world – получаем исполняемый файл hello-world-flt.

Потом уже создаем initrd запуская мой скрипт sw/vmlinux-my/create_initrd
После запуска скрипта появляется папка disk, а в ней initrd.

Как пробовать в плате Марсоход2 (это я уже делаю на другой машине в Windows 7).

  • Запускаем терминал TeraTerm и открываем последовательный порт который ведет на плату Марсоход2. Еще раз замечу, что на плате установлена двухканальная микросхема FTDI. Теоретически там видно два последовательных порта. Однако первый канал занят под JTAG программатор MBFTDI. Второй порт подключен к микросхеме Cyclone III FPGA на плате и собственно используется как консоль для проекта системы на кристалле Amber. Открывать нужно второй порт на скорости 921600 бит/сек.
  • Загружаем в плату в FPGA образ hardware через JTAG из программатора Altera Quartus II. При этом в консоли последовательного порта появляется «интерактивный монитор». Можно читать или писать в ячейки памяти, загружать файлы через последовательный порт по протоколу XMODEM/1K – как раз терминал TeraTerm это умеет.
  • Загружаем образ initrd в память системы в 7-й мегабайт:

>b 700000

В программе TeraTerm используем меню File=>Transfer=>XMODEM=>Send выбираю мой файл initrd для отправки в плату

  • Загружаю образ линукс (буква L только маленькая, load)

>l

Принцип тот же, только используется другая команда «монитора» “l”, которая не только помещает образ в память, но и делает разбор ELF файла ядра. В программе TeraTerm используем меню File=>Transfer=>XMODEM=>Send выбираю мой файл vmlinux для отправки в плату.

  • Запуск системы – это переход по адресу 0x80000. Использую команду монитора:

>j 80000

Вот пожалуй и все. Linux стартует.

В принципе конечно, есть некое удовлетворение от проделанной работы – ядро стартует, ram disk монтируется, пользовательская программа /sbin/init запускается.

Но есть и небольшое расстройство.

Во-первых, все таки пока только FLT файл может запускаться в системе. ELF запустить не удается.

Во-вторых, теперь уже понятно, что моя пользовательская программа init довольно ограниченна в возможностях. На самом деле получается, что всеми возможностями ядра она и пользоваться то не может. Для использования функций ядра нужна библиотека libc или ее аналоги.

Я уже рассмитриваю возможность перейти на использование uClinux – там похоже уже сейчас и ядро посвежее, и встроенные библиотеки libc или uclibc имеются. Опыт теперь уже есть. В общем, есть куда двигаться дальше и как развивать систему.

 


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