根据板子里面的启动信息,cat /proc/kmsg,对着代码看。
start_kernel函数分析
1. set_task_stack_end_magic(&init_task);
抽取关键部分
//找到栈顶位置并设置个魔术字,防止堆栈 将 thread_info 的数据覆盖;
//如果是向上生长的栈,直接通过(task_thread_info + 8K - 1)找到栈底并设置魔术字
//内核栈大小一般为4K或者8K.
set_task_stack_end_magic(&init_task);
stackend = end_of_stack(tsk);
return (unsigned long *)(task_thread_info(p) + 1);
*stackend = STACK_END_MAGIC; // 0x57AC6E9D
//宏定义了就是向上生长
static inline unsigned long *end_of_stack(struct task_struct *p)
{
#ifdef CONFIG_STACK_GROWSUP
return (unsigned long *)((unsigned long)task_thread_info(p) + THREAD_SIZE) - 1;
#else
return (unsigned long *)(task_thread_info(p) + 1);
#endif
}
(栈向下生长的情况)