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

来源:互联网 发布:js 函数触发submit 编辑:程序博客网 时间:2024/06/05 06:39

有的时候,如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);elseaccount_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)

 


 

原创粉丝点击