进程在用户态和内核态的区别[独家解析]
先看基础常识:
基础
内核在创建进程的时候,会为进程创建相应的堆栈。 每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。 当进程在用户空间运行时,CPU寄存器里面的内容是用户堆栈地址,使用用户栈 当进程在内核空间时,CPU寄存器里面的内容是内核栈空间地址,使用内核栈。 切换过程: 当发生系统调用时,用户态的程序发起系统调用。用户态程序权限不足,因此会中断执行,发生中断后,当前CPU执行的程序会中断,跳转到中断处理程序。内核程序开始执行,也就是开始处理系统调用。内核处理完成后,这样会再次发生中断,切换回用户态工作。
区别:
最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序 系统中执行的程序大部分时间运行在用户态,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
用户态切换到内核态的3种方式
1. 系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。 2.异常 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。 3.外围设备的中断 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
相关文章
- 深入理解Linux内核进程的管理与调度(最详细)
- 一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
- 当没有进程可调度时,内核在做什么呢?
- linux中用户态和内核态是什么_用户态内核
- 操作系统用户态和内核态之间的切换过程是什么_用户进程从用户态切换到内核态
- 内核态和用户态的区别_会导致用户进程用户态到内核态
- 为什么要分用户态和内核态_会导致用户进程用户态到内核态
- 驱动开发:内核枚举进程与线程ObCall回调
- 驱动开发:内核MDL读写进程内存
- 驱动开发:内核MDL读写进程内存
- 驱动开发:内核中实现Dump进程转储
- 【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
- 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )
- 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )
- 【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )
- 【Linux 内核】实时调度类 ① ( 进程分类 | 实时进程、普通进程 | Linux 内核 SCHED_FIFO、SCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )
- Linux内核开发:创新培训之路(linux内核开发培训)
- 升级Linux 4.6内核:提升操作体验(linux4.6内核)
- Linux内核死锁:深入解析(linux内核死锁)
- kernelGlib在Linux内核中的应用(gliblinux)
- Linux内核系统中 KSet 的应用(linuxkset)
- 升级Linux 4:新一代内核升级(linux4.内核)
- 学习Linux内核修改:一步一步深入(linux修改内核)
- Linux 内核 4.2 RC 获史上最大更新量
- Linux内核的初始化过程(linux内核init)
- 学习Linux U int,了解内核编程的精华(linuxuint)