Linux内核中进程上下文和中断上下文的理解
參考:
http://www.embedu.org/Column/Column240.htm
http://www.cnblogs.com/Anker/p/3269106.html
首先明白一个概念:中断上下文和中断处理的上下半部是天壤之别的一对概念。
用户空间与内核空间
有了用户空间和内核空间,整个linux内部结构能够分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间。
例如以下图所看到的:
须要注意的细节问题:
(1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。
无论是内核空间还是用户空间,它们都处于虚拟空间中。
(2) Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。
内核态与用户态:
(1)当一个任务(进程)运行系统调用而陷入内核代码中运行时,称进程处于内核运行态(内核态)。
此时处理器处于特权级最高的(0级)内核代码中运行。当进程处于内核态时。运行的内核代码会使用当前进程的内核栈。每一个进程都有自己的内核栈。
(2)当进程在执行用户自己的代码时,则称其处于用户执行态(用户态)。
此时处理器在特权级最低的(3级)用户代码中执行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也能够象征性地称为处于进程的内核态。由于中断处理程序将使用当前进程的内核栈。
上下文context: 上下文简单说来就是一个环境。
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递 非常多变量、參数的值给内核。内核态执行的时候也要保存用户进程的一些寄存 器值、变量等。所谓的“进程上下文”,能够看作是用户进程传递给内核的这些參数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
相对于进程而言,就是进程运行时的环境。详细来说就是各个变量和数据,包含全部的寄存器变量、进程打开的文件、内存信息等。一个进程的上下文能够分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
(1)用户级上下文: 正文、数据、用户堆栈以及共享存储区。
(2)寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
(3)系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。
当发生进程调度时。进行进程切换就是上下文切换(context
switch).操作系统必须对上面提到的所有信息进行切换,新调度的进程才干执行。
而系统调用进行的模式切换(mode switch)。模式切换与进程切换比較起来,easy非常多。并且节省时间。由于模式切换最基本的任务仅仅是切换进程寄存器上下文的切换。
硬件通过触发信号。导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的 一些变量和參数也要传递给内核,内核通过这些參数进行中断处理。所谓的“ 中断上下文”。事实上也能够看作就是硬件传递过来的这些參数和内核须要保存的一些其它环境(主要是当前被打断运行的进程环境)。中断时,内核不代表不论什么进程运行。它一般仅仅訪问系统空间,而不会訪问进程空间,内核在中断上下文中运行时一般不会堵塞。
内核空间和用户空间是操作系统理论的基础之中的一个。即内核功能模块执行在内核空间,而应用程序执行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别。不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这样的硬件特性,使用了两个级别,最高级别和最低级别,内核执行在最高级别(内核态)。这个级别能够进行全部操作,而应用程序执行在较低级别(用户态),在这个级别。处理器控制着对硬件的直接訪问以及对内存的非授权訪问。
内核态和用户态有自己的内存映射。即自己的地址空间。
正是有了不同执行状态的划分,才有了上下文的概念。
用户空间的应用程序,假设想要请求系统服务,比方操作一个物理设备,或者映射一段设备空间的地址到用户空间,就必须通过系统调用来(操作系统提供给用户空间的接口函数)实现。
例如以下图所看到的:
通过系统调用,用户空间的应用程序就会进入内核空间,由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射。通用或专用的寄存器组。而用户空间的进程要传递非常多变量、參数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续运行,所谓的进程上下文,就是一个进程在运行的时候,CPU的全部寄存器中的值、进程的状态以及堆栈中的内容,当内核须要切换到还有一个进程时。它须要保存当前进程的全部状态,即保存当前进程的进程上下文。以便再次运行该进程时,可以恢复切换时的状态。继续运行。
同理。硬件通过触发信号。导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和參数也要传递给内核,内核通过这些參数进行中断处理,中断上下文就能够理解为硬件传递过来的这些參数和内核须要保存的一些环境,主要是被中断的进程的环境。
Linux内核工作在进程上下文或者中断上下文。提供系统调用服务的内核代码代表发起系统调用的应用程序执行在进程上下文;还有一方面。中断处理程序,异步执行在中断上下文。
中断上下文和特定进程无关。
执行在进程上下文的内核代码是能够被抢占的(Linux2.6支持抢占)。
可是一个中断上下文,通常都会始终占有CPU(当然中断能够嵌套。但我们一般不这样做)。不能够被打断。
正由于如此,执行在中断上下文的代码就要受一些限制,不能做以下的事情:
1、睡眠或者放弃CPU。
这样做的后果是灾难性的,由于内核在进入中断之前会关闭进程调度,一旦睡眠或者放弃CPU,这时内核无法调度别的进程来运行。系统就会死掉
2、尝试获得信号量
假设获得不到信号量,代码就会睡眠。会产生和上面同样的情况
3、运行耗时的任务
中断处理应该尽可能快,由于内核要响应大量服务和请求。中断上下文占用CPU时间太长会严重影响系统功能。
4、訪问用户空间的虚拟地址
由于中断上下文是和特定进程无关的。它是内核代表硬件执行在内核空间,所以在终端上下文无法訪问用户空间的虚拟地址
Linux内核中进程上下文和中断上下文的理解的更多相关文章
- 对Linux内核中进程上下文和中断上下文的理解
内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间.现代的CPU都具有不同的操作模式,代表不同的 级别,不同的级别具有不同的功能,在较低的级别中将禁止某 ...
- Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】
转自:http://blog.csdn.net/laoliu_lcl/article/details/39972459 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不 ...
- linux中断--进程上下文和中断上下文
一.前言 中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断.这个处理过程中的上下文就是中断上下文. 为什么可能导致睡眠的函数都不能在中断上下文中使用呢? 首先睡眠的含义 ...
- 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业
1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...
- 对linux内核中jiffies+Hz表示一秒钟的理解
jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/linux/jiffies.h中,定义形式如下. unsigned long volat ...
- (五)对linux内核中jiffies+Hz表示一秒钟的理解
jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/Linux/jiffies.h中,定义形式如下. unsigned long volat ...
- linux内核中task_struct与thread_info及stack三者的关系
在linux内核中进程以及线程(多线程也是通过一组轻量级进程实现的)都是通过task_struct结构体来描述的,我们称它为进程描述符.而thread_info则是一个与进程描述符相关的小数据结构,它 ...
- Linux内核中的中断栈与内核栈的补充说明【转】
转自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux内核中的中断栈与内核栈的补充说明 作者:MagicBoy2010 ...
- 向linux内核中添加外部中断驱动模块
本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...
随机推荐
- Cocos2d-x 2.2.3 使用NDK配置安卓编译环境问题之 Cannot find module with tag 'CocosDenshion/android' in import path
1.当做安卓移植的时候遇到例如以下问题: Android NDK: jni/Android.mk: Cannot find module with tag 'CocosDenshion/android ...
- page template in kentico
Ad-hoc templates are used for one page only, for which they were created - this is why they are not ...
- kubernetes系列:(二)、kubernetes部署mysql(单节点)
使用kubeadm搭建好kubernetes集群后就可以动手部署自己的应用了. 本文用例来自官网,如有需要请参看 kubernetes官网 一.环境说明 kubernetes 1.13.1 docke ...
- JavaScript系列--浅析原型链与继承
一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...
- P1888 三角函数
题目描述 输入一组勾股数a,b,c(a≠b≠c),用分数格式输出其较小锐角的正弦值.(要求约分.) 输入输出格式 输入格式: 一行,包含三个数,即勾股数a,b,c(无大小顺序). 输出格式: 一行,包 ...
- Obj文件和Bin文件
本文导读:在用visual studio 编程时,会看到项目文件中含有bin和obj这两个文件夹,那么这两个文件夹具体包含一些什么东西的,具体作用是什么? 一.Bin文件夹 1.用来保存项目生成后程序 ...
- 页面加载通过javascript来修改控件属性
function changeFormElementStatus(tagNames) { var tagNameArr = tagNames.split("," ...
- Powerpivot PowerBI相关组件下载安装(附操作截图)
加载方式:com加载项加载方法: 点击Excel界面[文件]→[选项]→[加载项]→[COM加载项]→[转到] Excel2013加载PowerView Excel216PowerQuery不需要加载 ...
- LA 3635 Pie
题意:给出n个圆,分给n+1个人,求每个人最多能够得到多大面积的圆 二分每个人得到的圆的面积 #include<iostream> #include<cstdio> #incl ...
- 0-NULL-nullptr
NULL In C A null-pointer constant is an integral constant expression that evaluates to zero (like 0 ...