Собрал U-boot, Linux ядро и RAMdisk.
Все запустилось. Консоль работает :-)
Но хотелось-бы прояснить некоторые моменты.
U-Boot распаковывает ядро с адреса 0x20008000.
RAMDISK ( gzip сжатие) image находится по адресу 0x20410000.
Ядру передаются следующие параметры
root=/dev/ram rw initrd=0x20410000,0x800000 ramdisk_size=8192 console=ttyS1,115200 mem=32M
Ядро находит запакованный RAMDISK и монтирует
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 120K
Теперь сами вопросы :-)
1. С какого адреса Linux распаковывает сжатый RAMDISK ?
2. Где у Linux находится стек? Ядро знает, что памяти 32M из строки аргументов.
Но откуда оно знает где вершина стека ?
3. Linux использует стек, который U-boot ему оставил в наследство?
Или само ядро инициализирует стек ?
Извините, я не настолько изощрен в потрохах ядра чтобы ответить на Ваши вопросы. Полагаю, что ядро само инициализирует стек (скорее целую тучу стеков, ведь по идее каждый процес имеет свой стек), адрес распаковки рамдиска тоже скорее всего сама рассчитывает.
Насчет стеков для процессов согласен.
Где-то встречал предупреждение,
что если указать неправильно "mem" ( наверноре имелось ввиду завышенное значение), то рано или поздно это приведет к краху системы. Наверное система растет вверх.
Интересно откуда берется отсчет ?
Memory: 32MB = 32MB total
Memory: 21176KB available (2708K code, 238K data, 120K init)
21176KB + 8000KB ( рамдиск)
хммм. Похоже, что знает :-)
> адрес распаковки рамдиска тоже скорее всего сама рассчитывает.
Может и рассчитывает.
А что означает "Freeing init memory: 120K"?
Какая это память иницализатора освобождается? Может распаковщика RAMDISK ?
Toolchain я генерил сам( binutils,GCC, newlib, U-boot, Linux).
Собрать busybox c newlib не имеется возможности.
Поэтому я взял готовый RootFS пока. Для экспериментов.
Меня интересует - правильно ли я двигаюсь.
Например, я не знаю какие библиотеки на том RootFS.
Наверное, glibc или ucLibc. Я использую newlib.
newlib - это статическая линковка. Насколько я понимаю,
то SHARED библиотеки не используются. Поэтому, IMHO, все должно работать. Или не так ?
так плата идет с зашитой rootfs - чем она не понравилась ? вообще на диске от платы есть все необходимое. можно испльзовать ее (и наверно в большинстве случаев нужно) как начальный загрузчик и основную rootfs держать на внешней flash (sd, mmc, usb) - они есть готовые, можно собрать самому (как собрать не напрягаясь можно найти например тут http://www.angstrom-distribution.org/building-angstrom там же если поискать есть готовые образы). Немного о том как писать для платы велись разговоры на этом форуме
http://www.starterkit.ru/new/index.php?name=Forums&op=showtopic&id=90
Вообще что касается linux на этих контроллерах очень много полезного можно узнать тут http://www.linux4sam.org/ - там информация не очень опративно обновляется но жить можна :)
Я, естественно, знаю про ttp://www.linux4sam.org/ и
http://www.angstrom-distribution.orgю
Я даже смонтировал angstrom JFFS2 Image на моем PC.
Привожу команды для Ubuntu. Может кому пригодится
cd ~/fs
sudo /sbin/modinfo mtdcore
sudo modprobe jffs2
sudo modprobe mtdram
modprobe mtdram total_size=16384
sudo modprobe mtdchar
sudo modprobe mtdblock
sudo dd if=Angstrom-console-image-demo-glibc.rootfs.jffs2 of=/dev/mtd0
sudo mount -t jffs2 /dev/mtdblock0 ~/rootfs
Он очень большой для RAMDISK ( ~12MB). Памяти всего 32MB.
Поэтому я подчистил его и сделал из этих файлов EXT2 Ramdisk. Пока не монтируется :-( Проблемы c init.
Кстати, ч не совсем понял назначение linuxrc файла ( симлинк на busybox). В Angstrom root он осутствует.
На том root, что у меня запускается он есть в корне.
Linux стартует с init. Зачем linuxrc?