`
buliedian
  • 浏览: 1191116 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

什么叫程序运行?

什么是线程状态?

  • 当提及一个例程的上下文时,我们是指它的线程和进程的执行环境。在NT中,这个环境由当前的线程环境块(TEB)和进程环境块(PEB)建立。上下文因此包括虚拟内存的设置(告诉我们那个物理内存页面对应那个虚拟内存地址),句柄转换(因为句柄是基于进程的),分派器信息,堆栈,以及通用和浮点寄存器的设置。
  • Each thread maintains an independent program counter and hardware context that includes a private set of CPU registers.

线程上下文(Thread Context)

(摘自:http://www.win32asm.com.cn/view.asp?file=320

在大多数情况下,我们的系统中只安装了一个CPU,所以,对于所有这些运行中的程序来说,操作系统对每个进程中的线程所使用的CPU时间进行调度,循环为每个线程分配时间片,这就造成了多个程序同时执行的假象。如果Windows检测到一个新线程要开始运行了,它将进行一次上下文切换(context switch)(注:”上下文“ 实际上就是线程运行的环境,也就是运行时各寄存器和其他东东的状态,更自然的理解就是"线程状态")。所谓上下文切换就是保存线程运行时的机器状态,然后将另一个线程的状态恢复并重新开始执行。如果重新开始执行的线程属于另一个进程,那么该进程的地址空间也将被同时切换过来(通过在CR3寄存器中装入页表)。

AMD and Intel x86 CPU Architecture - System Registers

每个用户进程都有私有的地址空间,所以他们的页表都是不同的,CPU通过切换页表来将虚拟地址映射到物理地址,设备驱动程序并不需要直接做这些工作。上下文切换比较耗CPU时间,所以驱动程序一般不创建它们自己的线程,它们一般在下列环境中的一个中运行:

  • 1. 在发起I/O请求的用户线程中运行
  • 2. 在内核模式下的系统线程中运行
  • 3. 作为中断运行(并不处于哪个特定的进程或线程中,因为它们都被暂时挂起了)

在处理I/O请求包(IRPs)时,我们总是运行在和用户模式的调用者相同的进程上下文中运行,这样我们就能对用户程序的地址空间进行寻址。但是当驱动程序被加载或者卸载的时候,我们将在系统进程中运行,这时存取的只能是系统的地址空间。

内核代码是怎么被执行的?

(翻译自《Windows 2000 Device Driver Book a Guide for Programmers》BY Art Baker / Jerry Lozano

The kernel-mode parts of Windows 2000 (including a device driver) consist of massive(厚重的, 大块的) amounts of code. But just what causes this code to execute? All code executes within a hardware and software context. A context, as used here, describes the state of the system while a CPU instruction executes. It includes the state of all CPU registers (including the stack), the processor mode (user or kernel), and significantly, the state of the hardware page tables. This last item describes what memory can be seen by executing code, and where within the address space that memory is located.

Windows 2000的内核(在CPU核态运行的、包括驱动程序代码)由成千上万行代码组成,有没有想过到底是由谁来主导这些代码运行的呢?代码都是在一定的软件和硬件的上下文中执行的。这里的上下文指的是当CPU执行一条指时系统的状态,包括所有CPU寄存的状态(包当前的堆栈)、CPU的操作模式(用户或核心的)和硬件页表(hardware page tables?)的状态。硬件页表包含两项内容,一个是指出被执行代码可见的内存范围,一个是这些内存所在的地址空间。

Clearly, code must make assumptions about the context in which it executes. Windows 2000 defines three execution contexts for kernel-mode execution. In other words, kernel-mode driver code executes in one of three contexts.

一般的用户进程不会有很明显的对上下文的意识,因为用户进程运行的角色单一,只有一个默认的上下文。而操作系统则不同,它有三种角色,为用户进程服务,为硬件请求服务,为自己服务。所以,操作系统的内核代码运行在三种上下文之间。

Trap or Exception Context

Chapter 1 described how user-mode code can request an OS service by trapping into kernel mode. When a kernel-mode routine executes, it may be because a user-mode application or service caused a hardware or software exception, or trap, to occur. In this case, the context of the kernel-mode code is largely that of the user code that caused the exception. The memory seen by kernel-mode code includes the same view as seen by the requesting user-mode thread.

第一章讲了用户模式代码是如何通过陷入内核模式来使用系统服务的。当用户模式代码引发一个软件中断或其它方式调用系统服务时,内核代码被执行。这时,内核代码的上下文是用户模式代码的上下文。例如,当用户线程向I/O管理器请求服务时,I/O管理器就是运行在用户线程的上下文。而I/O管理器一般这把这个请求转交给设备驱动,所以设备驱动程序运行在用户线程的上下文。

When a user-mode thread makes a direct request of the I/O Manager, the I/O Manager executes within the context of the requester. In turn, the I/O Manager may call a dispatch routine within a device driver. Dispatch routines of a driver therefore execute within this exception context.

Interrupt Context

When the hardware (or software) generates an acknowledged(承认; 告知收到; 对...打招呼; 答谢 ) interrupt, whatever code is executing within the system is stopped dead in its tracks. The executing context is saved and control is promptly(敏捷地; 迅速地 ) handed over to a service routine appropriate for the kind of interrupt that occurred.

当硬件(或软件)产生的中断请求得到响应时,CPU进入中断处理的上下文。中断处理的上下文与被打断的代码上下文一般是不相干的。中断请求的服务代码不对页表作任何假设(KEMIN:因为不会用到?)。用户模式的缓冲存储器(buffers)在中断处理的上下文必须是不可用的。运行在中断处理的上下文的代码(包括硬件驱动代码)也不对当前进程作任何假设。

Clearly, the context of the executing code at the time of the interrupt is irrelevant and arbitrary. Kernel-mode code servicing the interrupt cannot make any assumptions about the state of the page tables. User-mode buffers must be considered unavailable in this context. Code running in interrupt context (which includes the bulk of driver routines) can make no assumptions about the current process or thread.

Kernel-Mode Thread Context

The final possibility is that a piece of code runs in the context of a separate kernel thread. Some drivers spawn separate threads to deal with devices that require polling or to deal with specialized timeout conditions. These kernel-mode threads are not significantly different from user-mode threads described in Win32 programming books. They execute when scheduled by the kernel's scheduler, in accordance with the assigned thread priority.

最后一种是内核线程独立拥有的上下文。有一些驱动程序需要一些独立的辅助线程来处理那些需要轮询访问或处理超时的设备。作为一种线程,内核线程其实与用户线程区别并不大,它们也像用户线程一样被内核调度器进行调度运行。

Like the interrupt context, kernel-mode thread context can make no assumption about the current process or thread. The state of the page tables is largely arbitrary as seen by the thread. Chapter 14 discusses the use of kernel-mode threads.

不过内核线程执行的上下文与中断处理的上下文类似,不对当前进程作任何假设。(KEMIN:总的来说,内核线程是有点怪,这样理解吧,如果用户线程和中断服务分别完成不同性质的任务的话,内核线程介它们之间完成另一任务,嗯,任务任务,很好!)

参考

分享到:
评论

相关推荐

    有了程序,如何跑程序?

    菜鸟们对计算机的世界可以说是什么都不知道的,比如交毕业设计了,明明要到了程序源码,却不知道怎样运行演示出来,这个文档看了就会明白了

    模块化程序设计.pptx

    什么叫模块化程序设计? 为什么需要模块化程序设计? 2/37 模块化程序设计全文共36页,当前为第3页。 一 模块化程序设计的概念 编程更容易把握 : 大程序分解成小的功能部件 代码重用:避免重复相同/相似程序代码:...

    嵌入式应用程序开发中的脱机运行问题

    本文介绍了嵌入式应用程序开发中的脱机运行问题

    QQ怎么运行起来的?CPU、内存、硬盘和主板的关系

    所以,不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据复制到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)。 CPU...

    “叫爸爸”可直接运行的文件.vbs

    “叫爸爸”可直接运行的文件

    windows在内存启动exe程序

    无需windows的PE加载器,可将exe数据读入内存,直接在内存中启动。可启动任意后缀的exe程序。

    用C#写的蜘蛛程序也叫小偷程序

    蜘蛛程序之所以是半自动的,是因为它总是需要一个初始链接(出发点),但此后的运行情况就要由它自己决定了,蜘蛛程序会扫描起始页面包含的链接,然后访问这些链接指向的页面,再分析和追踪那些页面包含的链接。...

    程序大战 磁核大战 CoreWars

    程序大战也叫磁核大战,英文名为"CoreWars",是一个很古老的游戏,当年 比尔.盖茨上学时就有这个东东了,不过国内玩的人很少。 目前一些免费 Unix如FreeBSD等的ports里就有他。 这个游戏可以从名字也能看出来就是程序...

    强化版 Win 运行命令程序 Run-Command 4.64 + x64.zip

    在 Windows 系统中有个“运行”功能,可以让我们用输入指令或名称的方式开启各种设置 Windows 或运行系统内建的指令,就是按“Windows”+“R”快捷键叫出来的那个“运行”Windows。很多计算机高手都喜欢用这种方式...

    生成exe可运行文件

    生成exe可运行文件。叫你如何学会把MyEclipse JAVA文件生成exe可运行文件。会有帮助的哦

    《JD-GUI》是一款反编译软件,JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,

    《JD-GUI》是一款反编译软件,JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,JD-Eclipse则是以一个Eclipse插件的方式运行。 基础知识 什么是反编译器 大家都知道,将源代码转换成二进制...

    应用程序守护程序

    监测需要保护的程序,保证程序在运行状态,如果程序退出,则会自动启动程序。有源代码。

    是谁在叫c++运行程序.exe

    定义猫科动物Felid类,由其派生出猫类(Cat)和豹类(Leopard)。 Felid包含构造函数、析构函数和纯虚函数sound Cat包含构造函数、析构函数和虚函数sound Leopard包含构造函数、析构函数和虚函数sound ...

    语言程序设计课后习题答案

    由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。...

    毕业设计-基于微信小程序的小程序论坛(包括源码,数据库,教程).zip

    小程序毕业设计,小程序课程设计,含有代码...如果部署有疑问的话,可以叫 wei 呀: xiaoxu_9411 咨询, 备注:咨询-昵称 运行教学: 链接:https://pan.baidu.com/s/1Z_vsyvzv5ogN81StnPRUZw?pwd=nndo 提取码:nndo

    布谷鸟算法(CS)的MATLAB程序,含中文注释,适合初学者,可直接运行

    布谷鸟算法(Cuckoo Search,缩写 CS),也叫杜鹃搜索,是由剑桥大学杨新社(音译自:Xin-...文件为MATLAB程序(主体程序和莱维飞行程序),有中文注释,可直接运行,适合初学者。可改变目标函数使用,也可对其进行改进

    毕业设计-基于微信小程序的微信商城小程序(包括源码,数据库,教程).zip

    小程序毕业设计,小程序课程设计,含有代码...如果部署有疑问的话,可以叫 wei 呀: xiaoxu_9411 咨询, 备注:咨询-昵称 运行教学: 链接:https://pan.baidu.com/s/1Z_vsyvzv5ogN81StnPRUZw?pwd=nndo 提取码:nndo

    gdb 调试 GCC 程序

    它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行. 它使你能一行行的执行你的代码.

    PHP应用程序安全编程

    书名叫《PHP应用程序安全编程》,本书涵盖内容包括:Web应用程序安全的基础知识;从开始阶段设计安全的应用程序——去除已有应用程序的安全漏洞;缓冲区溢出、文件系统访问、身份验证、加密等;防御PHP自身无法防御...

    基于微信小程序个人健康信息管理小程序(包括数据库,源码,教程).zip

    微信小程序项目实战,微信小程序课程设计,基于微信小程序开发的,含有代码注释,新手也可看懂。 包含:项目源码、数据库脚本、部署说明等,该项目可以作为课程设计使用,前后端代码都在里面。 该系统功能完善、...

Global site tag (gtag.js) - Google Analytics