关于使用Windows 10和键盘示例的PC的操作,第1部分

图片

我的名字叫Andrey Artemyev,我在Windows 10的核心领域在Microsoft工作,我以前在Windows 10x(WCOS),XBox,Windows Phone和Microsoft Edge上工作。 我通常想出于教育目的,以键盘输入和Windows 10为例说明计算机的工作方式。该系列文章主要是为技术专业的学生设计的。 我们将考虑在Notepad.exe中显示有关键盘按键信息的路径。 由于该主题的广泛性和跨学科性,因此文章中可能存在错误,评论中对此进行了报道。 由于Windows的发展速度,某些信息可能已过时。

我们对这个话题有多深入?


首先让我们讨论一下可以考虑使用计算机的级别。 每个级别都基于前一个级别。 让我们从头开始。

应用级别 。 所有用户应用程序都位于此处,这是浏览器,Microsoft Office,记事本以及IIS Web服务器,SQL Server,各种中间件(如Java和.Net)以及所有脚本语言(无论是Ruby,PHP还是Bat文件)。

操作系统级别 。 操作系统可以认为是:

  • 资源管理器-内存,硬盘驱动器,打印机,屏幕,键盘,由计算机上运行的程序共享的有限资源。
  • 虚拟机-文件是虚拟对象的一个​​很好的例子。 它表示磁盘上数据的抽象,用于处理磁盘的API,还添加了访问权限的概念。 除了文件之外,可能还有数据容器和完全不同的API的概念。 操作系统中有许多这样的虚拟对象。
  • 平台-操作系统提供用于构建程序的软件模型和原语。 例如,Windows驱动程序框架允许您快速开发驱动程序,Windows中的Windows用于构建复杂的用户界面。 DLL-提供用于通过插件扩展程序功能的模型,以及用于通过键盘陷阱实现屏幕阅读器的机制(请参阅LowLevelKeyboard挂钩)。
操作系统分为层和组件。 通常,Windows 10的体系结构如下所示。 我们稍后会详细讨论。

图片

计算机体系结构级别 。 它由具有特定外形尺寸的主板,内置在称为芯片集和端口的微电路中的内置功能表示,通过连接图形卡,网卡,附加的随机存取存储器(RAM),硬盘驱动器,键盘等,您可以扩展计算机的功能。端口会影响计算机的速度和功能,这将决定计算机的用途,它是每秒处理数千个请求的服务器,用于Internet的平板电脑还是带有多个视频的游戏PC 附庸风雅 操作系统抽象了主板的功能。

这些微电路如下图所示,是一台微型计算机,可执行用于低级任务的简单程序,例如,从键盘读取数据并进一步传输数据,以便最终到达处理器。 通常,它们被实现为模拟非可编程微电路或可在C中编程的微控制器。

图片


母板可以看作是微电路的集落,它们通过总线相互通信,并通过它们从连接的设备到处理器的数据相互通信,反之亦然。 芯片组是一种计算机神经系统。 主板上的所有芯片最初都是为了相互配合而创建的。 其中一些可能具有特殊功能,例如计时器或BIOS设置存储。 其中最重要的也许是具有内置程序(固件,BIOS,UEFI)的程序,该程序在通电后立即开始运行。 她找到了带有Windows引导加载程序的硬盘并将其控制权转移给该硬盘驱动器,这又启动了OS可执行文件,该文件可以称为Windows10.exe,实际上是NtOsKrnl.exe。 通过硬件制造商和操作系统之间的协议,BIOS知道要查找的内容。

您可以在主板周围组装手机,游戏机,服务器站或智能设备。 在下面的图片中,主板的常见外形尺寸。

图片

微体系结构级别由处理器(CPU)表示,这是主板的核心,需要整个芯片组来为CPU提供服务。 处理器是计算机中的计算机,它是功能更强大,更高级的微控制器,不需要固件,因为当线程调度程序更改处理器的上下文时,命令流是实时的。 处理器的功能分为子系统,例如,涉及数学和逻辑运算的组件,数学协处理器和缓存。 其中一些曾经是主板上的单独芯片,但是现在它们已成为CPU的一部分,例如,中断控制器和称为北桥的芯片,从而提高了工作速度。

微体系结构与体系结构不同 。 CPU的所有功能都分为可协同工作的组件。 这些组件及其相互作用是微体系结构。 在下面的流程图中,它们由彩色的矩形和正方形表示。

图片图片

处理器体系结构实质上是一个文档,描述了它应具有的功能,以便与例如移动设备上使用的x86,x64或ARM体系结构相对应。 本文档描述了应支持哪些命令,寄存器分配和操作逻辑。 英特尔,AMD和Elbrus处理器的创建者可以根据需要实现此功能,并以命令,寄存器,标志,中断的形式向其中添加新功能,如果操作系统知道这些信息,则可以使用它。 就OOP而言,CPU体系结构是接口,而微体系结构是其实现。

逻辑电路 。 CPU框图中的彩色矩形由逻辑电路组成,这些逻辑电路对零和一的序列执行操作。 处理器以位(0和1)的形式查看所有数据和指令,根据公式,任何十进制数都可以表示为0和1的序列,但是特定的数字含义取决于上下文。 它可以是代码,数字,字母。 算术和逻辑单元(ALU)可以通过按位运算将两个数字相加。 加,减,乘和除的按位算法很早就为人所知;逻辑电路的开发人员只需有效地实现它们即可。

图片

数字电路以零和一的水平处理数据,而模拟电路则依赖于对物理定律的利用。 它们执行简单的位操作,例如移位,AND,OR,XOR。 通过这些原语,可以实现更复杂的操作。 下图显示了通过晶体管实现的模拟AND运算符。 在电路的输出端,只有在两个输入触点(Bx1和Bx2)上都存在一个非零电压,否则为零伏。 C#中的&&运算符的工作方式相同。 数字电路最终基于模拟。 逻辑电路中的物理逻辑元件不仅可以以电子方式实现,还可以以机械,液压,光学和其他方式实现。

图片

放射性元素的水平 。 物理模拟电路依赖于实际利用物理定律的无线电元件。 这些大多是半导体,即 在某些条件下,他们可能会导电,但可能不会。 二极管仅在一个方向上传导电流,如果未焊接,将其变成180并焊接回去,则电流将不会通过。 仅当控制脚上有电压时,晶体管才会通过电流。 人类已经学会了使晶体管微观化,因此可以将其放置在成千上万的小板上。 在下图中,在电子显微镜下,半导体无线电元件和纳米晶体管旁边的常规晶体管。
图片

图片
物理定律的水平 。 最后,最低级别是半导体放射性元素中包含的物理定律级别。

图片

我们将谈论很多有关OS级别的知识,而很少谈论计算机体系结构,微体系结构,模拟电路和无线电元件。 对于最后一部分,您应该了解所有这些如何一起工作。

操作系统基础


当我们在大学学习汇编语言时,许多学生都对诸如“内核和用户模式”之类的机灵语言感到震惊,在该模式下,真正知名的角色认证系统被隐藏在所有地方,在所有站点上至少都有一个“管理员”可以访问所有页面和“用户”具有受限访问权限。 同样,“核心”角色可以访问CPU的所有功能,“用户”角色可能不会导致所有处理器命令,也不会导致所有参数。 在此角色模型之上,操作系统基于客户端-服务器体系结构原理构建,其中服务器是实现OS功能的核心,客户端是用户程序。 在Web世界中,客户端和服务器在物理上是分开的-这是通过网络进行通信的两台不同的计算机。 在操作系统中,客户端和服务器位于同一台计算机和相同的硬件上。 服务器具有允许客户更改其状态的特定API,例如,Twitter API允许您创建帖子,登录并向移动客户端上载推文提要。 Windows具有Win API,由于任务范围更广,因此更加麻烦;如今,Windows具有大约330,000个API以及适用于UWP应用程序的API。 如果Twitter的概念对每个人(帖子,用户,提要)几乎都是清晰的,则OS的概念可能需要对其内部进行一些深化。 因此,如果不了解操作系统的内部结构,可能很难理解Windows API。

实际上,内核意味着三件事。 内核就像所有OS代码一样。 内核是负责操作系统机制的子系统,例如线程调度程序,上下文切换,中断处理,将虚拟内存交换到物理(内核),以及内核子系统以支持其他操作系统-CSRSS.exe(Windows),PSXSS.exe(POSIX), OS2SS.exe(OS / 2)或WSL(Linux的Windows子系统)。 在这种情况下,第一个含义被理解-所有OS代码。

当窗口出现在屏幕上时,数据结构将出现在OS的服务器部分(内核模式)中,该数据结构描述了此窗口-它在屏幕上的位置,大小,标题文本以及OS允许应用程序通过其响应事件的窗口功能。 由于操作系统中有许多子系统,因此可以有多个数据结构描述一个对象,例如,有关用户进程的信息位于组件中:

  • 执行 -这是操作系统的逻辑。 该层检查哪些进程可以执行和不能执行。 该文件包含有关父进程,进程启动参数(进程环境块),关联的用户帐户以及进程exe文件名称的信息。
  • 内核 -此处实现了诸如线程调度程序之类的OS机制。 它存储进程在用户和内核模式下花费的时间,线程所连接的处理器,进程线程的基本优先级。
  • 窗口子系统 -有关用于在窗口中绘制的GDI对象的信息。 这些是诸如笔刷,笔等的图元。
  • DirectX-与DirectX相关的所有内容:着色器,曲面,DX对象,GPU性能计数器,图形内存的内存设置。
  • 由CSRSS.exe进程(客户端服务器运行时子系统)表示的Windows子系统 。 Windows以前支持OS POSIX(进程PSXSS.exe)和OS / 2(OS2SS.exe)。 在那些日子里,使Windows成为同一子系统的想法来了,但是这很慢,因此很快CSRSS.exe的一部分被转移到win32k.sys,该文件现在分为多个文件-win32k.sys,win32kbase.sys和win32kfull.sys。 有关过程组数据,关闭级别,会话数据等的信息存储在此处。

对POSIX和OS / 2的支持更可能是正式的,因为要从这些OS转移程序,您必须找到源代码并以特殊方式对其进行编译,以获取一个exe文件,在其中将对OS API的所有调用都重定向到PSXdll.dll(NETAPI.DLL和OS / 2的DOSCALLS.DLL和Windows应用程序的User32.dll),是Windows API的精简包装。 某些API的状态存储在PSXSS.exe子系统(OS2SS.exe)的过程中。 由于并非所有API都可以映射为1到1,因此该程序运行不稳定。 Windows 10中增加了对Linux的支持,它以完全不同的方式工作。 Linux子系统以内核模式托管,Linux子系统和Linux子系统之间的差异与不同内部版本之间的差异大致相同。 特别是对于WSL,引入了一种新型的过程-PICO过程。

什么是成分? 这是逻辑分组的功能。 组件可以称为OOP类,dll,文件夹,具有公共前缀,名称空间,体系结构层的功能集。

有关客户端服务器分区的更多信息


客户端和服务器的分离是使用CPU的内置功能,内存共享和软件检查来实现的。

设备制造商与OS的开发人员合作,因此,处理器具有考虑到操作系统创建者的需求而创建的机制。 在所有现代处理器中,都实现了用户角色机制,其中用户被理解为当前的可执行代码。 在Web应用程序中,已登录用户的角色存储在变量中,除了友好名称Admin或User外,还具有此角色的ID,该角色通常在授权过程中使用,因为比较数字比字符串更快,更容易。 在处理器中,当前用户的角色存储在一个名为“安全环”的字段中,而不是“ CurrentUser.Role.Id”中。 在大多数处理器中,此字段采用从0到3的四个值。Windows使用0表示“内核模式”,因为它是特权级别最高的模式,而该值的最大值是“用户模式”,因为它是受限制最多的角色。 由于0和1、2和3之间的差异可以忽略,因此不使用其余角色。 这些角色限制了可以寻址的内存页面,您不能调用某些指令,也不能使用某些参数调用它们。 使用I / O端口技术与键盘等设备交换数据也受到限制,但是十年来一直没有使用。 切换到内核模式是通过syscall命令进行的,该命令通过索引在指向Windows API的指针数组中找到要调用的函数。 在操作系统引导期间,指向此阵列的指针存储在特殊的处理器寄存器中。

我专门将CPU寄存器称为一个字段。 用C#编写程序时,可以根据需要向类中添加任意多个字段,并为其指定友好的名称。 对于处理器和微控制器,字段称为寄存器。 在设计一块铁片时,您需要在此阶段已经了解需要多少个寄存器(字段),它们应具有的大小以及要为其分配的功能,以便在所有可能的和不可想象的情况下满足所有场合的需求。 想象一下,您需要使用类似于C#的编程语言编写程序,该语言在类中具有16个预定义字段,并且您不能使用局部变量。 即 同一字段可用于存储登录用户,排序数组,临时数据或方法的结果。 这些字段的名称应尽可能通用,而不是tempData,funcResult,将使用奇怪的名称EAX,AH,AL,DX等。如果您使用C#在x86架构上编写了处理器仿真器,则代码可能看起来像这样(DIV-除法,命令整数除法):

图片

为了说明,我添加了内核模式检查。 如果发生零除错误,处理器将通过中断通知操作系统(引发事件)。 在引导时,操作系统为处理器提供指向指向中断向量的函数的一维指针数组,其中每个索引对应于某种事件,例如,被零除。 OS知道运行它的处理器的体系结构,因此可以在数组中安排功能指针。 CPU调用此函数,并且操作系统具有自己的代码。 例如,Windows在注册表中查看是否已安装调试器,并显示一条消息,指出已发生错误,并且可以运行调试器以查看发生错误的位置。 中断之所以称为中断,是因为该中断会在程序的正常执行过程中进行干预,并使中断处理程序能够执行,并且只有在完成后,处理器才能返回程序执行状态。

中断不仅可以由处理器生成,而且可以由外部设备(键盘,鼠标)或程序代码生成。 线程调度程序设置了一个计时器,该计时器每隔一个时间间隔(默认情况下约为15ms,在Windows Server中为15ms以上)生成一个中断,以便根据内部算法分配另一个线程以供执行。 在Visual Studio中程序的逐步执行还依赖于中断机制-在处理器上设置一个标志,该标志在每个命令之后都会引起Windows调试引擎处理并通过Visual Studio API通知的中断。

借助虚拟内存实现了内存共享。 我之前说过,操作系统是资源管理器和虚拟机。 1 RAM 32 Windows 4 , .. 1, 4. ( ). . 4096 (4), :

  • . . CPU , . , , , , . .
  • , . RAM 4. RAM , .
  • , ( new ++) / . Exe- , c . .
  • RAM . / - . RAM , , . Windows 10 , .

Windows 10 , — ( ), .
图片图片
64 16 , 18,446,744,073,709,551,616 . RAM 48 , 16 . Win x64 , . , 64 Windows “” 256 Tb . 8TB IA64 7TB x64. Windows 10 — 2TB, . RAM Windows 10 , .

(HEX) , ? , . , — . CPU — CPU . HEX . , 32 ( 64) . — , HEX , .

- ( - ) . / . -, .

Windows?


Windows - . - — , , dll, . *.sys, *.dll , API , C, . C++. :

图片

:

  • Hyper-V Hypervisor — Windows . , Hyper-V , , .
  • HAL.dll — Hardware Abtraction Layer — — , , — Windows HAL.dll, . , , . , - ACPI.sys.

    Advanced Configuration and Power Interface? 1996 UI, .
    图片

    1996 ACPI, , .. . ACPI , CD drive, .. .
  • Device Drivers — . *.sys, , . Process Explorer SysInternals .
  • KernelKernel Mode Execution Environment , , , , . .
  • Executive — , - .
  • Windowing & Graphics — DirectX .
  • NtDll.dll — . dll , ( .. dll) . Nt Native, Native American. 即 API , . dll Nt (NtDestroyMenu). Win API User32.dll. NtDll.dll, Nt* (level of indirection) — subsystem dll User32.dll PSXdll.dll DOSCALLS.DLL Windows. NtDll.dll ( S ession M anagement S ub S ystem .exe , Win dows Init itialize .exe .), .
  • SubSystem dlls — . Windows User32.dll. - API , Nt* NtDll.dll, CreateFile NtCreateFile).
  • Environment Subsystems — CSRSS.exe, Windows. POSIX ( PSXSS.exe) OS/2 (OS2SS.exe). Windows Subsystem for Linux -.
  • System Processes — , LSASS.exe (Local Security Authority SubSystem) .
  • Service Processes — Windows ( Plug and Play Manager) *.exe . SvcHost.exe , *.dll-. SvcHost'.
  • User Processes — . — , , . .

. .

Source: https://habr.com/ru/post/zh-CN483330/


All Articles