little kernel init

\lk-refs-heads-master\arch\arm\crt0.s
_start:
b reset
b arm_undefined
b arm_syscall
b arm_prefetch_abort
b arm_data_abort
b arm_reserved
b arm_irq
b arm_fiq
cmp r0, r1
strlt r2, [r0], #4
blt .L__bss_loop


bl kmain
lk的第一行语句是从crt0.s 中的_start开始,在这个函数的最后会调用kmain 进入到c code的执行
void kmain(void)
{
// create a thread to complete system initialization
dprintf(SPEW, "creating bootstrap completion thread\n");
thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));


// enable interrupts
exit_critical_section();


// become the idle thread
thread_become_idle();
}
在这个函数的最后会new 一个thread,回调函数是bootstrap2
static int bootstrap2(void *arg)
{
dprintf(SPEW, "calling apps_init()\n");
apps_init();


return 0;
}


这个函数最后会调用apps_init。在lk中所有的应该都是以app的形式出现的,其中每个app对应一个
thread,就像前面讲过的fastboot,我们看看在apps_init中怎么给每个app一个thread来运行的
void apps_init(void)
{
const struct app_descriptor *app;


/* call all the init routines */
for (app = &__apps_start; app != &__apps_end; app++) {
if (app->init)
app->init(app);
}


/* start any that want to start on boot */
for (app = &__apps_start; app != &__apps_end; app++) {
if (app->entry && (app->flags & APP_FLAG_DONT_START_ON_BOOT) == 0) {
start_app(app);
}
}
}
这个函数会对放在__apps_start 和__apps_end 的apps如果有init函数,就全部调用init
APP_START(aboot)
.init = aboot_init,
APP_END
以fastboot 为例,apps_init 中的app->init=aboot_init。我们在aboot_init会为fastboot new一个thread来运行.


如果在__apps_start 和__apps_end 的apps 有定义entry 且flags没有APP_FLAG_DONT_START_ON_BOOT
例如shell.c中
APP_START(shell)
.init = shell_init,
.entry = shell_entry,
APP_END
的话,就在apps_init 中就调用start_app
static void start_app(const struct app_descriptor *app)
{
printf("starting app %s\n", app->name);


thread_resume(thread_create(app->name, &app_thread_entry, (void *)app, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
}


就会为这个apps new 一个thread,其回调函数是app_thread_entry
static int app_thread_entry(void *arg)
{
const struct app_descriptor *app = (const struct app_descriptor *)arg;


app->entry(app, NULL);


return 0;
}
在app_thread_entry 中直接调用app->entry 会运行在一个新的thread中,在shell.c中就是shell_entry会在一个new thread中运行.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值