Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:6
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:10
Форум » starterkit.ru » Embedded Linux
Запуск Linux через Bootstrap
Dmil
Добавлено 28.10.2009 18:28 Редактировалось 28.10.2009 20:15
0
Сообщение: 1
Dmil
0

Пункты: 27
Регистрация: 25.10.2009
вопрос, собственно, по этой теме:
http://www.starterkit.ru/new/index.php?name=Forums&op=showtopic&id=225

как считается размер структуры?
params->hdr.tag = ATAG_CMDLINE;
params->hdr.size = (sizeof(struct atag_header) + sizeof(BOOT_ARG) + 1 + 4) >> 2;

почему так хитро?

сорри, только что статья
http://www.simtec.co.uk/products/SWLINUX/files/booting_article.pdf
стала доступна для скачивания
так что вопрос снимается
Спуститься к концу Подняться к началу
Персональная информация
Dmil
Добавлено 09.11.2009 18:17 Редактировалось 09.11.2009 21:34 Сообщение: 2
Dmil
0

Пункты: 27
Регистрация: 25.10.2009
а кто-нибудь пробовал линукс бутстрапом запускать?
у меня не пускается.
идет распаковка, потом пишет "старт ядра" и тишина...
используется, ес-но /arch/arm/boot/zimage
если использую u-boot c тем же ядром (после mkimage) - работает.
где я ошибаюсь?

KERNEL_PARAMS_ADDRESS = 0x20000100
JUMP_ADDR = 0x20008000
IMG_ADDRESS = 0x42000
IMG_SIZE = 0x200000

в main такие правки:
PHP - Код

#include <string.h>

/* list of possible tags */
#define ATAG_NONE 0x00000000
#define ATAG_CORE 0x54410001
#define ATAG_MEM 0x54410002
#define ATAG_CMDLINE 0x54410009

/* See also ARM926EJ-S Technical Reference Manual */
#define C1_DC (1<<2) /* dcache off/on */
#define C1_IC (1<<12) /* icache off/on */

/* structures for each atag */
struct atag_header
{
unsigned int size; /* length of tag in words including this header */
unsigned int tag; /* tag type */
};

struct atag_core
{
unsigned int flags;
unsigned int pagesize;
unsigned int rootdev;
};

struct atag_cmdline
{
char* cmdline;
};

struct atag
{
struct atag_header hdr;
union
{
struct atag_core core;
struct atag_cmdline cmdline;
}
u;
};

#define tag_next( t ) ((struct atag *)((unsigned int *)( t ) + ( t ) -> hdr.size))
#define tag_size( type ) ((sizeof(struct atag_header) + sizeof(struct type)) >> 2)
static struct atag *params; /* used to point at the current tag */

static void setup_core_tag()
{
params = (struct atag *)KERNEL_PARAMS_ADDRESS; /* Initialise parameters to start at given address */

params->hdr.tag = ATAG_CORE; /* start with the core tag */
params->hdr.size = tag_size( atag_core ); /* size the tag */

params->u.core.flags = 1; /* ensure read-only */
params->u.core.pagesize = 4096; /* systems pagesize (4k) */
params->u.core.rootdev = 0; /* zero root device (typicaly overidden from commandline )*/

params = tag_next( params ); /* move pointer to next tag */
}

static
void setup_cmdline_tag()
{
#ifdef BOOT_ARG
params->u.cmdline.cmdline = "bootargs=" BOOT_ARG "\0"; /* place commandline into tag */
int linelen = strlen( params->u.cmdline.cmdline );
if( !
linelen ) /* do not insert a tag for an empty string */
return;
params->hdr.tag = ATAG_CMDLINE; /* Commandline tag */
params->hdr.size = (sizeof(struct atag_header) + linelen + 1 + 4) >> 2;
params = tag_next(params); /* move pointer to next tag */
#endif /* BOOT_ARG */
}

static
void setup_end_tag()
{
params->hdr.tag = ATAG_NONE; /* Empty tag ends list */
params->hdr.size = 0; /* zero length */
}

static
int cleanup_before_linux()
{
unsigned long i,old,temp;

/* disable interrupts */
__asm__ __volatile__("mrs %0, cpsr\n"
"orr %1, %0, #0xc0\n"
"msr cpsr_c, %1"
: "=r" (old), "=r" (temp)
:
:
"memory");

/* turn off I/D-cache */
asm ("mrc p15, 0, %0, c1, c0, 0":"=r" (i));
i &= ~(C1_DC | C1_IC);
asm ("mcr p15, 0, %0, c1, c0, 0": :"r" (i));

/* flush I/D-cache */
i = 0;
asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (i));

return
0;
}

/*------------------------------------------------------------------------------*/
/* Function Name : main */
/* Object : Main function */
/* Input Parameters : none */
/* Output Parameters : True */
/*------------------------------------------------------------------------------*/
int main(void)
{
/* ================== 1st step: Hardware Initialization ================= */
/* Performs the hardware initialization */
#ifdef CFG_HW_INIT
hw_init();
#endif

/* ==================== 2nd step: Load from media ==================== */
/* Load from Dataflash in RAM */
#ifdef CFG_DATAFLASH
load_df(AT91C_SPI_PCS_DATAFLASH, IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
#endif

/* Load from Nandflash in RAM */
#ifdef CFG_NANDFLASH
load_nandflash(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
#endif

/* Load from Norflash in RAM */
#ifdef CFG_NORFLASH
load_norflash(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
#endif

/* ==================== 3rd step: Process the Image =================== */
/* Uncompress the image */
#ifdef GUNZIP
decompress_image((void *)IMG_ADDRESS, (void *)JUMP_ADDR, IMG_SIZE); /* NOT IMPLEMENTED YET */
#endif /* GUNZIP */

/* ==================== 4th step: Start the Linux =================== */
#ifdef CFG_DEBUG
dbg_print("set tags\r\n");
#endif
setup_core_tag(); /* standard core tag */
setup_cmdline_tag(); /* commandline setting root device */
setup_end_tag(); /* end of tags */
#ifdef CFG_DEBUG
dbg_print("cleanup\r\n");
#endif
cleanup_before_linux();
void (*theKernel)(int zero, int arch, unsigned int params);
theKernel = (void (*)(int, int, unsigned int))JUMP_ADDR;
#ifdef CFG_DEBUG
dbg_print("start kernel\r\n");
#endif
/* Jump to kernel with register set*/
theKernel( 0, MACH_TYPE, KERNEL_PARAMS_ADDRESS );
return
0;
}
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.11.2009 20:34 Сообщение: 3
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
а кто-нибудь пробовал линукс бутстрапом запускать?

есс-но пробовал, или вы думаете я из астрала исходники выложил ? :)
Цитата
идет распаковка, потом пишет "старт ядра"

если доходит до этого этапа то загрузчик уже неипричем так как это сообщения _ядра_ и оно уже стартануло, я бы поменял
JUMP_ADDR = 0x20008000 на
JUMP_ADDR = 0x21000000
Спуститься к концу Подняться к началу
Персональная информация
Dmil
Добавлено 09.11.2009 21:18 Редактировалось 09.11.2009 21:32 Сообщение: 4
Dmil
0

Пункты: 27
Регистрация: 25.10.2009
разобрался
надо добавить инициализацию памяти + поменять командную строку.
ну и присвоить
RAM_BASE = 0x20000000
RAM_SIZE = 0x4000000 или 0x2000000 (у кого как)

вообще, я удивлен... у меня код, приведенный в образцах setup_cmdline_tag не компилился...

PHP - Код

static void setup_mem_tag()
{
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size(atag_mem);
params->u.mem.start = RAM_BASE;
params->u.mem.size = RAM_SIZE;
params = tag_next( params );
}

static
void setup_cmdline_tag()
{
#ifdef BOOT_ARG
char* line = BOOT_ARG "\0"; /* place commandline into tag */
int linelen = 0;
for( ; *(
line + linelen) != 0; linelen++ ) { params->u.cmdline.cmdline[linelen] = *(line + linelen);}
params->u.cmdline.cmdline[linelen] = 0;
if( !
linelen ) /* do not insert a tag for an empty string */
return;
params->hdr.tag = ATAG_CMDLINE; /* Commandline tag */
params->hdr.size = (sizeof(struct atag_header) + linelen + 1 + 4) >> 2;
params = tag_next(params); /* move pointer to next tag */
#endif /* BOOT_ARG */
}
...
setup_core_tag(); /* standard core tag */
setup_mem_tag();
setup_cmdline_tag(); /* commandline setting root device */
setup_end_tag();
...
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.11.2009 22:27 Редактировалось 09.11.2009 22:33 Сообщение: 5
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
надо добавить инициализацию памяти

так она же в бутстрапе уже итак есть и вызывается тут

Код
/* ================== 1st step: Hardware Initialization ================= */
/* Performs the hardware initialization */
#ifdef CFG_HW_INIT
hw_init();
#endif


разве что в конфиге нужно указать CFG_HW_INIT, у меня проще - эта ф-ция вызывается без всяких ifdef - без хардварной мнмциализации ничего не заработает все равно :)

Цитата
+ поменять командную строку.
ну и присвоить
RAM_BASE = 0x20000000
RAM_SIZE = 0x4000000 или 0x2000000 (у кого как)

вообще, я удивлен... у меня код, приведенный в образцах setup_cmdline_tag не компилился...


даже незнаю что сказать - командную строку в моем варианте можно даже с терминала забить и она подставляется в setup_cmdline_tag при этом все компилится работает, тэг ATAG_MEM я вообще не использовал так как и без него работает - достаточно указать в командной строке сколько у тебя памяти например mem=32M
Спуститься к концу Подняться к началу
Персональная информация
Dmil
Добавлено 10.11.2009 10:40 Сообщение: 6
Dmil
0

Пункты: 27
Регистрация: 25.10.2009
hw_init только инициализируетт контроллер,
а надо указать линуксу физические адреса памяти.
каким образом у вас без этого работает - не понимаю.
может, вы в ядре это пописали где-то?
до командной строки дело даже не доходит. насколько я понимаю, ядро не может стек без этого правильно инициализировать, а запуск без этого не произойдет.
и еще непонятный момент.
у вас в коде
params->u.core.flags = 0; /* ensure read-only */
params->u.core.pagesize = 0; /* systems pagesize (4k) */

почему так???
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.11.2009 12:55 Сообщение: 7
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
hw_init только инициализируетт контроллер,
а надо указать линуксу физические адреса памяти.


Думаю эта информация есть в ядре - не зря же существуют board-файлы и тд., я ничего не добавлял, более того ядро ванильное без сторонних патчей. Единственое - mem=32M обязательно иначе мне кажется в ядре прописано для -EK 64М, если не указать ядро виснет на каком-то этапе загрузки.

Цитата
до командной строки дело даже не доходит


у меня достатчно быстро доходит и это одна из причин почему я выбросил u-boot :)

Цитата

и еще непонятный момент.
params->u.core.flags = 0; /* ensure read-only */
params->u.core.pagesize = 0; /* systems pagesize (4k) */


по-моему это значения по умолчанию и они меня устраивали, в pdf по ссылке об этом ничего не написано ?
Спуститься к концу Подняться к началу
Персональная информация
Dmil
Добавлено 10.11.2009 12:59 Сообщение: 8
Dmil
0

Пункты: 27
Регистрация: 25.10.2009
там
params->u.core.flags = 1; /* ensure read-only */
params->u.core.pagesize = 4096; /* systems pagesize (4k) */

у меня также
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.11.2009 13:40 Сообщение: 9
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата
там
params->u.core.flags = 1; /* ensure read-only */
params->u.core.pagesize = 4096; /* systems pagesize (4k) */


Честно говоря не помню откуда я это взял но точно не с потолка :) Возможно коментарии остались старые а почему там нули - не помню. Я смотрел исходники разных загрузчиков - u-boot в том числе, возможно там что-то нарыл. Возможно если занулить эти параметры ядро само подбирает оптимальные значения.
Спуститься к концу Подняться к началу
Персональная информация
Lavin
Добавлено 21.01.2010 11:24 Редактировалось 21.01.2010 11:46 Сообщение: 10
Lavin
2.4

Пункты: 1267
Регистрация: 22.05.2009
Пол: Мужчина
Из: Москва
Добрый день.
Я новичек в плане Bootstrap.Немогли бы вы сказать что надо поправить я Bootstrap"е с диска что бы грузилась плата.
И где поменять инициализацию памяти на 64 мегабайта(допаял еще одну микруху памяти)
Заранее спасибо.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux