用户态和内核态的理解和区别

CPU的两种工作状态:内核态(管态)和用户态(目态)。

内核态: 
1.系统中既有操作系统的程序,也有普通用户程序。为了安全性和稳定性,操作系统的程序不能随便访问,这就是内核态。即需要执行操作系统的程序就必须转换到内核态才能执行!!! 
2. 内核态可以使用计算机所有的硬件资源!!!

用户态:不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间!!!!

三种从“用户态”转换到“内核态”的最主要(触发)方式: 
a.系统调用(用户进程主动发起的):这是用户态进程“主动”要求切换到内核态的一种方式,用户态进程通过“系统调用”身子那个使用操作系统提供的服务城区完成工作!! 
b.异常:当CPU执行运行在用户态下的程序时,发生了某些不可知的异常,这是会触发当前运行进程切换到处理此异常的内核程序中,也就转到了内核态,比如缺页异常!! 
c.外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令时用户态下的程序,那么这个转换过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

以上三种触发方式,本质上的切换操作是一致的,没有任何区别,都是相当于执行了一个中断相应的过程!!因为系统调用实际上最终也是“中断机制”实现的,而异常和中断的处理机制基本上也是一致的!!。

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

总结: 
1.计算机系统中有“操作系统程序”和“普通用户程序”。 
2.操作系统程序执行就是在“内核态”下执行的。 
3.普通用户程序就是在“用户态”下执行的。 
4.内核态可以使用所有的硬件资源,用户态不能直接使用系统资源,也不能改变CPU的工作状态,只能访问用户程序自己的存储空间!! 
5.为了安全和稳定性,操作系统程序是不能随便访问的!!! 
6.引起“用户态切换到内核态”的本质就是“CPU实行了一次中断相应”!!

原文地址:https://www.cnblogs.com/chairlin/p/10759681.html

时间: 2024-10-07 15:42:41

用户态和内核态的理解和区别的相关文章

linux用户态和内核态切换理解

1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 void testfork(){ if(0 = = fork()){ printf("create new process success!/n"); } printf("testfork ok/n"); } 这段代码很简单,从功能的

(转)linux用户态和内核态理解

原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cnblogs.com/bakari/p/5520860.html 1.特权级 Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提供了一套特权级使用的相关机制,软件自然要好好利用,这属于操作系统要做的事情,对于

[原]openstack-networking-neutron(三)---用户态和内核态的区别

究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){   2.     if(0 = = fork()){   3.     printf(“create new process success!\n”);   4.     }   5.     printf(“testfork ok\n”)

用户态和内核态

通常我们写程序时的关注重点都放在了实现功能,但如果将代码转换成CPU执行的指令时,那么我们所写的代码就是一个动态执行的CPU指令序列.而硬件设备对指令的执行有严格的控制,例如如下代码: void testfork(){ if(0 = = fork()){ printf(“create new process success!\n”); } printf(“testfork ok\n”); } 静态观察 从功能的角度来看: 就是实际执行了一个fork(),生成一个新的进程: 从逻辑的角度看:就是判

多线程之:用户态和内核态的区别

一:大话版用户态和内核态 (1)用户态和内核态的概念? --->内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序--->用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取 (2)为什么需要用户态和内核态? --->由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用

Linux用户态和内核态

究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 ```1. void testfork() { 2. if(0 = = fork()) { 3. printf("create new process success!\n"); 4. } 5. printf("testfork ok\n"); 6. } 这

用户态与内核态详解

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态).此时处理器处于特权级最高的(0级)内核代码中执行.当进程处于内核态时,执行的内核代码会使用当前进程的内核栈.每个进程都有自己的内核栈.当进程在执行用户自己的代码时,则称其处于用户运行态(用户态).即此时处理器在特权级最低的(3级)用户代码中运行.当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态.因为中断处理程序将使用当前进程的内核栈.这与处于内核态的进程的状

linux系统用户态和内核态及其通信

究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){ 2.     if(0 = = fork()){ 3.     printf("create new process success!\n"); 4.     } 5.     printf("testfork ok\n

【转载】 Linux用户态和内核态

[说明]转载自 http://my.oschina.net/liubin/blog/27795 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例子 C代码 1.     void testfork(){ 2.     if(0 = = fork()){ 3.     printf(“create new process success!\n”);