浅析armlinux-init核心线程创建流程梗概描述和图解
------------------------------------------------------------- init核心线程创建函数 pid_t arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) { pid_t __ret; __asm__ __volatile__( "orr r0, %1, %2 \n\ mov r1, #0 \n\ "__syscall(clone)" \n\//swi 0x00900078系统调用,执行sys_clone() movs %0, r0 \n\//创建的线程pid存放在r0中 bne 1f \n\//r0非0表示从父进程返回,调到标号1:处,继续执行,进入cpu_do_idle(); mov fp, #0 \n\//r0=0;表示从创建的子进程返回 mov r0, %4 \n\ mov lr, pc \n\ mov pc, %3 \n\//执行init核心线程 b sys_exit \n\//init核心线程退出 1: " : "=&r" (__ret) : "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg) : "r0", "r1", "lr"); return __ret; } 对于内嵌汇编的理解,请参见《浅析arm-linux内嵌汇编小程序》 ------------------------------------------------------------- cpu_arm920_do_idle函数的定义 include/asm-arm/Cpu-single.h中 #ifdef __STDC__ #define __cpu_fn(name,x) cpu_##name##x #else #define __cpu_fn(name,x) cpu_/**/name/**/x #endif #define cpu_fn(name,x) __cpu_fn(name,x) #define cpu_do_idle cpu_fn(CPU_NAME,_do_idle) 因为是at91rm9200,所以,CPU_NAME=arm920,因此, #define cpu_do_idle cpu_arm920_do_idle ------------------------------------------------------------- arch/arm/mm/proc-arm920.S .align 5 ENTRY(cpu_arm920_do_idle) mcr p15, 0, r0, c7, c0, 4 mov pc, lr 通过cp15协处理器,使cpu进入低电压状态,停止运行等待中断出现,at91rm9200进入省电模式.
|