内核态与用户态【转载】

 原文:http://blog.csdn.net/skywalkzf/article/details/5185442

内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,象DOS这种模式操作系统则没有这些概念,其中的所有代码都可被看作运行在核心态。
  当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级) 内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。
  在内核态下CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态时,用户从用户态切换到内核态只有在系统调用和中断两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态。
  Linux使用了Ring3级别运行用户态,Ring0作为内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过 write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。具体的转移细节由于涉及复杂的保护检查和堆栈切换,不再赘述,请参阅相关资料。现代的操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令来完成模式切换,在INTEL X86上这条指令是INT,如在WIN9X下是INT30(保护模式回调),在LINUX下是INT80,在WINNT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求并将结果传给用户程序。
 
一,中断处理过程

硬件中断:来自时钟,外设

可编程中断:programmed interrupt,执行引起软件中断的指令。

例外中断:如页面错。

都由系统负责处理。当发生一个中断时,如果CPU正在比该中断级低的处理机运行级上运行,它就在解码下条指令之前,接受该中断,并提高处理机运行级。内核处理中断的操作顺序如下:

1,对于正在进行的进程,保存其当前寄存器上下文,并创建压入一个新的上下文层。

2,确定中断源,识别中断类型。如是时钟或磁盘的。

3,查找中断向量。当系统接受一个中断时,它从机器中得到一个数,系统把这个作为查表的偏移量。这个表通常成为中断向量(interrupt vector)。中断向量的内容包括各种中断源的中断处理程序的地址,以及中断处理程序取得参数的方式。

4,内核调用中断处理程序。

5,中断处理程序执行那个返回,恢复(弹出)前一上下文层。

二,软中断

软中断通知进程发生了异步事件。

系统有个进程表,每个进程在进程表中有有个进程表项,每个进程表项有个软中断信号字段,纪录发向一个进程的所有未处理的软中断信号。

当一个进程即将从核心态返回到用户态时,或它要进入或离开一个适当的低调度优先级时,内核要检查它是否收到了一个软中断信号。

内核仅当一个进程从核心态返回到用户态时才处理软中断信号。

三,系统调用

我们在C程序中调用系统调用好像是个一般的函数调用,当实际上调用系统调用会引起用户态到核心态的状态变化,这是怎么做到的呢?

原来,C编译程序采用一个预定义的函数库(C之程序库),其中的函数具有系统调用的名字,从而解决了在用户程序中请求系统调用的问题。这些库函数一般都执行一条指令,该指令将进程的运行方式变为核心态,然后,使内核开始为系统调用执行代码。我们称这个指令为操作系统陷入(operating system trap)。

系统调用的接口是一个中断处理程序的特例。

在处理操作系统陷入时,

1,内核根据系统调用号查系统调用入口表,找到相应的内核子程序的地址。

2,内核还要确定该系统调用所要求的参数个数。

3,从用户地址空间拷贝参数到U区(Unix V)。

4,保存当前上下文,执行系统调用代码。

核心态:当CPU正在运行内核代码时(内核代码是共享的)。

用户态:当CPU正在运行用户代码时。

用户模式:不可以访问内核空间(>=0x80000000)

内核模式:可以访问任何有效虚拟地址,包括内核空间。一个线程可以访问其他任何线程地址空间。

转载于:https://www.cnblogs.com/candycloud/p/3959774.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决ListView异步加载数据之后不能点击的问题

在ListView的onScroll事件中执行异步加载数据,然后使用notifyDataSetChange()函数更新适配器,之后发现listView不能点击了,这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。 Java代码…

从WebRtc学习RTCP协议

文章目录RTCP支持的消息类型RTCP协议头WebRTC的反馈报文RTPFB支持的报文类型:PSFB支持的报文类型:参考RTCP是RTP的控制协议.那么RTCP能对RTP做哪些控制呢?其中最为大家熟知的就是 丢包控制。发送端发送数据后,接收端如果发现有RTP…

白话经典算法系列之中的一个 冒泡排序的三种实现

冒泡排序是很easy理解和实现,,以从小到大排序举例: 设数组长度为N。 1.比較相邻的前后二个数据,假设前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍…

如何用java代码让android Market显示指定的程序以便用户下载?

Uri uri Uri.parse("market://search?q名称");Intent i new Intent("Intent.ACTION_VIEW", uri);startActivity(i);//根据应用程序ID应用程序的包名Uri urii Uri.parse("market://details?idcom.xiaoqiu.test");Intent ii new Intent(&quo…

无锁队列设计思路以及简要代码

文章目录非并发的一写一读环形队列多读多写环形队列非并发的一写一读环形队列 读指针: 1、先判断是否有数据 2、读取数据 3、操作指针 写指针: 1、先判断空间是否足够 2、写入数据 3、操作指针 所以代码也十分简单: bool putqueue(void* pDa…

vs 2012,vs 2013问题系列

系统环境: 64位 win7 1,问题: 之前能连接tfs进行源码管理,期间有改过本地电脑的时间,再后来使用vs 2012连接tfs却失败了。错误码:TF31002。排除了网络问题,用户权限问题,tfs服务器问…

Linux查看系统信息的一些命令

转:http://www.cnblogs.com/chenwenbiao/archive/2011/07/18/2109983.html 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计…

CPU Cache对于并发编程的影响

文章目录引子CPU Cache对于并发的影响读写顺序对性能的影响字节对齐对Cache的影响小结引子 下面给出两个极其相似的代码&#xff0c;运行出的时间却是有很大差别&#xff1a; 代码一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

textarea 在浏览器中固定大小和禁止拖动

http://blog.sina.com.cn/s/blog_641d569301011naz.html HTML 标签 textarea 在大部分浏览器中只要指定行&#xff08;rows&#xff09;和列&#xff08;cols&#xff09;属性&#xff0c;就可以规定 textarea 的尺寸&#xff0c;大小就不会改变&#xff0c;不过更好的办法是使…

hibernate操作时报错

报错&#xff1a;[ERROR] AbstractBatcher Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1原因&#xff1a;视具体情况而定&#xff0c;我这边是代码被修改过…

bugfix:MySQL内存使用率无限增长以及kill手法

问题&#xff1a;昨天mysql 宕机了一次&#xff0c;重启&#xff0c;然后继续运行业务代码的时候发现问题&#xff0c;mysql内存占用率上升较快&#xff0c;于是搜了搜&#xff0c;遇到一个&#xff1a; http://blog.itpub.net/29510932/viewspace-2129312/ 根据思路&#xff0…

软工之初识

我们之前已经在完全不懂软件工程的情况下&#xff0c;已经做完了两个小系统&#xff0c;虽然能够运行&#xff0c;但其中有很多的问题&#xff0c;学习软工就是让我们在工程学原理的指导之下去开发和设计软件。 软件工程同大多数书讲的都是一样的&#xff0c;首先对软件工程有一…

perf +火焰图使用

以mysqld进程为例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

Mysql 遇到的编码问题。

今天帮小朋友做一个项目&#xff0c;碰到一个挺搞的问题。在帮她安装mysql的时候一直是next&#xff0c;没有去注意一些细节&#xff0c;不晓得有没有漏掉设置编码那一部分。。 结果在用sql文件导入数据库MySQL -h localhost -u root -p xxx < e:\xxx.sql 执行的时候错误提…

在一个字符串中找到第一个只出现一次的字符

题目&#xff1a;在一个字符串中找到第一个只出现一次的字符&#xff0c;如输入abaccdeff&#xff0c;则输出b&#xff1b;具体实现如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

py脚本:获取进程信息

这里以mysqld进程为例子 # pip install psutil import psutil import time import re, sys# x:进程name y:非进程name # 由于这里监控的是mysqld&#xff0c;如果不加限制的话会先识别mysqld_safe&#xff0c;所以要加上mysql_safe的判别 def processinfo(x, y):p_list psut…

sysctl -P 报错解决办法

sysctl -P 报错解决办法问题症状修改 linux 内核文件 #vi /etc/sysctl.conf后执行sysctl -P 报错error: "net.bridge.bridge-nf-call-ip6tables" is an unknown keyerror: "net.bridge.bridge-nf-call-iptables" is an unknown keyerror: "net.bridg…

-bash: belts.awk: command not found

执行awk命令时&#xff0c;没有问题。可是执行awk脚本时&#xff0c;出现这个问题&#xff1a;-bash: belts.awk: command not found。 既然之前直接执行awk命令没有问题&#xff0c;说明awk已经装了&#xff0c;本身是没有问题的。那就说明路径不对&#xff0c;执行echo $PATH…

nagios快速安装

1、安装软件包&#xff08;准备软件包&#xff09; yum install httpd gcc glibc glibc-common gd gd-devel 2、建立一个账户 创建一个名为nagios的帐号并给定登录口令 /usr/sbin/useradd nagios passwd nagios 创建一个用户组名为nagcmd用于从Web接口执行外部命令。将nagios用…

零拷贝机制在文件传输中的使用手法

文章目录文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换零拷贝技术sendfilesendfile SG-DMAmmap writespliceDirect I/O经典应用文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换 如果服务端要提供文件传输的功能&#xff0c;最简单的方式…