win32程序运行原理1

多任务实现

1.80386对多任务操作系统的支持性主要体现在两个方面:硬件上为任务之间的切换提供条件(堆栈对现场保护的支持);二:实现了多任务隔离。每个任务有独立的地址空间。

进程和线程的解释:

进程是正在运行的程序实例。线程是程序内代码执行单元。

对虚拟内存:

cpu是64位的,但是在32位系统的支持下,处理器寻址空间是2^32,4GB的空间。但是平常电脑的ram空间并不是4GB,所以CPU在保护模式下支持虚拟存储,也就是虚拟内存。windows将4GB的前半部分留给进程作为私有存储,后半部分做为存储操作系统的内部数据使用。对各个进程来说,进程的地址空间被划分为用户空间和系统空间两部分。用户空间部分为进程私有,对其它进程不可见。系统空间不封放的是操作系统的代码,内核,设备驱动代码。设备I/O缓冲区等。系统空间系统空间内的数据是所有进程共享的。

image

书上的图

内核模式和用户模式

windows使用这两种模式其实是对访问权限的控制。CPU定义了0~3特权级别。0级是最高级的,3级是最低的。内核模式对应的是0级。用户模式对应3级。当用户程序调用系统函数的时候,程序会从用户模式切换到内核模式去执行。

内核对象

书上对内核对象的解释是:内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。(开始看的时候就认为是系统API)因为看了下面一句话:一个内核对象是一块内核分配的内存,它只能被运行在内核模式下的代码访问。内核对象记录的数据在整个系统中只有一份,所以它们也称为系统资源。(读到这里我有点蒙了,看上面两句描述,一个说是接口,一个说是一块内存,到底是神马?)看了点后面的书,现在的理解是:内核对象是系统资源的描述,例如进程控制,线程控制的描述数据,犹如c++中的对象属性,对这些资源我们只能执行特定的操作,这些操作就是系统API了。用书上例子:

//进程对象
class 进程
{
    //属性
    public:
        进程id,优先级类型,退出代码;
    //功能函数
    public:
        进程创建();
        进程控制();
};
C写的系统,没有面向对象的概念呢。所以看后面的时候,对象描述都是用结构体来做的。系统函数来对这些结构体操作,达到对内核对象的操作。这些系统函数限制在内核模式下运行。要对内核对象的数据结构做修改这能调用系统API,这样也就达到了对外隐藏的目的。要说明的是这里内核对象只含有数据并不不含有操作。对象只是一个数据结构(好吧,我是这样理解的。有错的,或者更好的理解请赐教,好让我早日得到真理)书上说了四个引入内核对象的好处,来看下吧。
1->为系统提供可识别的名字。(对象句柄)
2->在进程之间共享资源和数据。(系统的数据在进程间是共享的)
3->保护资源不会被未经许可的代码访问(要访问这些资源必须调用API,资源被保护了)
4->跟踪对象的引用情况。(这好让系统掌控一切,这才是系统有最高权限啊)
 
对象句柄
上面说了在下对内核对象的理解,在上面理解的基础上。来回忆一下c++,c++中对事物的共有属性和共同的操作抽象出了类,类名只是对这类事物的命名。(人是我们这样的生物的命名,名字是对具体某个人的命名)所以,上面有内核对象,当然要对具体的内核对象命名,不命名岂不是会乱,不知道谁是谁。为了区别具体的某个内核对象就有了对象句柄。对象句柄是整型数据类型。
原文地址:https://www.cnblogs.com/malware/p/2307882.html