kernel怎么知道是user还是system空间(ARM架构实现)
2013-11-01 21:56
459 查看
有的时候,如linux kernel的负载统计任务等
tick 发生的时候,需要知道系统此时是user/system空间。
如kernel一下场景有应用:
此宏可判断处于什么模式:
// 可以大概了解下,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
最终可判断处于什么模式
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)
相关文章推荐
- 你知道怎么实现MBR和GPT之间的转换么?
- 怎么知道windows dll是32位还是64位?
- android系统镜像:boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img
- Android 中用内核模块实现系统调用(Implement system call by kernel module in Android)
- 你正在从一个声称代表如下的证书颁发机构安装证书 alipay truest network,希望能知道程序是怎么实现的或相关资料
- 一个类所实现的两个不同的接口中,有同名的方法,怎么知道实现的是哪个接口中的方法
- 学计算机的,怎么知道自己喜欢软件还是硬件
- ”标准答案没出来,我怎么知道我想表达什么?……“这样的话,根本就不仅仅是笑话,而且还是现实
- 调整kernel_space与user_space的内存空间
- 有些疑惑,一个普通的aspx页面的文件,IIS怎么知道改用 asp.net1.1还是 2.0来解释呢?
- 你知道PING功能是怎么实现的吗
- Android 系统镜像: boot.img kernel.img ramdisk.img system.img userdata.img cache.img recovery.img
- 根据IP地址怎么知道是电信还是网通
- linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问
- 应用Setting中,不想让用户清除数据怎么办,贱贱的管理空间怎么实现的?
- DDX_TEXT怎么实现数据从控件到变量还是从变量到控件
- 求教 “不要用额外空间来实现”怎么理解
- 明明添加引用了,但还是提示:未能找到类型或命名空间名称xxx,这是怎么回事?
- 怎么知道鼠标是向前滚动还是向后滚的了js代码
- 怎么能够知道请求是从WML浏览器来的还是HTML浏览器来的?