您的位置:首页 > 运维架构 > 网站架构

kernel怎么知道是user还是system空间(ARM架构实现)

2013-11-01 21:56 459 查看
有的时候,如linux kernel的负载统计任务等

tick 发生的时候,需要知道系统此时是user/system空间。

如kernel一下场景有应用:

void account_process_tick(struct task_struct *p, int user_tick)
{
	if (user_tick)
		account_user_time(p, cputime_one_jiffy, one_jiffy_scaled);
	else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))
		account_system_time(p, HARDIRQ_OFFSET, cputime_one_jiffy,
				    one_jiffy_scaled);
	else
		account_idle_time(cputime_one_jiffy);


此宏可判断处于什么模式:

user_mode(get_irq_regs())

//得到当前进程的寄存器信息
static inline struct pt_regs *get_irq_regs(void)
{
	return current_thread_info()->regs;
}


// 可以大概了解下,ARM寄存器的基本信息

#define ARM_cpsr uregs[16]

#define ARM_pc uregs[15]

#define ARM_lr uregs[14]

#define ARM_sp uregs[13]

#define ARM_ip uregs[12]

#define ARM_fp uregs[11]

#define ARM_r10 uregs[10]

#define ARM_r9 uregs[9]

#define ARM_r8 uregs[8]

#define ARM_r7 uregs[7]

#define ARM_r6 uregs[6]

#define ARM_r5 uregs[5]

#define ARM_r4 uregs[4]

#define ARM_r3 uregs[3]

#define ARM_r2 uregs[2]

#define ARM_r1 uregs[1]

#define ARM_r0 uregs[0]

#define ARM_ORIG_r0 uregs[17]

具体可参照CPSR寄存器:



#define USR_MODE 0x00000010

#define FIQ_MODE 0x00000011

#define IRQ_MODE 0x00000012

#define SVC_MODE 0x00000013

#define ABT_MODE 0x00000017

#define UND_MODE 0x0000001b



最终可判断处于什么模式

#define user_mode(regs)	\
	(((regs)->ARM_cpsr & 0xf) == 0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐