LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1006|回复: 1

linux2.6内核中cpu_init堆栈初始化疑惑

[复制链接]
发表于 2011-12-27 22:47:55 | 显示全部楼层 |阅读模式
struct stack {
        u32 irq[3];
        u32 abt[3];
        u32 und[3];
} ____cacheline_aligned;
static struct stack stacks[NR_CPUS];
.........
unsigned int cpu = smp_processor_id();
struct stack *stk = &stacks[cpu];
        __asm__ (
        "msr        cpsr_c, %1\n\t"
        "add        sp, %0, %2\n\t"
        "msr        cpsr_c, %3\n\t"
        "add        sp, %0, %4\n\t"
        "msr        cpsr_c, %5\n\t"
        "add        sp, %0, %6\n\t"
        "msr        cpsr_c, %7"
            :
            : "r" (stk),
              "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
              "I" (offsetof(struct stack, irq[0])),
              "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
              "I" (offsetof(struct stack, abt[0])),
              "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
              "I" (offsetof(struct stack, und[0])),
              "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
            : "r14");

        u32 irq[3];
        u32 abt[3];
        u32 und[3];

这里好像是把&stacks->irq[0]\&stacks->abt[0]\&stacks->und[0]\赋给了sp。。
还是我没有看懂代码???
"r" (stk),它不就是stacks结构体的起始地址吗?
有人说      这个是堆栈的起始地址。。。这样一来那堆栈才12个bytes  。也不够用啊。。
没想明白!
求解
发表于 2011-12-30 09:13:13 | 显示全部楼层
以上的代码用来设置IRQ/ABT/UND三种模式的堆栈地址,并且该地址是由静态变量stacks的地址决定的。stacks的开始地址就是irq[0]的地址,开始地址的0xc偏移处是abt[0]的地址,0x18的偏移处则是und[0]的地址。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表