深入解析Windows操作系统——概念和工具

文章目录

  • Windows操作系统的版本
    • Windows NT和Windows 95
    • 基础概念和术语
    • 内核调试
    • 用户模式调试

Windows操作系统的版本

Windows NT和Windows 95

Windows NT和Windows 95之间的一些结构性差异,以及Windows NT优于Windows 95及其后续版本的一些方面:

Windows NTWindows 95
支持多处理器系统不支持多处理器系统
文件系统支持安全性,如自主访问控制文件系统不支持
完全32位(现在是64位)的操作系统继承了大量的16位代码
完全可重入的部分不可重入
可让16位Windows应用程序运行在他们自己的地址空间中总是在一个共享的地址空间中运行16位Windows应用程序,共享地址空间中程序相互影响,可能会破坏其他程序的运行
进程共享的内存只对那些映射了这一共享内存区的进程才是可见的所有共享的内存都是可见的,而且在任何一个进程内都可以写这些内存
存在关键的操作系统页面在用户模式下是可写的,从而允许一个用户程序破坏系统,或者使系统崩溃
Windows 95可以做到但Windwos NT系统无法做到的一点是:运行所有老的MS-DOS和Windows 3.1应用程序(特别是那些要求直接访问硬件的应用程序)以及16位MS-DOS设备驱动程序。Windows NT的最初目标是:能够运行大多数原有的16位应用程序,同时又不破坏系统的完整性和可靠性。

基础概念和术语

Windows API:Windows 应用程序接口(API)是针对Miscrosoft Windows操作系统家族的系统编程接口。每个操作系统实现了Windows API的不同子集。可能会发现许多函数名和接口看起来并不一致,原因之一是:要确保Windows API与老的16位Windows API保持兼容。
SDK:platform software development kit,平台软件开发工具。文档描述了Windows API。
.NET框架:是由一个被称为框架类库(FCL,Framework class library)的类库和一个提供了托管代码执行环境的公共语言运行库(CLR,Common Language Runtime)组成。后者提供的环境包含以下一些特性:即时编译、类型检查、垃圾回收和代码访问安全性等。.NET框架中的所有组件的实现形式都是用户模式的标准Windows DLL,它们建立在飞托管的Windows API之上。
Windows API函数:指Windows API中已被文档化的可调用子例程。
原生的系统服务(或者 执行体系统服务):操作系统中未文档化的、可在用户模式下调用的底层服务。
内核支持函数(或 例程):指位于Windows操作系统内部且只能在内核模式下调用的子例程。
Windows服务:由Windows服务控制管理器启动的进程
DLL(动态链接库):指一组可调用的子例程,合起来被链接成一个二进制文件,使用这些子例程的应用程序可以动态地加载此二进制文件。Windows的用户模式组件和应用程序大量使用了DLL。DLL比静态库的优势在于:应用程序可以共享DLL,Windows保证在内存中只有一份DLL代码,供所有引用该DLL的应用程序共享。
程序是指一个静态的指令序列,而进程则是一个容器,其中包含了当执行一个程序的特定实例时所用到的各种资源。一个Windows进程是由以下元素构成:
1)一个私有的虚拟地址空间,指该进程可以使用的一组虚拟内存地址
2)一个可执行程序,定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中
3)一个已打开句柄的列表,这些句柄指向各种系统资源,该进程内所有线程都可以访问这些系统资源
4)一个被称为访问令牌的安全环境,标识了与该进程关联的用户、安全组和特权
5)一个被称为进程ID的唯一标识符(在内部被称为客户ID
6)至少一个执行线程
每个进程也指向它的父进程或者创建者进程。但是如果父进程退出的话,子进程中的父进程信息并不会被更新。因此一个进程有可能指向一个已不再存在的父进程。可使用Windows调试工具箱中的tlist.exe的/t查看进程树,如下:
tlist执行结果
对于父进程不在的进程,显示的时候被调整到最左边。此外还有一个工具:process explorer进程管理器可提供关于进程、线程的详细信息。优势有:
1)显示被执行的映像文件的完整路径名
2)显示进程的安全令牌(安全组和特权的列表)
3)加亮显示进程中的服务,包含显示名和说明
4)显示作业(job)中的进程,以及作业的细节
5)显示运行.NET/WinFX应用的进程,以及与.NET相关的细节
6)显示进程和线程的启动时间
7)显示内存映射文件的完整列表
8)能够挂起/杀死一个进程
9)容易识别出一段时间以来哪些进程消耗了绝大多数CPU时间
10)进程树
11)无需特别设置就可以访问一个进程内的已打开句柄
12)列出一个进程内的DLL
13)一个进程内的线程活动
14)用户模式的线程栈
15)针对系统线程的内核模式线程栈
16)内核内存限制

线程:一个进程内部的实体,也是Windows执行此进程时的调度实体。没有线程,进程的程序不可能运行。线程包含以下一些部件:
1)一组代表处理器状态的CPU寄存器中的内容
2)2个栈:一个用于当前线程在内核模式下执行时,另一个用于线程在用户模式下执行时
3)一个被称为线程局部存储区(TLS)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域
4)一个被称为线程ID的唯一标识符(在内部也被称为客户ID——进程ID和线程ID是在同一个名字空间中生成的,所以永远不会重叠)
5)线程也有自己的安全环境
线程的环境:易失的寄存器、栈和私有存储区域。这些信息会随着Windows所在的体系结构的不同而有所不同,因此这些数据结构必须是与底层体系结构相关的。
纤程与线程:纤程使得一个应用程序可以调度它自己的“线程”的执行过程,而不必依赖于Windows内置的基于优先级的调度机制。也被称为“轻量级”的线程。因为是在用户模式下实现的,因此从调度的角度看,对于内核是不可见的。和线程不同的是:纤程不会自动被执行,必须手工调用指定的函数选中一个纤程,才能使它运行。新的纤程一直运行,直到它退出,或者直到调用指定方法关闭纤程或者选择领一个纤程运行。
共享内存区(Windwos API中称为文件映射对象)
每个进程都有一个安全环境,被存储在一个被称为访问令牌的对象中。进程的访问令牌包含了进程的安全标识和凭证。默认情况下,线程没有自己的访问令牌,但它们也可以包含一个访问令牌,因此单独的线程可以模仿另一个进程得到安全环境——包括在远程Windows系统上运行的进程——而不会影响到当前进程中的其他线程。
虚拟地址描述符(VAD):一些数据结构,内存管理器利用这些数据结构来记录一个进程所使用的虚拟地址。
作业(job):Windows在进程模型上作的一个扩展。主要功能是:使得一组进程被当做一个整体来管理和维护。允许对特定的属性进行控制,也允许对一个进程,或者所有与作业相关联的进程进行限制。也为所有与该作业相关联的进程记录下基本的审计信息。
虚拟内存:Windows实现了一个基于平面(线性)地址空间的虚拟内存系统,每个进程自己独立拥有一个很大的私有地址空间。虚拟内存提供了一个内存逻辑视图,它可能并不对应于内存的物理布局。在运行时内存管理器借助于硬件的支持,将虚拟地址翻译或者映射成真正存放数据的物理地址。操作系统通过控制这一层保护或者映射机制,可以保证一个进程不会闯入到另一个进程中,也不会改写操作系统的数据。
虚拟地址空间的大小随着硬件平台的不同而有所差异。低一半地址空间的映射关系反映了当前执行进程额虚拟地址空间,但是高一半地址空间的映射关系总是由操作系统的虚拟内存构成的。
处理器访问模式:用户模式和内核模式。为了避免用户应用程序访问/修改关键的操作系统数据,因此使用了这2种模式。内核模式:允许访问所有的系统内存和所有的CPU指令。处理器让操作系统软件比应用软件有更高的特权级,从而为操作系统设计者提供了一层保护的基础,确保一个行为不正常的应用程序不会破坏系统整体的稳定性。
对于在内核模式下运行的组件,Windows对它们的读写系统内存并不加以保护。因此在加载第三方设备驱动程序时需要加倍小心,因为一旦进入内核模式,这些软件就可以完全访问所有的操作系统数据。这也是Windows之所以要引入驱动程序签名的原因之一。
从用户模式转换为内核模式(或 从内核模式转为用户模式)本身并不会影响线程的调度,模式切换非环境切换。
终端服务:Windows为了在单个系统中支持多个可交互的用户会话而提供的能力。
对象:在Windows操作系统中,指某一个静态定义的对象类型的单个运行时的实例。对象类型包含了一个系统定义的数据类型、在该数据类型的实例上进行操作的一些函数,以及一组对象属性。对象属性是对象中的数据域,每个对象属性定义了对象的一部分状态。对象方法就是操纵对象的手段,通常是读取或改变对象的属性。
对象和和普通数据结构之间最根本的区别是:对象的内部结构是被隐藏的。这一区别将对象的底层实现与那些仅仅使用该对象的代码隔离开来。必须调用一个对象服务才可以获得对象内部的数据,或者把数据置到对象内部。不可以直接读取或改变一个对象内部的数据。
对象技术提供了一种便捷的方式实现下列4个重要的操作系统任务:
1)为系统资源提供了可供人读的名字
2)在进程之间共享资源和数据
3)保护资源,避免未授权的访问
4)引用跟踪
Windows操作系统中并不是所有数据结构都是对象。只有确实需要被共享、保护、命名或者让用户模式的程序看得到(通过系统服务)的数据才被放到对象中。

Windows的核心安全功能:针对所有可共享对象的自主保护、安全审计、登录时的口令认证、以及在一个用户释放了某一资源后,另一个用户无法通过访问未初始化资源的办法看到前一个用户留下的资源。
针对系统内部的对象,Windows有2种访问控制形式:自主访问控制、特权访问控制。自主访问控制得到做法是:由对象的所有者授权或拒绝其他人访问这些对象。特权访问控制可以确保:在无法联系到对象的所有者时,某些人也可以访问被保护的对象。
注册表:系统数据库,包含了引导和配置系统所必要的信息、系统范围的控制Windows操作的软件设置、安全数据库、以及针对每个用户的配置信息。同时注册表是个反映内存中易失数据的窗口。
Windows操作系统区别于大多数其他操作系统的特点之一是:它的大多数内部文本串是以16位宽度的Unicode字符来存储和处理的。Unicode(统一的字符编码标准)是一个国际字符集标准,为世界上绝大多数已知的字符集定义了唯一的16位值。Windows是不会转换文件内部的数据的,是由应用程序决定是否要存储为Unicode或者ANSI。

内核调试

内核调试意味着检查内核的内部数据结构,以及跟踪内核中的函数。
符号文件:包含函数和变量名称。是由连接器生成的,在调试过程中被调试器用来引用和显示这些名称。这些名称信息并不存储在二进制映像文件中,因为在执行代码时并不需要这些信息。基于此,必须确保在一个调试会话中,调试器能够访问到与正在调试的映像文件相关联的符号文件。
想获得当前调试所需符号的正确版本,最容易的办法是:利用Miscrosoft的按需符号服务器,只要在调试器中用一种特殊的语法来指定符号路径即可。如:
调试器葱internet的符号服务器上加载所需要的符号,并且在本地的c:\symbols文件下维护一份拷贝

src*c:\symbols*http://msdl.miscrosoft.com/download/symbols

用户模式调试

附载到一个进程上时用两种方式:侵入式的、非侵入式的。
侵入式:程序员可以检查或者修改该进程的内存,设置断点,执行其他的调试功能。
非侵入式:只是打开被调试的进程,并不作为一个调试器被附载到目标进程中。可以检查和修改目标进程中的内存,但不能设置断点。

可用于内核调试的Miscrosoft调试器有两种主要的形式:命令行版本(Kd.exe)和图形用户界面版本(Windbg.exe),这两个版本提供了同样的命令集。可执行以下3种类型的内核调试:
1)打开一个崩溃转储文件
2)连接到一个正在运行的系统上,并检查该系统的状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/172745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二)pytest自动化测试框架之添加测试用例步骤(@allure.step())

前言 在编写自动化测试用例的时候经常会遇到需要编写流程性测试用例的场景,一般流程性的测试用例的测试步骤比较多,我们在测试用例中添加详细的步骤会提高测试用例的可阅读性。 allure提供的装饰器allure.step()是allure测试报告框架非常有用的功能&am…

前端环境变量释义import.meta.env.xxx

视频教程 彻底搞懂前端环境变量使用和原理,超清楚_哔哩哔哩_bilibili 添加命令行参数 --modexxxxx 新建.env.xxxx文件,其中.env文件会在所有环境下生效 以VITE_开头,字符串无需加双引号 使用import.meta.env.VITE_xxxxx进行调用

WinEdt 11.1编辑器的尝鲜体验

WinEdt 11.1编辑器的尝鲜体验 2023年5月19日,WinEdt 11.1版本发布了,相比WinEdt 10.3, 最新版更加漂亮,更加友好,更加好用了! 最大的改变是WinEdt 11.1 有了自带的WinEdtPDF阅读器,所以不再需要下载第三方…

同星智能完成A+轮超亿元融资,国投招商领投

2023年10月,上海同星智能科技有限公司成功完成超亿元A轮融资。本轮融资由国投招商管理的先进制造产业投资基金二期领投,老股东丰年资本超额跟投。 本轮融资将用于产品研发和全球化市场拓展。 同星智能成立于2017年,一直专注于研发国产自主可控…

java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90 给定一个NN的矩阵matrix,把这个矩阵调整成顺时针转动90后的形式。 顺时针转动90后为: 【要求】额外空间复杂度为O(1)。 public void rotate(int[][] matrix) {int tR 0; // 左上角行坐标int tC 0;…

NUCLEO-L552ZE SWD外部接口定义

如果使用ST-LINK调试器对外部MCU编程需要将CN4上的跳线拔下。

MAC地址注册管理最佳实践:安全性、可用性和灵活性

MAC地址注册管理是在网络环境中确保设备身份验证和访问控制的重要步骤。本文将介绍MAC地址注册管理的最佳实践,旨在提高安全性、可用性和灵活性,以满足现代网络的需求。 随着网络规模和复杂性的不断增加,管理和维护设备身份变得至关重要。MAC…

MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用

MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用 官方文档教程使用已经弃用的MindVision模块,本文是对官方文档的更新 在这篇博客中,我们将探索如何使用 MindSpore 框架和 Gradio 库来创建一个基于深度学习的图像分类应用。我…

京东优惠券查询API接口接入方案,item_search_coupon - 京东优惠券查询接口演示

要接入京东优惠券查询API接口(item_search_coupon),您可以按照以下步骤进行操作: 注册并获取API密钥:首先,您需要在京东开放平台上注册并获取API密钥。这将为您提供唯一的标识符和密钥,用于访问…

博主都在用的网站,一键制作电子杂志

​随着互联网的发展,越来越多的人开始使用电子杂志来展示自己的作品或宣传自己的品牌。而制作电子杂志的工具也越来越多,其中一些工具非常受欢迎,被许多博主使用。今天,我们就来介绍一款博主都在用的网站,它可以帮助你…

【python】Python生成GIF动图,多张图片转动态图,pillow

pip install pillow 示例代码: from PIL import Image, ImageSequence# 图片文件名列表 image_files [car.png, detected_map.png, base64_image_out.png]# 打开图片 images [Image.open(filename) for filename in image_files]# 设置输出 GIF 文件名 output_g…

svn文件不显示红色感叹号

如下图所示,受svn版本控制的文件不显示下图中红色感叹号和绿色对号时, 可以试着如下操作 空白处单击右键,具体操作如下图

CF 1894A 学习笔记 思维 题意理解分析

原题 A. Secret Sport time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standard output Lets consider a game in which two players, A and B, participate. This game is characterized by two positive integer…

Spring源码-5.aop代理

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

4.2、Linux进程(1)

个人主页:Lei宝啊 愿所有美好如期而遇 目录 基本概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统调用获取进程标识符 前言 进入进程前,我建议读一读这两篇文章,他们都是进程的前导知识。 操作系统…

Joern安装与使用

环境准备 Joern需要在Linux环境中运行,所以在Windows系统中需要借助WSL或虚拟机安装。 JDK安装 Joern的运行需要JAVA环境的支持,本次采用的是JDK17,其他版本建议看一下Joern官方文档。 apt install openjdk-17-jre-headless 配置JAVA环境变…

shell脚本之条件语句

条件语句 linux测试 test 测试 测试表达式是否成立(用echo $? 检测是否正确) 语法:test [选项] [文件名] 选项作用-e测试文件是否存在-r查看文件有无读的权限-d测试是否为目录-f测试是否为文件-w测试当前用户有无写的权限-x测试是否有执…

EANet:用于医学图像分割的迭代边缘注意力网络

EANet: Iterative edge attention network for medical image segmentation EANet:用于医学图像分割的迭代边缘注意力网络背景贡献实验方法Dynamic scale-aware context module(动态规模感知上下文模块)Edge attention preservation module&a…

【Java】java | CacheManager | redisCacheManager

一、说明 1、查询增加缓存,使用Cacheable注解 2、项目中已经用到了ehcache,现在需求是两个都用 二、备份配置 1、redisConfig增加代码 Bean("redisCacheManage")Primarypublic CacheManager redisCacheManager(RedisConnectionFactory fact…

Matlab通信仿真系列——图形处理函数

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、plot函数 (1)绘制一…