linux启动流程导读(arm为例)<二>
来源:互联网 发布:js给json对象添加属性 编辑:程序博客网 时间:2024/05/16 04:56
==============================================
本文系本站原创,欢迎转载!转载请注明出处:
http://blog.csdn.net/gdt_a20/article/details/7220389
==============================================
进入init/main.c
start_kernel
asmlinkage void __init start_kernel(void){
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
smp_setup_processor_id();
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
debug_objects_early_init();
/*
* Set up the the initial canary ASAP:
*/
boot_init_stack_canary();
cgroup_init_early();
================
第一个函数smp_setup_processor_id();
arch/arm/smp.c
================int __cpu_logical_map[NR_CPUS];
void __init smp_setup_processor_id(void)
{
int i;
u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0; //判断是否是smp系统,如果是读取当前cpuid,否则为0
//存在多cpu,判断哪个cpu是当前cpu
cpu_logical_map(0) = cpu; //当前cpu赋值给cpu第一个表项
for (i = 1; i < NR_CPUS; ++i)
cpu_logical_map(i) = i == cpu ? 0 : i; //当前cpu如果不是0,那么会把他安排到数组第一项,则原来位置要用0填充
printk(KERN_INFO "Booting Linux on physical CPU %d\n", cpu);
}
================
arch/arm/include/asm/smp_plat.h
/*
* Return true if we are running on a SMP platform
*/
static inline bool is_smp(void)
{
#ifndef CONFIG_SMP
return false;
#elif defined(CONFIG_SMP_ON_UP)
extern unsigned int smp_on_up;
return !!smp_on_up;
#else
return true;
#endif
}
===============
可以配置是否为smp
===============
static inline unsigned int __attribute_const__ read_cpuid_mpidr(void)
{
return read_cpuid(CPUID_MPIDR);
}
arch/arm/include/asm/cputype.h
===============
#define read_cpuid(reg) \
({ \
unsigned int __val; \
asm("mrc p15, 0, %0, c0, c0, " __stringify(reg) \
: "=r" (__val) \
: \
: "cc"); \
__val; \
})
===============
1 /*2 * Logical CPU mapping.3 */4 extern int __cpu_logical_map[NR_CPUS];5 #define cpu_logical_map(cpu) __cpu_logical_map[cpu]
Thanks
- linux启动流程导读(arm为例)<二>
- linux启动流程导读(arm为例)<一>
- linux启动流程导读(arm为例)<一>
- linux启动流程导读(arm为例)<一>
- arm linux启动流程二
- 6410为例的ARM启动linux流程
- arm linux 启动流程
- arm linux 启动流程
- linux启动流程arm
- Arm linux启动流程
- Android arm linux kernel启动流程(二)
- Android arm linux kernel启动流程(二)
- Android arm linux kernel启动流程(二)
- Android arm linux kernel启动流程(二)
- ARM-linux启动的流程
- ARM-linux的启动流程
- ARM-linux启动的流程
- ARM-linux的启动流程
- 多表关联的update语句
- MFC 程序入口和执行流程
- 使用Plproxy设计PostgreSQL分布式数据库01
- 使用Plproxy设计PostgreSQL分布式数据库02
- 对.NET的认识
- linux启动流程导读(arm为例)<二>
- Subversion Edge 2.x迁移说明
- 使用Plproxy设计PostgreSQL分布式数据库03
- 用cmd命令行为窗体文件打jar包
- ubuntu 10.04 整合 CEGUI-0.7.5与ogre_src_v1-7-3
- 视频学习网
- POJ 1543 Perfect Cubes(我的水题之路——四重暴力水)
- C# ReferenceEquals,equals,==区别
- System.Diagnostics命名空间里的Debug类和Trace类的用途(收藏)