Windows内部概述-1-

进程:

进程是一个程序的运行实例的控制和管理对象。一般的程序员所说进程运行,这样的说法是不对的,因为进程不能运行程序,进程只能管理该程序运行。线程才是真正的执行代码的东西。

一个进程应该具备以下的内容:

1: 对于一种可执行程序而言,进程包含了执行代码的所需要的初始代码和数据。

2: 每个进程有一个虚拟地址空间,用来给代码分配内存

3: 一个主令牌对象用来存储进程的默认安全内容,该对象被进程中的线程执行代码来使用。

4: 一个指向执行对象的专用句柄表,如事件、信号量和文件。

5: 一个进程可以有一个或多个线程来执行代码。一个普通的用户态的进程被一个线程创建(执行经典的main/WinMain 函数来创建)。一个没有线程的普通用户进程是没有用的。

一个进程由一个唯一的进程ID来标识,是唯一的。一旦一个进程被摧毁,它的进程ID可以被新的进程所获取。需要注意的是:可执行文件并不能唯一标识进程,只有进程ID可以。例如:我可以通过QQ.EXE这个可执行文件开多个QQ来使用。

每个进程有自己的内存空间,有自己的线程,自己的进程ID,是完全独立的。

总结:可执行程序和进程、线程的关系可以好比如面向对象的关系,可执行程序是类,进程是对象,线程的对象里面可以具体执行的函数。可执行程序运行必须实例化成进程,但是进程也不能运行,进程是靠进程内部的线程来具体运行代码的,每个进程和进程是完全独立开的,有唯一的进程ID可以标识。可以和面向对象来对比记忆。

虚拟内存

每个进程有自己虚拟的、线性的、单独的内存空间。这段内存空间从0开始(或者接近0,因为可执行模块和ntdll.dll是第一个被映射的,接着是更多的子系统DLL)。一旦一个可执行程序的第一个线程开始了,内存就开始被分配了,用来加载更多的DLL。

这段内存是私有的,意味着其它进程是无法访问这段内存的。这段内存的范围从0开始(虽然从技术角度来说前面的64KB地址空间是不能被任何办法来分配和使用的,这是系统自动添加的),然后一直到最大值,最大值由操作系统的位数来取决,取决办法如下(注:这里说的是用户的进程地址空间):

1 当32位的进程在32位操作系统上时:进程地址空间默认为2G。

2 当32位进程在32位操作系统上且使用了地址增长空间设置(也就是在PE头中设置了LARGEADDRESSAWARE这个标志位),该进程的地址空间可以达到3G(具体的看设置)

3 当64位进程在64位操作系统上时,地址空间可以有8TB,Windows8.1及以后有128TB.

4 当32位进程在64位OS(操作系统)上时,如果链接器设置了LARGEADDRESSAWARE地址空间有4G,否则还是2GB.(通常都是4G)

每个进程有自己的地址空间,但是这只是相对的,并不是绝对的。例如:当你要访问0x40000这个地址的数据的时候,你必须选择是在那个进程里面访问,不然这样是不行。

每个进程的内存被成为虚拟内存,这意味着,它和真实存在物理内存存在间接的联系:进程的缓冲区内容可能被直接映射到了物理内存里面,也有可能被临时存储在了文件里面(硬盘)。”虚拟“这个术语只有在针对执行来说才有效果,不需要知道虚拟内存是否在物理内存中真实存在因为如果虚拟内存中的内容有映射到物理内存里面,那么CPU可以直接通过物理内存来访问,如果没有CPU就会引起页错误异常,这会引发内存管理器的页错误处理程序将从适当的文件中获取数据再将其复制到内存里面,然后再在映射缓冲区的页面表条目中进行所需的更改,然后再给CPU发指令让它再次获取。

内存管理的单位被称为页。一个页面的大小是由CPU来决定的(当然也可以配置),在任何情况下,内存管理器必须遵守页的大小,通常在所有窗口都支持的页面大小为4KB(这也被称为小页面大小)。

除了默认支持的4KB页面大小(小页面大小),Windows还支持大页面,这个页面的大小由2MB(x86/64/ARM64)和4MB(ARM)。大页面基于使用了Page Directory Entry(PDE)来映射而不是采用页面映射表。有了大页面就会让与内存直接处理的内容更快。

页状态

状态  
空闲(free) 内存页不可用
保留(Reserve) 内存页被预定了,但还未做物理内存做映射,还是不可以
提交(Commit) 内存被分配,并且与物理内存进行了映射,进程可以使用了

系统内存

进行的地址空间只有下半部是供进行使用的,当某个线程正在执行时,从地址0到上限地址都是可以直接看到的。但是操作系统也必须在进程空占有空间:操作系统在一个进程中占有高地址的地址空间(通常是直接占有一半的高地址地址空间)。如下所示:

1 对于32位OS系统占用2GB以上的虚拟内存空间地址从0x80000000到0xFFFFFFFF,和前面的进程空间向对应互相采用2G的虚拟空间

2 在32位OS且开启了额外的进程地址空间相对应进程的1GB高地址空间

3 在64位操作系统上,Windows8之前的占有8TB的寻地址内存空间,在WIndows8之后的占用128TB以上的虚拟内存空间

系统的空间和进程并没有关系,毕竟对于进程来说都是在相同的系统上,相同的内核驱动上,且相同地系统为每个进程提供的服务驱动程序,因此系统中的任何地址空间都是相对的,并不是绝对的。因为从每个进程来看都是一样的,也可以理解为每个进程都有共享的相同系统进程地址。从用户进程切换到系统进程是违规的。

系统空间是内核本身的、硬件抽象层(HAL)和内核驱动程序的位置一旦加载后就不会变了。因此内核驱动程序是自动受保护的,不会受用户模式来访问的。所以内核驱动如果有问题就是至关重要的了。

虚拟内存总结:

对于不同位的进程和不同位的操作系统有不同的解释:但是相同的是每个进程只有操作系统位数一部分的地址空间,还有一部分的地址空间是属于系统进程的,系统进程的内容是唯一的大家都是一样的,但是不能用普通进程来访问操作系统进程。例如一个32位的进程只有2GB的进程空间,操作系统还有2GB的进程空间,每个进程的内存空间是独立的,如果要用的时候会通过映射或者从文件读取来使用,内存的单位是页,最通常的页的大小是4KB。

Windows内核开发-Windows内部概述-1-的更多相关文章

  1. Windows内核开发-Windows内部概述-2-

    Windows内部概述-2- 线程: 执行代码的实体是线程.一个线程的包含在进程里面的,线程使用进程提供的资源来运行代码. 一个线程拥有以下的内容: 1:明确的运行模式,用户态或者内核态. 2:执行的 ...

  2. Windows内核开发-2-开始内核开发-2-内核开发入门

    Windows内核开发-2-开始内核开发-2- 第一个驱动程序: 直接采用vs2019中的Empty WDM Driver 模块创建: 初始的项目文件夹中有一个Driver Files里面会有一个.i ...

  3. Windows内核开发-3-内核编程基础

    Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...

  4. Windows内核开发-6-内核机制 Kernel Mechanisms

    Windows内核开发-6-内核机制 Kernel Mechanisms 一部分Windows的内核机制对于驱动开发很有帮助,还有一部分对于内核理解和调试也很有帮助. Interrupt Reques ...

  5. Windows内核开发-9-32位和64位的区别

    Windows内核开发-9-32位和64位的区别 32位的应用程序可以完美再64位的电脑上运行,而32位的内核驱动无法再64位的电脑上运行,或者64位的驱动无法在32位的应用程序上运行.这是为什么呢. ...

  6. windows内核开发环境的简易搭建

    一.windows内核开发需要的软件 1.WDK 2.WinDbg 3.virtualKD 4.DebugView 5.Visual C++ 6.0 6.VMware Workstation 二.wi ...

  7. Windows内核开发-4-内核编程基础

    Windows内核开发-4-内核编程基础 这里会构建一个简单但是完整的驱动程序和一个客户端,部署内核执行一些平时user下无法执行的操作. 将通过以下内容进行讲解: 1 介绍 2 驱动初始化 3 Cr ...

  8. Windows内核开发-5-(2)-内核模式调试

    Windows内核开发-5-(2)-内核模式调试 普通用户模式的调试,采取的是给进程添加一个线程来挂起断点,作为一个调试器的线程在进程中使用.照这样来类推,对操作系统调试相当于添加一个进程来限制操作系 ...

  9. Windows内核开发-10-监听对象

    Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...

随机推荐

  1. Java安全之FastJson JdbcRowSetImpl 链分析

    Java安全之FastJson JdbcRowSetImpl 链分析 0x00 前言 续上文的Fastjson TemplatesImpl链分析,接着来学习JdbcRowSetImpl 利用链,Jdb ...

  2. macos python安装mysqlapi集合

    记录一下,接了一个python2 django1.x的项目,很老了导致很多扩展无法安装 os version:macos catalina python version: 2.7.18 而django ...

  3. [Java] 数据分析--统计

    二项分布 需求:5个四面体筛子,筛子三面绿色,一面红色,模拟1000000次,统计每次试验红色落地筛子个数的分布 实现:用循环实现5个筛子和1000000次试验,定义函数numRedDown模拟5个筛 ...

  4. [bug] PyCharm远程Spark集群:Java gateway process exited before sending its port number

    原因 无法连接到集群上的java 解决 方法一: 在右上角Edit Configurations中,添加一条环境变量JAVA_HOME,值为远程机器上的java安装路径 方法二: 直接在代码里写上JA ...

  5. 服务器硬件必须支持M2 或PCIE才能支持NVME

    兆芯服务器不支持NVME. 服务器硬件必须支持M2 或PCIE才能支持NVME.1 因为物理接口只有M2 SATA 和PCIE这三中但是NVME只支持M2 和PCIE这2种2所以 NVME不支持SAT ...

  6. Linux基本原则

    Bash特性 Shell shell(外壳),广义的shell可以理解为是用户的工作环境,在windows看来桌面就是一个shell,在linux看来终端就是shell 常见的shell有两种,一种是 ...

  7. 1 理解Linux系统的“平均负载”

    什么是平均负载 我们知道使用top或uptime可以用来了解系统的负载情况. uptime 2 02:34:03 up 2 days, 20:14, 1 user, load average: 0.6 ...

  8. Redis SWAPDB 命令背后做了什么

    Redis SWAPDB 命令背后做了什么 目录 Redis SWAPDB 命令背后做了什么 0x00 摘要 0x01 SWAPDB 基础 1.1 命令说明 1.2 演示 0x02 预先校验 0x03 ...

  9. 2021 docker安装宝塔面板

    拉取CentOS镜像 docker pull centos 创建 docker 容器 启动镜像,映射主机与容器内8888(宝塔面板).888(PHPMYADMIN)端口 -v 挂在目录 为了能够保存( ...

  10. Navicat注册机报错No all pattern found! file already patched

    第一步:先把注册机放入安装目录. (这一步非常关键,先不要打开桌面上安装好的快捷方式!!) 第二步:如果之前下载过,把注册表清理干净 计算机\HKEY_CURRENT_USER\SOFTWARE\Pr ...