CPU用户态和内核态

内核态(管态)与用户态(目态)

操作系统需要两种CPU状态:

  • 内核态(Kernel Mode):运行操作系统程序,操作硬件,又叫管态
  • 用户态(User Mode):运行用户程序,又叫目态

操作系统有三个特权级别:R0(Ring0)、R1(Ring1)、R2(Ring2)和R3(Ring3)。R0相当于内核态,R3相当于用户态,不同级别能够运行不同的指令集合。

内核态与用户态的区别

  1. 用户态的程序运行在3级特权级上,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。内核态的程序运行在0级特权级上。
  2. 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的。处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的

用户态到内核态的切换

CPU由用户态进入内核态的方式主要有以下三种:

  1. 系统调用:用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如fork()实际上就是执行了一个创建新进程的系统调用,write()和read()等用于IO操作的函数。系统调用机制的核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
  2. 异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
  3. 外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序。如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

用户态切换到内核态

用户态切换内核态的流程:

  1. 每个线程都对应着一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。
  2. 内核栈将当前进程的寄存器信息保存起来,同时保存了被暂停执行的程序的下一条指令,完成了由用户栈到内核栈的切换过程。
  3. 将CPU的字段改为内核态(即R0等级),然后开始执行内核方法。
  4. 当内核方法执行完毕后,会将CPU的字段改为用户态(R3等级),然后利用之前写入的信息来恢复用户方法的执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值