精华内容
下载资源
问答
  • 进程上下文

    千次阅读 2018-04-04 09:27:44
    1.进程上下文一般在进程切换中提到,进程控制块PCB,保存着进程的诸多详细信息,当进程要切换时当前进程的寄存器内容以及内存页表的详细信息等等内容,也就是关于描述进程的信息。2.补充(LINUX完全注释中的一段话)...

    1.

    进程上下文一般在进程切换中提到进程控制块PCB,保存着进程的诸多详细信息,当进程要切换时当前进程的寄存器内容以及内存页表的详细信息等等内容,也就是关于描述进程的信息。

    2.

    补充(LINUX完全注释中的一段话):
    当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。

    3.

    当一个进程运行时 ,产生了一个中断,CPU转而执行中断处理程序 ,虽然CPU当时保存了被中断进程的上下文, 但这和中断处理丝毫没有关系 , 也就是说,中断处理程序没有进程上下文,但是你却可以得到current的值!

    4.

    进程上下文就是表示进程信息的一系列东西,包括各种变量、寄存器以及进程的运行的环境。这样,当进程被切换后,下次再切换回来继续执行,能够知道原来的状态。
    同理,中断上下文就是中断发生时,原来的进程执行被打断,那么就要把原来的那些变量保存下来,以便中断完成后再恢复。

    6.

    进程上下文 & 中断上下文

    Posted by: Water in tech

    处理器总处于以下状态中的一种:
    1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
    2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
    3、用户态,运行于用户空间。
    进程上下文:

    在Linux中,用户程序装入系统形成一个进程的实质是系统为用户程序提供一个完整的运行环境。进程的运行环境是由它的程序代码和程序运行所需要的数据结构以及硬件环境组成的。进程的运行环境主要包括:
    1.进程空间中的代码和数据、各种数据结构、进程堆栈和共享内存区等。
    2.环境变量:提供进程运行所需的环境信息。
    3.系统数据:进程空间中的对进程进行管理和控制所需的信息,包括进程任务结构体以及内核堆栈等。
    4.进程访问设备或者文件时的权限。
    5.各种硬件寄存器。
    6.地址转换信息。
    从以上组成情况可以看到,进程的运行环境是动态变化的,尤其是硬件寄存器的值以及进程控制信息是随着进程的运行而不断变化的。在Linux中把系统提供给进程的的处于动态变化的运行环境总和称为进程上下文。

    系统中的每一个进程都有自己的上下文。一个正在使用处理器运行的进程称为当前进程(current)。当前进程因时间片用完或者因等待某个事件而阻塞时,进程调度需要把处理器的使用权从当前进程交给另一个进程,这个过程叫做进程切换。此时,被调用进程成为当前进程。在进程切换时系统要把当前进程的上下文保存在指定的内存区域(该进程的任务状态段TSS中),然后把下一个使用处理器运行的进程的上下文设置成当前进程的上下文。当一个进程经过调度再次使用CPU运行时,系统要恢复该进程保存的上下文。所以,进程的切换也就是上下文切换。

    在系统内核为用户进程服务时,通常是进程通过系统调用执行内核代码,这时进程的执行状态由用户态转换为内核态。但是,此时内核的运行是为用户进程服务,也可以说内核在代替当前进程执行某种服务功能。在这种情况下,内核的运行仍是进程运行的一部分,所以说这时内核是运行在进程上下文中。内核运行在进程上下文中时可以访问和修改进程的系统数据。此外,若内核运行在进程上下文中需要等待资源和设备时,系统可以阻塞当前进程
    中断上下文:

    硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。中断时,内核不代表任何进程运行,它一般只访问系统空间,而不会访问进程空间,内核在中断上下文中执行时一般不会阻塞。

    展开全文
  • 进程上下文 中断上下文 原本是想明白进程上下文和中断上下文的含义,总结了一部分内容,发现一篇总结的很好,http://www.cnblogs.com/Anker/p/3269106.html。  涉及的内容有:  - 用户空间和内核空间的区别  ...

    进程上下文 中断上下文

      原本是想明白进程上下文和中断上下文的含义,总结了一部分内容,发现一篇总结的很好,http://www.cnblogs.com/Anker/p/3269106.html
      涉及的内容有:
      - 用户空间和内核空间的区别
      - 内核态和用户态
      - 进程上下文和中断上下文
      - 一些有意思的事情

    1. 用户空间和内核空间

    我们知道现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。空间分配如下图所示:
    picture1
    有了用户空间和内核空间,整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件–>内核空间–>用户空间。如下图所示:
    picture2
    需要注意的细节问题:
    (1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。

    (2) Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。
    参考资料:
    http://blog.csdn.net/f22jay/article/details/7925531
    http://blog.csdn.net/zhangskd/article/details/6956638
    http://blog.chinaunix.net/uid-26838492-id-3162146.html

    2. 内核态和用户态

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

    3. 进程上下文和中断上下文

      《linux内核设计与实现》这本书的第三章进程管理P25,有进程上下文的介绍。先说什么是进程?程序本身并不是进程,进程是处于执行期的程序以及相关资源的总称。可执行的程序代码是进程的重要组成部分。这些代码从一个可执行文件载入到进程的地址空间执行。一般程序都在用户空间执行。当一个程序执行了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中,内核退出后,程序回复在用户空间继续执行。
      系统调用和异常处理程序是对内核明确定义的接口。进程只有通过这些接口才能陷入内核执行——对内核的所有访问都必须通过这些接口。
      首先明白为什么会有上下文?
      这个要从内核空间和用户空间说起。内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。
    正是有了不同运行状态的划分,才有了上下文的概念。
    上下文,简单来说,就是“环境”。
    其实就我理解而言,这些解释并没有完全自圆其说

    3.1 进程上下文

      用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递 很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存 器值、变量等,内核退出后,还需要返回用户程序继续执行。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

      相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

    (1)用户级上下文: 正文、数据、用户堆栈以及共享存储区;
    (2)寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
    (3)系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

      当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。我理解的模式切换指的是用户态和内核态的切换

    3.2 中断上下文

      硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的 一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。中断时,内核不代表任何进程运行,它一般只访问系统空间,而不会访问进程空间,内核在中断上下文中执行时一般不会阻塞。
      别人的写的最后都喜欢加这么一段,我也不能摆脱庸俗:
    LINUX完全注释中的一段话:
    当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称 为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的 所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结 构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程 的执行。
    前半部分都还能理解,但发生中断时,内核就在北中断进程的上下文中,偶不是很理解?
    参考资料:
    http://www.cnblogs.com/hustcat/articles/1505618.html
    http://mprc.pku.edu.cn/~zhengyansong/blog/?p=199
    http://blog.chinaunix.net/uid-26980210-id-3235544.html

    4. 有意思的事情

      Linux内核工作在进程上下文或者中断上下文。提供系统调用服务的内核代码代表发起系统调用的应用程序运行在进程上下文;另一方面,中断处理程序,异步运行在中断上下文。中断上下文和特定进程无关。
      程序是一个可执行的文件,而进程是一个执行中的程序实例。进程由可执行的指令代码、数据和堆栈区组成。进程中的代码和数据部分分别对应一个执行文件中的代码段和数据段。
      Linux进程是抢占式的,进程的抢占发生在进程处于用户态执行阶段,在内核态执行时时不能被抢占的。
      Linux系统中,一个进程可以在内核态或用户态下执行,内核堆栈和用户堆栈是分开的。
      下一篇,再写一下内核堆栈和用户堆栈。

    展开全文
  • 文章目录基本概念上下文原子为什么会有上下文这种概念进程上下文中断上下文进程上下文 VS 中断上下文原子上下文 基本概念 上下文   上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行...

    基本概念

    上下文

      上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行时的环境;具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。

    原子

      原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" ;

    为什么会有上下文这种概念

      内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间。它们代表不同的级别,而对系统资源具有不同的访问权限。内核模块运行在最高级别(内核态),这个级下所有的操作都受系统信任,而应用程序运行在较低级别(用户态)。在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。

      其中处理器总处于以下状态中的一种:
      内核态,运行于进程上下文,内核代表进程运行于内核空间;
      内核态,运行于中断上下文,内核代表硬件运行于内核空间;
      用户态,运行于用户空间。

      系统的两种不同运行状态,才有了上下文的概念。用户空间的应用程序,如果想请求系统服务,比如操作某个物理设备,映射设备的地址到用户空间,必须通过系统调用来实现。(系统调用是操作系统提供给用户空间的接口函数)。

      通过系统调用,用户空间的应用程序就会进入内核空间,由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的 地址映射,通用或专用的寄存器组,而用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户 空间继续执行

    进程上下文

      所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行

      一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文
      用户级上下文: 正文、数据、用户堆栈以及共享存储区;
      寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);
      系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

      当发生进程调度时,进行进程切换就是上下文切换(context switch)。操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。

      进程上下文主要是异常处理程序和内核线程内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。

    中断上下文

      硬件通过触发信号,向CPU发送中断信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核, 内核通过这些参数进行中断处理

      所以,“中断上下文”就可以理解为硬件传递过来的这些参数和内核需要保存的一些环境,主要是被中断的进程的环境

      内核进入中断上下文是因为中断信号而导致的 中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。

      事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。

    进程上下文 VS 中断上下文

      内核可以处于两种上下文:进程上下文和中断上下文。

      在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。
      异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。

      中断上下文和进程上下文不可能同时发生。
      运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。因此,内核会限制中断上下文的工作,不允许其执行如下操作

      a – 进入睡眠状态或主动放弃CPU
      由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。

      b – 占用互斥体
      为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。

      c – 执行耗时的任务
      中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。

      d – 访问用户空间虚拟内存
      因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址

      e – 中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)
      因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。

      f – 中断处理例程可以被更高级别的IRQ中断
      如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。

    原子上下文

      内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供 了四个宏来判断是否处于这几种情况里:

      这四个宏所访问的count都是thread_info->preempt_count。这个变量其实是一个位掩码。最低8位表示抢占计数,通常由spin_lock/spin_unlock修改,或程序员强制修改,同时表明内核容许的最大抢占深度是256。

      8-15位是软中断计数,通常由local_bh_disable/local_bh_enable修改,同时表明内核容许的最大软中断深度是256。

      16-27位是硬中断计数,通常由enter_irq/exit_irq修改,同时表明内核容许的最大硬中断深度是4096。

      第28位是PREEMPT_ACTIVE标志。用代码表示就是:

    PREEMPT_MASK: 0x000000ff
    
    SOFTIRQ_MASK: 0x0000ff00
    
    HARDIRQ_MASK: 0x0fff0000
    

      凡是上面4个宏返回1得到地方都是原子上下文,是不容许内核访问用户空间,不容许内核睡眠的,不容许调用任何可能引起睡眠的函数。而且代表thread_info->preempt_count不是0,这就告诉内核,在这里面抢占被禁用。

      但是,对于in_atomic()来说,在启用抢占的情况下,它工作的很好,可以告诉内核目前是否持有自旋锁,是否禁用抢占等。但是,在没有启用抢占的情况 下,spin_lock根本不修改preempt_count,所以即使内核调用了spin_lock,持有了自旋锁,in_atomic()仍然会返回 0,错误的告诉内核目前在非原子上下文中。所以凡是依赖in_atomic()来判断是否在原子上下文的代码,在禁抢占的情况下都是有问题的。

      更详细的关于Linux内核的竞争与并发可以看这篇文章面试官让你你讲讲Linux内核竞争的与并发,你该如何回答?

    展开全文
  • 中断上下文、进程上下文

    千次阅读 2016-03-21 16:28:03
    介绍什么是上下文,为什么要引入上下文。内核的几种运行状态,中断上下文和进程上下文的区别,已经中断一些特有的属性。

    中断上下文、进程上下文

    在学习与操作系统相关的知识时候,我们经常遇到进程上下文、中断上下文,看似熟悉又感觉不是特别清晰。这里我们从如下几个方面进行描述。

    1.上下文

    1.1上下文一词的来源

    上下文是从英文中context翻译过来的,指的是一种环境。

    1.2上下文的理解

    上下文我们看起来不怎么熟悉,但是我们可以看context的中文翻译,或者我们能更加的情形些。Context :n 语境;上下文;背景;环境。如过我们对上下文这个词确实不习惯,可以把它理解成环境来讲。

    1.3上下文在工程上面理解

    在软件工程中,上下文是一种属性的有序序列,它们为驻留在环境内的对象定义环境。在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步、事务、实时激活、安全性等等。又比如计算机技术中,相对于进程而言,上下文就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。

    2.进程上下文

    2.1 进程上下文的定义

    所谓的“进程上下文”,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

            简单来讲,当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文

    2.2进程上下文的组成

    一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

    用户级上下文: 正文、数据、用户堆栈以及共享存储区;

    寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);

    系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

    3.中断上下文

    3.1中断上下文的定义

    中断上下文,可以看作就是硬件传递过来的相关参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。

        在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中断服务结束时能恢复被中断进程的执行。

    4.引入上下文的原因

    4.1处理器的几种状态

             处理器是处于以下三种情况中的一种:

    1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

    2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

    3、用户态,运行于用户空间。

    4.2为什么区分内核空间和用户空间

    内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别中将禁止某些操作。

    Linux系统设计时利用了这种硬件特性,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。


    Linux系统只能通过系统调用硬件中断完成从用户空间到内核空间的控制转移。

    4.3引用上下文的原因

    正是因为内核有了不同运行状态的划分,才用了上下文的概念。


    通过系统调用,用户空间的应用程序就会进入内核空间,由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射,通用或专用的寄存器组,而用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行,所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。

    硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理,中断上下文就可以理解为硬件传递过来的这些参数和内核需要保存的一些环境,主要是被中断的进程的环境。

    引用LINUX内核完全注释中的一段话:

    当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。

    5.两个上下文的区别

    中断上下文:当内核执行一个中断处理程序时,内核处于中断上下文中。中断上下文和进程无关。因为没有后备进程,所以中断上下文不可以睡眠,不能在里面进行有可能使它睡眠的操作。中断上下文会一直运行至结束,不会被抢占。

    进程上下文:进程上下文是一种内核所处的操作模式,此时内核代表进程执行-------例如,执行系统调用或运行内核线程。在线程上下文,可以通过current宏关联当前进程。因为进程是以进程上下文的形式连接到内核中断,因此,进程上下文可以睡眠,也可以调度程序。运行于进程上下文的内核代码是可抢占的


    进程上下文主要是异常处理程序和内核线程内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。

     

    内核进入中断上下文是因为中断信号而导致的中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。

    内核可以处于两种上下文:进程上下文和中断上下文。在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。中断上下文和进程上下文不可能同时发生

     

    6.中断上下文的注意点

    内核会限制中断上下文的工作,不允许其执行如下操作:

    (1) 进入睡眠状态或主动放弃CPU;

    由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。

    (2) 占用互斥体;

    为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。

    (3) 执行耗时的任务;

    中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。

    (4) 访问用户空间虚拟内存;

    因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址

    (5) 中断处理例程不应该设置成reentrant(可被并行或递归调用的例程);

    因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。

    (6)中断处理例程可以被更高级别的IRQ中断。

    如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。


    参考文献:

    《Linux内核设计与实现》

    《Linux内核完全注解》

     

     

     

    展开全文
  • 谈论进程上下文 、中断上下文 、 原子上下文之前,有必要讨论下两个概念: a -- 上下文  上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行时的环境;  具体来说就是各个变量和数据,...
  • 对于linux中进程上下文和中断上下文的理解
  • 文章目录1 进程上下文与中断上下文2 进程上下文切换2.1 概念2.2 步骤3 处理器模式切换3.1 概念3.2 步骤4系统任务与用户进程 1 进程上下文与中断上下文 进程上下文 所谓的“进程上下文”,就是一个进程在执行...
  • Linux进程上下文

    2018-04-09 10:39:02
    进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总...
  • 进程上下文与中断上下文的理解

    千次阅读 多人点赞 2015-11-06 17:03:17
    进程上下文:(1)进程上文:其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值,进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。...
  • Linux内核之进程上下文和中断上下文

    千次阅读 2017-04-03 15:23:16
    进程在执行的过程中始终会处于用户态和内核态中的一种,而内核态又分为运行于进程上下文(内核代表进程运行于内核空间)和中断上下文(内核代表硬件运行于内核空间)。 进程上下文 所谓的进程上下文就是进程在执行的...
  • 进程上下文切换与线程上下文切换

    千次阅读 2020-04-06 22:45:33
    进程上下文切换 进程上下文包含了进程执行所需要的所有信息。 用户地址空间:包括程序代码,数据,用户堆栈等; 控制信息:进程描述符,内核栈等; 硬件上下文:进程恢复前,必须装入寄存器的数据统称为硬件上下文...
  • 上下文指的就是 在调度的切换过程就叫 上下文。...进程上下文 就是指用户进程之间的切换 过程中保存的一些 当前进程的运行参数。 下面有个问题:   1. 问什么中断上下文中不能有sleep  首先中断实在内核态下的...
  • 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总...
  • ( 对Linux内核中进程上下文和中断上下文的理解
  • 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总...
  • 本文主要集中介绍 进程、线程、软硬中断、以及进程上下文、中断上下文等信息 一 :Tasklet机制: 1.1定义 : Tasklet 是 Linux中断处理机制中的 软中断延迟机制,在Linux中存在着硬中断和软中断之别在Linux 接收到 ...
  • IO空间 内存管理 平台设备 中断上下文与进程上下文
  • 进程上下文包括什么

    2021-03-29 22:43:31
    进程上下文包括三个,用户及上下文,寄存器上下文和系统级上下文 用户级上下文:指令,数据,共享内存、用户栈 寄存器上下文:程序计数器,通用寄存器,控制寄存器,状态字寄存器,栈指针(用来指向用户栈或者内存栈...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 229,337
精华内容 91,734
关键字:

进程上下文