首先,我想對你說,我從無到有寫這個問題,因為我試圖找到好的檔案,但沒有什么突出的......
當我們擠壓鑰匙時會發生什么?
我認為這很復雜,但我希望你能幫助我。
我想知道的:所有(尤其是程式在主機上啟動以及關鍵電信號如何編碼和發送......)
uj5u.com熱心網友回復:
可擴展主機控制器 (xHC) 具有定期傳輸環。每次經過以毫秒為單位的間隔時,Windows 都會對該環進行編程以觸發傳輸。正確的間隔在 USB 設備回傳的 USB 描述符中指定。當傳輸發生時,xHC 在事件環上放置一個傳輸事件 TRB 并觸發一個 MSI-X 中斷,它繞過 IOAPIC 作為某種處理器間中斷。如果 Windows 檢測到按下的鍵有一些變化,它將向當前具有焦點(呼叫視窗的程序)的應用程式發送一條訊息,并在引數之一中按下該鍵。
我不了解電信號,但我知道可擴展主機控制器是負責在現代 Windows 系統上與 USB 互動的 USB 控制器。由于現在的 Windows 需要 x64 處理器,因此 xHC 必須存在于您的主板上。xHC 是符合 PCI-Express 規范的 PCI-Express 設備。
要查找 xHC,您:
- 在 RAM 中找到 RSDP ACPI 表;
該表將由 UEFI 韌體找到,該韌體在計算機啟動期間充當某種小型作業系統 (OS)。然后,作業系統開發人員將撰寫一個名為 bootx64.efi 的小型 UEFI 應用程式,將其放置在硬碟的 FAT32 磁區上。他們會將這個應用程式放在 /boot/efi 目錄中。UEFI 韌體將在計算機啟動時直接啟動該應用程式,這允許擁有一個不需要用戶輸入即可啟動的作業系統(類似于它過去如何使用傳統 BIOS 獲取硬碟的第一個扇區并執行在那里找到的指令)。
UEFI 應用程式實際上是使用 EDK2 或 gnu-efi 編譯的。這些編譯器了解 UEFI 環境和規范。因此,他們將代碼編譯為系統呼叫,這些系統呼叫在啟動期間出現,可用于 OS 開發人員撰寫的 UEFI 應用程式。系統表(通常是 ACPI 表)作為引數提供給 UEFI 應用程式中的 UEFI 韌體呼叫的“main”函式(通常稱為 UefiMain)。因此,應用程式的代碼可以簡單地使用這些引數來查找 RSDP 表并將其傳遞給作業系統。
- 使用 RSDP 找到 MCFG ACPI 表;
表鏈為 RSDP -> XSDT -> MCFG。一旦 OS 找到 MCFG,該表指定 PCI 配置空間的基地址。要與 PCI 設備互動,您可以使用記憶體映射 IO (MMIO)。您寫入 RAM 中的某個位置,它會改為寫入 PCI 設備的暫存器。因此,MCFG 指定了您將開始為插入計算機的不同 PCI 設備查找 MMIO 暫存器的基地址。
- 迭代 PCI 設備并查看它們的 ID,直到找到 xHC。
為了迭代 PCI 設備,PCI 約定指定了一個公式,如下所示:
UINT64 physical_address = base_address ((bus - first_bus) << 20 | device << 15 | function << 12);
base_address 用于特定的段組。每個段組可以有 256 條總線(適用于大型服務器或具有大量組件的大型計算機)。最多可以有 65536 個段組,每個段組最多可以有 256 條 PCI 總線。每個 PCI 總線最多可以插入 32 個設備,每個設備最多可以有 8 個功能。每個函式也可以是一個 PCI 橋。這很容易理解,因為術語很清楚。這里的總線是 PCI 設備(如網卡、顯卡、xHC、AHCI 等)用來與 RAM 通信的實際串行總線。該功能是 PCI 設備的功能,如控制 USB 設備、硬碟、HDMI 螢屏(用于圖形卡)等。 PCI 橋將 PCI 總線橋接到另一個 PCI 總線。
同時,總線只是一個介于 0 和 255 之間的數字。第一條總線在 MCFG ACPI 表中為特定段組指定。設備是 0 到 31 之間的數字,函式是 0 到 7 之間的數字。該公式回傳一個物理地址,該地址指向具有特定暫存器的常規配置空間(對于所有功能都相同)。這些暫存器用于確定設備的型別并為其加載適當的驅動程式。因此,每個設備的每個功能都有一個配置空間。
對于 xHC,將只有一個函式,其配置空間回傳的 ID 將為類 ID 為 0x0C,子類 ID 為 0x03 ( https://wiki.osdev.org/EXtensible_Host_Controller_Interface )。
一旦找到 xHC,它就會變得相當復雜。您需要對其進行初始化并獲取當前插入計算機的USB 設備。您需要采取幾個步驟才能使 xHC 運行。對于這一部分,我將讓您閱讀 xHCI 規范,該規范(第 4 章)準確指定了需要采取的步驟(https://www.intel.com/content/dam/www/public/us/ en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf)。
對于鍵盤部分,我會讓你閱讀我在計算機科學堆疊交換上的答案之一:https : //cs.stackexchange.com/questions/141870/when-are-a-controllers-registers-loaded-and-準備通知一個 io 操作/141918#141918。
一些不錯的鏈接:
https://wiki.osdev.org/Universal_Serial_Bus
https://wiki.osdev.org/PCI
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367710.html
