kernel怎么知道是user还是system空间(ARM架构实现)
有的时候,如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)