一 内核态和用户态的区别

当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权级最高的(0级)内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每个进程都有自己的内核栈。

当进程执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的用户代码中运行。当正在执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内核态。因为中断处理程序将使用当前进程的内核态。

内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。Linux使用了Ring3级别运行用户态。Ring0作为内核态,没有使用Ring1和Ring2。Ring3不能访问Ring0的地址空间,包括代码和数量。Linux进程的4GB空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。用户运行一程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换Ring3,回到用户态。这样,用户态的程序就不能随意操作1内核地址空间,具有一定的安全保护作用

二 用户态和内核态的转换的3种方式

1.系统调用
这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现
2.异常
当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此异常的内核相关程序中,也就到了内核态
3.外围设备的中断
当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有用户态到内核态的切换

具体的切换步骤
1.从当前进程的描述符中提取其内核栈的ss0及esp0信息。
2.使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈找到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
3.将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

最新文章

  1. error at ::0 can't find referenced pointcut messageInsertAspect
  2. Linux Supervisor 守护进程基本配置
  3. Designing IP-Based Video Conferencing Systems: Dealing with Lip Synchronization(唇音同步)
  4. 快速入门系列--MVC--05行为
  5. U-Boot编译过程解析
  6. java模板和回调机制学习总结
  7. groovy-语句
  8. FTP 数字代码的意义
  9. javascript实现颜色渐变
  10. Python问题之奇怪诡异的Bug
  11. tr 命令 操作字符串中字符 删除替换 等
  12. [firefly]暗黑源码解析
  13. 【JVM】JVM垃圾收集器、垃圾收集算法、无用对象
  14. MongoDB之修改器
  15. leetcode152
  16. A pointer is a variable whose value is the address of another variable 指针 null pointer 空指针 内存地址0 空指针检验
  17. MySQL 8.0.2: Introducing Window Functions
  18. 汇编 循环位移指令 ROL, 循环位移指令 ROR
  19. MT【199】映射的个数
  20. android中ListView控件最简单的用法

热门文章

  1. POJO 与 JavaBean 的区别 !
  2. jmeter测试报告汉化及脚本编写
  3. Python3的简单的函数调用
  4. 【转】C# 中的委托和事件(详解)
  5. django 基础框架学习 (一)
  6. 这些年、我收集的JQuery代码 (转)
  7. P2723 丑数 Humble Numbers
  8. kuangbin专题七 HDU3974 Assign the task (dfs时间戳建树)
  9. angularJs基础学习
  10. jQuery中animate()方法以及$('body').animate({"scrollTop":top})不被Firefox支持问题的解决