Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259252
  • 博文数量: 130
  • 博客积分: 4012
  • 博客等级: 上校
  • 技术积分: 2030
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-10 10:40
文章分类

全部博文(130)

文章存档

2010年(130)

我的朋友

分类: LINUX

2010-01-10 17:13:52

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进入省电模式.
阅读(404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~