关于PC工作第3部分:从开启到完全加载Windows 10

我们将继续了解PC如何在键盘和Windows 10的示例上工作。在本文中,我们将讨论如何将软件和硬件结合在一起。



系统启动



当计算机断开电源并且主板上的电容器放电时,计算机将完全关闭。在智能手机时代之前,手机经常出现故障,如果重启不能解决问题,则您必须取出电池并等待10秒钟,因为操作系统软件状态已重置,而主板和设备控制器上的芯片仍处于活动状态,并保持状态,操作系统驱动程序刚刚重新连接。 10秒-电容器放​​电的时间,仅在完全关闭后才重置芯片状态。

如果PC连接到电源插座或电池,则处于待机模式,这意味着通过电源总线提供了一个小电压(5V),主板上的某些芯片通过该总线供电。至少这是系统控制器本质上是一台运行大型计算机的微型计算机。在收到有关按下电源按钮的通知后,他要求电源/电池提供更多的电压,然后初始化包括处理器在内的整个芯片组。初始化包括将主板固件代码和数据(BIOS / UEFI传输到RAM并设置CPU以执行它。

认为“电源”按钮是向CPU供电并从先前已知的地址开始执行BIOS固件的开关是错误的。也许旧计算机是这样工作的。电源按钮与状态LED一起位于其板上,并通过特殊的连接器连接至主板。下图显示了电源按钮,复位按钮以及带有电源状态和硬盘读数的LED的触点。按下电源按钮将转换成一个信号,通知主板触点,从主板触点到达系统控制器。





主板上用于连接电源按钮,电源状态LED,硬盘驱动器和扬声器的引脚。





带有电源按钮和状态LED的笔记本电脑主板系统



控制器具有强大的功能-开启和关闭计算机,以内核模式执行代码。除此之外,可能还有其他具有类似功能的芯片,例如Intel Management EngineAMD Secure Technology(CPU的一部分),在计算机“关闭”时也可以使用。英特尔ME芯片具有运行MINIX 3操作系统的x86 CPU 他能做什么:

  1. 打开和关闭计算机,即 执行具有所有计算能力,机器外围设备和网络访问权限的程序。
  2. 绕过防火墙限制。
  3. 查看CPU和RAM中的所有数据,从而可以访问受密码保护的文件。
  4. 窃取加密密钥并获得密码访问权限
  5. 记录击键和鼠标移动
  6. 查看屏幕上显示的内容
  7. 防病毒软件无法检测Intel ME中的恶意代码,因为它无法达到如此低的水平
  8. 当然,使用您的堆栈通过网络秘密地通过网络发送数据。


由于会被黑客入侵或用于间谍目的,因此引发了严重的安全问题。



. (Nvidia 2070 S) , , 600W, ~500W. – 650W . , , – . , . – , ~$300. , . , (PS_ON) (COM). .



查找操作系统引导程序



主板固件有两种类型:较旧的计算机上的BIOS(基本输入输出系统)较新的设备上的UEFI(统一可扩展固件接口)Windows 10支持这两种方法,并抽象化它们之间的差异。将UEFI称为OS而不是固件是更正确的,因为它提供了更多功能,例如丰富的图形界面而不是文本界面,鼠标的存在,更多可用的内存,改进的安全模型和OS文件的验证,通过API与硬件的交互,而不是像BIOS中的中断。





示例BIOS监视器屏幕。



BIOS程序存储在连接到南桥的单独芯片上。该芯片可以通过新程序获得并刷新,实际上它只是一个存储载体,而不是一个独立的微型计算机。





BIOS设置(例如,系统时间)存储在另一个芯片上,该芯片通常位于圆形电池附近,该电池实际上是锂电池,可在PC运行时进行充电。它被称为CMOS,即互补金属氧化物半导体,在俄语中简称为CMOS,是互补金属氧化物半导体结构





首先,BIOS程序检查子系统,此过程称为POST-开机自检该测试可以缩写或完成,可以在BIOS设置中进行设置。引用Wikipedia,这些测试包括:

缩写测试包括:

  1. 使用校验和检查ROM中BIOS程序的完整性。
  2. 检测和初始化主控制器,系统总线和连接的设备(图形适配器,驱动器控制器等),以及执行设备BIOS中包含的程序并确保其自初始化。
  3. 确定RAM的大小并测试第一段(64 KB)。


POST的完整规定:

  1. 检查所有处理器寄存器;
  2. 检查ROM的校验和;
  3. 检查系统计时器和声音信号端口(对于IBM PC-IC i8253或同等产品);
  4. 直接内存访问控制器测试;
  5. RAM再生器测试;
  6. 测试较低的RAM区域以在BIOS中投影驻留程序;
  7. 加载常驻程序;
  8. 标准图形适配器测试(VGA或PCI-E);
  9. RAM测试;
  10. 主要输入设备(非操纵器)的测试;
  11. CMOS测试
  12. 测试主要的LPT / COM端口;
  13. 测试软盘驱动器(软盘驱动器);
  14. 测试硬盘(HDD);
  15. BIOS功能子系统的自我诊断;
  16. 将控制权转移到引导加载程序。


此测试可能会显示故障,例如无法正常工作的视频卡或键盘。由于监视器屏幕可能无法工作,因此将测试结果报告为一系列不同高度的蜂鸣声。它们的确切含义应在主板的文档中找到。较旧的计算机在启动过程中经常会发出哔声-这是BIOS程序报告测试结果。有时,可以使用其他指示器来显示错误编号。





如果一切顺利,BIOS将开始搜索操作系统引导程序的过程。为此,他开始扫描连接到主板的所有硬盘驱动器。物理磁盘上的数据以称为扇区的单位寻址,通常为512字节,但当前的标准为4096字节。 Windows安装程序将特殊程序代码和分区数据写入磁盘上的第一个扇区。该扇区称为主引导记录。磁盘分为多个分区,并用自己的文件系统格式化。最多4个分区,每个分区均可扩展(扩展分区),可以将其递归分为4个部分,从理论上讲,它们的数量不受限制。 BIOS一旦找到主引导记录,就会从那里读取代码并将控制权转移给它。此代码交替查看分区上的数据,并找到一个标记为活动的代码,其中包含Windows引导加载程序代码(这不是C:\ Windows \ System32!分区)。通常,它占用100MB的空间并向用户隐藏。该部分的第一扇区存储控制权转移到的引导代码。这是卷启动扇区,其中的代码查找Bootmgr文件,Windows启动过程从该文件开始。 Bootmgr文件是通过Startup.com文件Bootmgr.exe



处理器以称为“ Real”的模式开始工作。这是一种兼容模式,在这种模式下,CPU的工作方式与不支持虚拟内存的旧16位处理器的工作方式相同,而是通过20位地址总线直接与物理内存配合使用,从而可以寻址1MB的内存。简单的MS-DOS程序在此模式下运行并具有.COM扩展名。 Startup.com(Bootmgr)要做的第一件事是将处理器切换到“保护”模式,其中保护表示进程之间的相互保护。此模式支持虚拟内存和32位地址,可用于寻址4GB RAM。下一步,Bootmgr会为前16MB RAM填充虚拟地址表,并启用从虚拟地址到物理地址的转换。 Windows在这种模式下工作。由于在此阶段还没有创建OS子系统,因此Bootmgr拥有自己简单和不完整的NTFS文件系统实现,因此可以找到一个BCD文件(引导配置数据),该文件存储OS引导参数的设置。您可以使用BcdEdit.exe实用程序对其进行编辑。这些BCD设置可以指示Windows处于休眠状态,然后Bootmgr将启动程序WinResume.exe,它将从Hyberfil.sys文件中读取状态到内存并重新启动驱动程序。如果BCD表示存在多个操作系统,则Bootmgr将显示它们的列表并要求用户进行选择。如果有一个操作系统,则Bootmgr启动WinLoad.exe,此过程完成了初始化Windows的主要工作:

  1. 选择适当的Windows内核版本。即使实际上将其称为NtOsKrnl.exe,也可以将其视为Windows10.exe。有什么版本?根据维基百科:

    • ntoskrnl.exe是单处理器Windows内核。没有PAE支持
    • ntkrnlmp.exe(英语NT内核,多处理器版本)-Windows多处理器内核。没有PAE支持
    • ntkrnlpa.exe — Windows PAE.
    • ntkrpamp.exe — Windows PAE.


  2. HAL.dll (Hardware Abstraction Layer), CPU.
  3. vgaoem.fon
  4. , . National Language System.
  5. 将SYSTEM注册表加载到内存中,其中包含有关要加载的驱动程序的信息。有关所有驱动程序的信息位于HKLM \ SYSTEM \ CurrentControlSet \ Services \中需要加载的驱动程序具有start = SERVICE_BOOT_START(0)键。我们将在另一篇文章中讨论注册表设备。
  6. 为驱动程序文件所在的分区加载文件系统驱动程序。
  7. 将驱动程序加载到内存中,但由于循环依赖关系,尚未将其初始化。
  8. 准备执行第一步中选择的Windows内核所需的CPU寄存器-NtOsKrnl.exe。


加载驱动程序后,WinLoad将检查其数字签名,如果不匹配,则将显示蓝色(BSOD)或绿色(GSOD,对于内部预览组件而言)“死亡屏幕”。





在UEFI上运行





UEFI



BIOS引导屏幕的示例已有30多年了,为了纠正其缺陷,英特尔于1998年创建了英特尔引导计划,后来更名为EFI,并于2005年捐赠给EFI论坛。 BIOS的缺点:

•仅在16位模式下工作

•仅可寻址1Mb的RAM

•经常会存在兼容性问题

•MBR仅限于四个主磁盘分区

•OS磁盘不能超过2.2Tb。

•验证OS Bootloader的功能非常有限。

BIOS被UEFI取代了,实际上它是可以同时在32位和64位上运行的微型操作系统。为了兼容性,有一个选件兼容性支持模块,它包含在设置中并模拟BIOS。





在UEFI中,启动以处理器的本机位数进行-32或64,可以访问所有内存,支持虚拟内存,启用了安全启动,并且可以在操作系统开始加载之前运行反恶意软件。UEFI中的操作系统启动顺序:

  1. 固件初始化和启动,芯片组启动。
  2. POST测试,类似于BIOS
  3. 加载EFI驱动程序并查找符合EFI要求的启动盘
  4. 搜索名为EFI的文件夹。UEFI规范要求EFI系统分区存在一个分区,该分区已格式化为FAT文件系统,其大小为100MB-1GB,或不超过磁盘大小的1%。每个已安装的Windows在此分区上都有自己的目录-EFI \ Microsoft

  5. UEFI NVRAM ( ) .
  6. EFI/Microsoft/Boot/BootMgrFw.efi.
  7. BootMgrFw.efi BCD, BCD. WinLoad.efi, C:\Windows\System32\winload.efi.


要查看EFI系统分区的内容,请打开具有管理员权限的控制台(WinKey + X => Windows PowerShell(Admin)),然后运行mountvol Z:/ s,Z:,dir命令CD-更改目录。

UEFI的BootMgr和WinLoad组件与BIOS对应项之间的主要区别在于,它们使用EFI API而不是BIOS中断,并且MBR BIOSEFI系统分区启动分区的格式非常不同。



内核初始化



让我提醒您,我们正在考虑在键盘环境中加载PC,因此您不应专注于所有阶段。有必要了解键盘在此过程中的位置,突出显示对于理解很重要的阶段

在上一阶段,启动了WinLoad.exe / WinLoad.efi组件,该组件通过WinLoad工作期间收集的全局变量nt!KeLoaderBlock(内核模式内存可用于所有进程)中指定启动参数来启动NtOsKrnl.exe这些包括:

  1. 系统(Windows bootloader)和引导(C:\ Windows \ System32)目录的路径
  2. 指向WinLoad创建的虚拟内存表的指针
  3. 带有所连接硬件描述的树,用于创建HKLM \ HARDWARE注册表项。
  4. 下载的注册表HKLM \ System的副本
  5. 指向参与Windows启动的已加载(但未初始化)驱动程序列表的指针。
  6. 下载所需的其他信息。


Windows内核分为两个阶段初始化。在此之前,硬件抽象层被初始化,除其他外,该层为每个CPU配置了中断控制器。

在同一阶段,将带有BSOD消息的字符串加载到内存中,因为在跌落时它们可能无法访问或损坏。

  • 内核初始化的第一阶段:

    1. Executive – , , . Windows SKU (Stock Keeping Unit), Windows 10 SKU — Home, Pro, Mobile, Enterprise, Education.
    2. Driver Verifier, .
    3. , API (memory services), .
    4. (kernel debugger) .
    5. Windows.
    6. Object Manager – . – . handle table, HWND .
    7. Security Reference Monitor .
    8. Process Manager . Idle System ( “Windows10.exe” NtOsKrnl.exe), , .
    9. User-Mode Debugging Framework.
    10. Plug and Play Manager. PnP – , . .


  • . 51 , :

    1. System (NtOsKrnl.exe) . . – 31.
    2. HAL .
    3. Windows Startup Screen, progress bar.
    4. Executive Semaphore, Mutex, Event, Timer.
    5. User-Mode Debugger .
    6. symbolic link \SystemRoot.
    7. NtDll.dll . Windows APIs.
    8. .
    9. Windows ALPC . named pipes Windows Communication Foundation .
    10. I/O Manager, . .

      Windows Management Instrumentation Event Tracing for Windows ( Windows Performance Analyzer). .
    11. SMSS.exe (Session Manager Sub System). , Windows.




– SMSS, CSRSS, WinInit



SMSS.exe与用户进程不同,它是本机进程,因此为其提供了附加权限。 SMSS.exe与内核一起使用,绕过Windows API,它使用的是本机API。 Windows API是本机API的包装。 SMSS.exe首先启动Windows子系统(CSRSS.exe-客户端服务器运行时子系统),并完成初始化注册表。



SMSS.exe进程和线程被标记为关键,这意味着,如果它们意外终止(例如由于错误),将导致系统崩溃。与子系统通信,例如,API调用创建一个新的会话,SMSS将创建一个名为ALPC端口SmApiPort...从注册表加载环境变量,启动诸如Check Disk(autochk.exe,这些程序写入注册表HKLM \ SYSTEM \ CurrentControlSet \ Control \ SessionManager \ BootExecute)之类的程序。将为每个用户会话启动SMSS.exe。由于虚拟内存机制,每个会话都有其自己的全局变量(例如,消息队列)。 Windows具有线程,进程和会话上下文。每个SMSS.exe都将启动其自己的子系统实例,此刻仅是CSRSS.exe(Windows),过去支持OS / 2(os2ss.exe)和POSIX(psxss.exe)操作系统,但这种想法并未成功。第一个SMSS.exe进入睡眠状态,等待WinInit.exe进程。其余实例将创建一个WinLogon进程来显示登录UI。



WinInit.exe初始化用于创建图形外壳的子系统-Windows Station桌面,这不是您看到的桌面,这是一个不同的Windows概念。然后,它开始流程:

  1. Services.exe的-服务控制管理器(SCM)启动标记为自动启动服务和驱动程序。服务在svchost.exe进程中启动有一个名为tlist.exe的实用程序,当使用tlist.exe -s参数运行时,它将在控制台中打印每个svchost.exe中服务的名称。
  2. LSASS.exe-本地系统授权。
  3. LSM.exe-本地会话管理器。


WinLogon.exe-加载凭据提供程序,可以是密码,智能卡,PIN,Hello Face。它产生LogonUI.exe进程进程向用户显示一个用于身份验证的界面,然后验证输入的数据(登录名和密码,PIN)。



如果一切顺利,则WinLogon将启动在注册表项HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit中指定的过程默认情况下,这是UserInit.exe进程,该进程

  1. 运行注册表中指定的脚本:
    • HKCU \软件\策略\微软\ Windows \系统\脚本
    • HKLM \软件\策略\微软\ Windows \系统\脚本
  2. User Profile Quota, %SystemRoot%\System32\Proquota.exe
  3. Windows, Explorer.exe. :
    • HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
    • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell


WinLogon将已登录用户通知网络提供商,他将还原并连接到注册表中的系统磁盘和打印机连接到该用户。网络提供程序是系统文件夹中mpr.dll文件,由svchost.exe进程托管,即 Windows服务。



进程树如下所示,您可以在其中看到谁创建了谁(不是所有进程都显示出来,它可能与Windows的最新版本略有不同)。





键盘在哪里?



在启动过程中,Windows内核从注册表中读取有关系统总线控制器的信息,通常,这是PCI总线(较少为MSI),I / O端口控制器(包括USB,PS / 2)已连接到它。在Windows安装期间会记录有关它的信息。系统为其加载驱动程序,并以递归方式绕过所有端口,并为每个端口加载自己的驱动程序。驱动程序可以组合到驱动程序节点中,例如,键盘驱动程序将连接到PS2端口驱动程序。但是USB端口更加复杂-首先是端口驱动程序,然后是用于HID协议的驱动程序,然后才是键盘。



每个端口均由其自己的芯片控制,该芯片监视连接,并在CPU和设备之间接收/发送信号。如果南桥芯片组没有像笔记本电脑中那样通常内置于CPU中,而是作为主板上的独立芯片存在,那么说南桥与端口控制器之间的信号会更正确。控制端口芯片具有一条带有中断控制器(PIC或APIC)的专用线路,通过它可以要求CPU注意自身,例如,从键盘读取数据(PS / 2端口,带有USB,另一个说法)。由于操作系统已为端口加载了驱动程序,因此它可以向其发出命令,读取和发送数据。在我们的示例中,驱动程序是从C:\ Windows \ System32 \ i8042prt.sys加载的。让我们记住上一篇文章。在装有PIC芯片的旧计算机中英特尔8259具有15条中断线,其中键盘连接到IRQ1引脚,IRQ0计时器,鼠标​​连接到IRQ12,实际上是第二个8259芯片的第五脚,它通过第一个控制器的IRQ2引脚复用其中断。现代PIC可以具有255个用于中断信号的引脚。在引导过程中,操作系统对APIC / PIC进行编程,以便在键盘或USB端口有中断到达时返回某个数字,然后CPU通过该数字在中断向量表中找到要执行功能。中断号由HAL即插即用管理器确定... 中断控制器以某种顺序在其引脚上寻找信号,例如,在无限循环中,它检查引脚上从1到MAX_PIN的电压。此顺序确定优先级,例如,键盘将在鼠标之前显示,而计时器将在键盘之前显示。为了不依赖于中断控制器工作的特殊性,WindowsIRQL(中断请求级别)中抽象了IRQ(中断请求)的概念如果中断控制器至少有15或255条线,则它们将全部映射到x86的32 IRQL和x64和IA64的15 IRQL。
IRQL优先级是什么意思:

  1. 高-当系统崩溃时,通常是对KeBugCheckEx函数的调用。
  2. 电源故障-未使用。它最初是为Windows NT设计的。
  3. Interprocessor Interrupt – CPU , TLB cache, system shutdown, system crash (BSOD).
  4. Clock – , .
  5. Profile – real-time clock (local APIC-timer) kernel-profiling .
  6. Device 1 … Device N – I/O. , DPC (Deferred Procedure Call), . Dispatch DPC
  7. Dispatch DPC — .
  8. APC — Asynchronous Procedure Call. WaitForSingleObject, Sleep .
  9. Passive/Low — User Mode.


如果您始终在用户模式下进行编程,则您从未听说过IRQL,因为所有用户程序都以“被动/低(0)”优先级执行。一旦发生与lshim优先级有关的事件b (键盘事件,线程调度程序计时器),处理器将保存被中断线程的状态(即CPU寄存器值),并调用分派器中断(中断分派器,只是一个函数),从而提高IRQL优先级通过HAL中KeRaiseIrql API并直接调用中断的服务例程本身。之后,通过KeLowerIrql函数将CPU IRQL降低到先前的级别并且被中断的线程从被中断的同一位置开始处理。线程调度程序基于此机制。它设置一个计时器,该计时器以一定的时间间隔(时间片)生成具有DPC / Dispatch(2)优先级的中断,并在其中断服务程序中根据某种算法为执行分配一个新线程。



IRQL机制是在硬件抽象层(HAL.dll)而非硬件中的软件级别实现的。 Windows系统具有总线驱动程序),它确定连接到总线的设备(PCI,USB等)的存在以及可以分配给每个设备的中断号。总线驱动程序将此信息传递给即插即用管理器,即插即用管理器已经确定了要分配给每个设备的中断号。此外,PnP Mgr中的中断仲裁器PnP中断仲裁器)在IRQ和IRQL之间建立链接。



当键盘中断到达时,将分配当前正在执行的任何线程(可能是您的程序)来处理它。中断调度程序将CPU IRQL优先级提高到Device1-DeviceN级别之一。此后,如果未将页面加载到RAM中,则虚拟内存管理器将无法找到该页面(将无法处理页面错误)。),线程调度程序将无法中断执行,因为它们都以较低的IRQL运行。此时,键盘驱动程序的主要任务是读取接收到的数据并将其保存以进行进一步处理。数据被写入类型为_DPC(延迟过程调用的对象,该对象将保存到DPC流的列表中(类似于OS内核中的std :: list <DPC>之类的东西,而不是数组,而是使用链接列表)。一旦处理了所有外部设备的中断,线程的IRQL就会降低到处理延迟过程(DPC)的DPC级别。键盘DPC处理程序代码从键盘驱动程序Kbdclass.sys调用一个函数



VOID KeyboardClassServiceCallback(
  _In_    PDEVICE_OBJECT       DeviceObject,
  _In_    PKEYBOARD_INPUT_DATA InputDataStart,
  _In_    PKEYBOARD_INPUT_DATA InputDataEnd,
  _Inout_ PULONG               InputDataConsumed
);


因此,键盘驱动程序(kbdclass.sys)通过中断从端口(USB,PS2)接收数据,并通过WriteFile写入数据,Windows内核中的组件将唤醒,使用ReadFile API读取它们并将消息从键盘添加到队列中。文件API可用于从驱动程序读取数据。从这一刻开始,Windows输入堆栈开始处理数据,有关更多信息,请参见下一篇文章。



如果您有一台带有PS2端口的PC,并且知道如何在内核模式下使用WinDbg,则可以通过键入!Idt来轻松找到键盘中断处理程序,它将显示整个中断向量表。...中断将自身楔入程序的过程中,矢量一词在此表示方向,即程序执行的方向。 WinDbg是专门为Windows调试而制作的,最新版本称为WinDbgX。它具有基于文本的界面,可以使习惯于Visual Studio的人们感到恐惧,但是它提供了更多选项,尤其是脚本的执行。紫色的PS2端口中断以红色突出显示。处理该函数的函数称为I8042KeyboardInterruptService,它位于i8042prt.sys文件中。



BOOLEAN
I8042KeyboardInterruptService(
  IN  PKINTERRUPT Interrupt,
  IN  PVOID Context
  );

Routine Description:

    This is the interrupt service routine for the keyboard device when
    scan code set 1 is in use.

Arguments:

    Interrupt - A pointer to the interrupt object for this interrupt.

    Context - A pointer to the device object.

Return Value:

    Returns TRUE if the interrupt was expected (and therefore processed);
    otherwise, FALSE is returned.




现在出现了问题,中断处理程序从哪里获得参数?谁在传播它?毕竟,CPU对此一无所知。如果将其设置为断点,则感到惊讶的是,堆栈上有更多功能:



0:kd> kC

调用站点的数量

00 i8042prt I8042KeyboardInterruptService!

01 nt KiCallInterruptServiceRoutine!

02 nt KiInterruptSubDispatch!

03 nt KiInterruptDispatch!

04 nt KiIdleLoop!




解释很简单-it。而不是存储在处理器的IDT寄存器中的功能您在上图中看到的实际上是_KINTERRUPT类型的对象... 特殊的汇编代码(nt!KiIdleLoop)存储在中断表中,该代码知道如何在内存中找到描述中断的对象。有趣的是什么?

  1. .
  2. i8042prt!I8042KeyboardInterruptService, PS2 IN AL, 0x60 – 0x60 AL.
  3. dispatcher – №2 .
  4. CPU. CPU , .
  5. . , Windows . IRQL (Interrupt Request Level) – IRQ.


键盘中断处理程序被调用后,它将通知键盘驱动程序接收到的数据,此后将通知OS内核,操作系统内核将在处理数据后将其沿输入堆栈进一步发送,在此处可以将它们传递到将对它们做出响应的应用程序中,或在传递给处理程序之前语言(亚洲字符,自动更正,自动完成)。

OS内核不直接与键盘驱动程序交互;即插即用管理器用于此目的。该组件提供IoRegisterPlugPlayNotification API ,当添加或移除设备时,该API会调用提供的回调函数。



关于USB的几句话



熟悉USB端口的操作将需要单独的文章描述其操作,以及Windows上HID数据处理的描述。这会使材料变得非常复杂,并且已经有很多关于该主题的文章,因此PS2由于其简单性而成为一个完美的例子。



USB被创建为所有设备的通用端口,包括键盘,照相机,扫描仪,带踏板的游戏轮,打印机等。此外,它还支持端口嵌套-USB主板=>带USB的显示器=>带鼠标连接的USB键盘,闪存驱动器和硬盘驱动器所连接的USB集线器。看一下USB 2.0引脚,您会发现它们不是为传输任何特定数据而设计的,例如PS2。它们只有四个-用于传输数据位,正负功率的双绞线。





USB 2.0



电缆通过五个额外的引脚可以更快地连接到USB 3.0。如您所见,没有用于同步的CLOCK线,因此数据传输逻辑更加复杂。左USB 2.0和右USB 3.0进行比较。

所有数据都是通过HID(人机接口设备)协议传输的,该协议描述了格式,交互和数据传输的顺序以及其他所有内容。USB 2.0标准需要650页,HID类规范文档描述了设备(鼠标,键盘等)的操作-97页,如果您使用USB,建议仔细研究它们。



首先,连接的设备必须说明自身,为此它发送几个数据结构,这些数据结构指示设备ID和制造商ID,即插即用管理器可以通过它们在注册表中查找信息,加载和连接驱动程序。 USB设备是无源的,即主机必须每隔一定时间检查数据本身是否存在。轮询速率和数据包大小在USB设备描述符之一中指定。最大数据包大小为64字节,这比有关击键的足够信息。



Windows具有内置的HID支持,它不像将PS2端口驱动程序链接到键盘驱动程序那样简单,因为HID驱动程序必须能够处理协议支持的所有脚本。无论数据提供者是PS2,USB还是远程桌面端口还是虚拟机,在驱动程序节点的最顶部都将存在Kbdclass,OS内核将从中接收信息。键盘附件通知将通过Plug'n'Play Manager处理,因此Windows内核使用哪个端口或设备数据源都无关紧要。



第1部分-操作系统和计算机基础知识

第2部分-主板和键盘如何通过PS2端口工作



All Articles