Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531795
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2007-07-21 20:24:39

浅析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进入省电模式.

阅读(2475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~