本文共 1756 字,大约阅读时间需要 5 分钟。
我们知道,linux运行的时候,其实是 各个进程的运行虽然,会有下面几种状态 1. 不同进程的切换 2. 进程不同状态的切换但整体上来讲,系统运行起来的时候 ,其实 是不同进程 运行的集合
进程分为以下三类 用户进程/用户线程 用户态 内核态 内核线程我们讨论寄存器的时候,不关心 他是用户进程还是用户线程,所以归结为用户进程所以依据寄存器来看,讨论分为以下三类 1.用户态的用户进程 2.内核态的用户进程 3.内核线程
内核线程位于 svc mode , 有 17个寄存器r0 - r15 , cpsr , spsr以 idle 进程为例r0-r12 : 与 idle代码相关r13 : sp,是idle的栈,值 为 init_task对应的thread_info + 8KB 下方的位置 的地址lr : TODOpc : idle 代码运行的下条指令的地址cpsr : svc modespsr : TODO
用户态的用户进程 位于 usr mode , 有 16 个 寄存器r0 - r15 , cpsr以 init 用户进程 为例r0-r12 : 与 用户代码相关r13 : 这个是 创建 用户 init 进程 的时候设置的,存在 pt_regsr14 : 这个是 创建 用户 init 进程 的时候设置的,存在 pt_regsr15 : init 用户代码运行的下条指令的地址cpsr : usr mode
内核态的用户进程 位于 svc mode , 有 17个 寄存器以 init 用户进程 为例r0-r12 : 与 内核系统调用路径 代码相关r13 : sp,是init的内核栈,值 为 a.out 的 task_struct对应的thread_info + 8KB 下方的位置 的地址lr : 用户代码内 address of next instruction after the SWI instructionpc : 系统调用 代码运行的下条指令的地址cpsr : svc modespsr : 用户态的 cpsr
用户态的用户进程 位于 usr mode , 有 16 个 寄存器r0 - r15 , cpsr以 a.out 用户进程 为例r0-r12 : 与 用户代码相关r13 : 这个是 创建 用户 a.out 进程 的时候设置的,存在 pt_regs , 复制的 init的 pt_regs , 有没有修改 ?r14 : 这个是 创建 用户 a.out 进程 的时候设置的,存在 pt_regs , 复制的 init的 pt_regs , 有没有修改 ?// 创建过程 与 init 不同r15 : a.out 用户代码运行的下条指令的地址cpsr : usr mode
内核态的用户进程 位于 svc mode , 有 17个 寄存器以 a.out 用户进程 为例r0-r12 : 与 内核系统调用路径 代码相关r13 : sp,是a.out的内核栈,值 为 a.out 的 task_struct对应的thread_info + 8KB 下方的位置 的地址lr : swi异常发生后,硬件设置的,用户代码内 address of next instruction after the SWI instructionpc : 系统调用 代码运行的下条指令的地址cpsr : swi异常发生后,硬件设置的,svc modespsr : 用户态的 cpsr
任意的用户进程用户态 状态 pc = 0001 0000 左右 sp = bece 0000 左右任意的内核进程及任意的用户进程内核态状态 pc = c000 8000 以上 (例如 c0111314处为sys_fork) sp = malloc 区域(c000 0000 -cfff ffff) // task_struct对应的thread_info + 8KB 下方的位置
转载地址:http://mcigi.baihongyu.com/