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. 基于texlive定制chemfig化学式转换Python服务镜像

    chemfig 据别人介绍,在绘制平面分子式,乃至化学反应式.机理图时,大家使用的基本都是ChemDraw.当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都能毫不费力地绘制出来 ...

  2. NetCore3.1及Vue开发通用RBAC前后端通用框架

    目录 框架说明 项目框架图 多租户权限设计表 效果图 后端拉取运行 前端项目请参考 前端系列 发布到docker中 netcore3.1 发布到docker中所遇到的坑及解决 框架说明 该框架是本人学 ...

  3. MySQL中几种常见的日志

    前言: 在 MySQL 系统中,有着诸多不同类型的日志.各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据.这些不同类型的日志有助于我们更清晰的了解数据库,在日 ...

  4. 【BUAA软工】Visual Lab Online——功能规格说明书

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:明确和撰写软件的功能规格说明书 功能规格说明书 当前版本:v1.0 修订历史: 版本号 修订时间 修订说明 v1.0 2020/04/0 ...

  5. CF1487 Cat Cycle

    一个规律题目要多做多积累 , 脑子不太灵活 CF1487 Cat Cycle 题目大意: 两只猫A,B, A猫从n -> n-1 -> n-2 ... -> 1 -> 2 .. ...

  6. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

  7. Sentinel导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  8. Linux_网络进阶管理

    一.链路聚合 1.什么是链路聚合? 网卡的链路聚合就是将多块网卡连接起来,当-块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度. 2.链路聚合方式: ...

  9. MyBatis 各种参数传递方式

    MyBatis参数传递方式 情况一:Mapper映射器接口方法参数只有一个且为基本类型 接口方法: public List<UserEntity> selectUserByAge(int ...

  10. WIFF SD卡

    https://detail.tmall.com/item.htm?spm=a230r.1.14.1.2d4d6923Fq3Hgx&id=36945441834&cm_id=14010 ...