Tentang pekerjaan PC bagian 3: Dari menyalakan hingga memuat penuh Windows 10

Kami terus memahami cara kerja PC pada contoh keyboard dan Windows 10. Pada artikel ini, kami akan membahas tentang bagaimana perangkat lunak dan perangkat keras digabungkan.



Sistem dimulai



Komputer benar-benar mati saat diputus dari daya dan kapasitor pada motherboard sudah kosong. Sebelum era smartphone, ponsel sering mengalami gangguan dan jika restart tidak menyembuhkan masalah, maka Anda harus mengeluarkan baterai dan menunggu 10 detik, karena status perangkat lunak OS direset, sedangkan chip pada motherboard dan pengontrol perangkat tetap aktif, menjaga status, driver OS untuk mereka baru saja tersambung kembali. 10 detik - waktu untuk melepaskan kapasitor, status chip disetel ulang hanya setelah dimatikan sepenuhnya.

Jika PC terhubung ke stopkontak atau baterai, maka dalam mode Stand-By, yang berarti tegangan kecil (5V) disuplai melalui bus daya dari mana beberapa chip pada motherboard diberi daya. Setidaknya ini adalah pengontrol sistempada dasarnya adalah komputer mini yang menjalankan komputer besar. Setelah menerima pemberitahuan tentang menekan tombol Daya, dia meminta catu daya / baterai untuk memasok lebih banyak voltase dan kemudian menginisialisasi seluruh set chip, termasuk prosesor. Inisialisasi termasuk mentransfer kode dan data firmware motherboard ( BIOS / UEFI ) ke dalam RAM dan mengatur CPU untuk menjalankannya.

Menganggap bahwa tombol Daya adalah sakelar yang memasok listrik ke CPU dan yang mulai menjalankan firmware BIOS dari alamat yang diketahui sebelumnya adalah salah. Mungkin komputer lama bekerja seperti itu. Tombol daya terletak di papannya, bersama dengan LED status, dan terhubung ke motherboard melalui konektor khusus. Gambar di bawah ini menunjukkan kontak untuk tombol Power, Reset, serta LED dengan status Power dan pembacaan hard disk. Menekan tombol daya diterjemahkan menjadi sinyal ke kontak motherboard, dari mana ia mencapai pengontrol sistem.





Pin pada motherboard untuk menghubungkan tombol power, LED status daya, hard drive dan speaker.





Motherboard laptop dengan tombol power dan LED status



Pengontrol sistem memiliki kekuatan yang luar biasa - untuk menghidupkan dan mematikan komputer, menjalankan kode dalam mode kernel. Selain itu, mungkin ada chip lain dengan kemampuan yang sebanding, seperti Intel Management Engine atau AMD Secure Technology (bagian dari CPU), yang juga berfungsi saat komputer "dimatikan". Chip Intel ME memiliki CPU x86 yang menjalankan sistem operasi MINIX 3 . Apa yang bisa dia lakukan:

  1. Hidupkan dan matikan komputer, mis. menjalankan program dengan akses ke semua daya komputasi, periferal mesin, dan jaringan.
  2. Lewati batasan firewall.
  3. Lihat semua data di CPU dan RAM, yang memberikan akses ke file yang dilindungi kata sandi.
  4. Curi kunci enkripsi dan dapatkan akses ke kata sandi
  5. Catat penekanan tombol dan gerakan mouse
  6. Lihat apa yang ditampilkan di layar
  7. Kode berbahaya di Intel ME tidak dapat dideteksi oleh antivirus, karena tidak dapat mencapai level yang begitu rendah
  8. Dan tentu saja, secara diam-diam mengirim data melalui jaringan menggunakan tumpukan Anda untuk bekerja dengan jaringan.


Hal ini menimbulkan masalah keamanan yang serius karena dapat diretas atau digunakan untuk tujuan spionase.



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



Temukan bootloader OS



Ada dua jenis firmware motherboard - BIOS (Basic Input Output System) pada mesin lama dan UEFI (Unified Extensible Firmware Interface) pada mesin yang lebih baru. Windows 10 mendukung keduanya dan mengabstraksikan perbedaan di antara keduanya. Lebih tepat menyebut UEFI sebagai OS daripada firmware, karena ia menawarkan lebih banyak fitur, misalnya, antarmuka grafis yang kaya daripada teks, kehadiran mouse, lebih banyak memori yang tersedia, model keamanan yang ditingkatkan dan validasi file OS, interaksi dengan perangkat keras melalui API, daripada interupsi seperti di BIOS.





Contoh layar monitor BIOS.



Program BIOS disimpan pada chip terpisah yang terhubung ke South Bridge. Chip ini dapat diperoleh dan direflash dengan program baru, sebenarnya itu hanya pembawa memori, dan bukan komputer mikro independen.





Pengaturan BIOS (waktu sistem, misalnya) disimpan di chip lain, yang biasanya terletak di dekat baterai bundar, yang sebenarnya adalah baterai lithium yang diisi ulang saat PC sedang berjalan. Ini disebut CMOS , yang berarti Semikonduktor Oksida Logam Pelengkap , dan dalam bahasa Rusia sederhana - CMOS, yang merupakan struktur semikonduktor logam-oksida pelengkap .





Pertama-tama, program BIOS memeriksa subsistem, prosedur ini disebut POST - Power On Self Test. Tes dapat disingkat atau selesai, ini diatur di pengaturan BIOS. Untuk mengutip Wikipedia , apa tes ini termasuk: Tes

singkat meliputi:

  1. Memeriksa integritas program BIOS di ROM menggunakan checksum.
  2. Deteksi dan inisialisasi pengontrol utama, bus sistem, dan perangkat yang terhubung (adaptor grafis, pengontrol drive, dll.), Serta eksekusi program yang disertakan dalam BIOS perangkat dan memastikan inisialisasi sendiri.
  3. Menentukan ukuran RAM dan menguji segmen pertama (64 kilobyte).


Peraturan lengkap untuk POST:

  1. Memeriksa semua register prosesor;
  2. Memeriksa checksum ROM;
  3. Memeriksa timer sistem dan port sinyal suara (untuk IBM PC - IC i8253 atau yang setara);
  4. Uji pengontrol akses memori langsung;
  5. Tes regenerator RAM;
  6. Uji area RAM bagian bawah untuk memproyeksikan program residen di BIOS;
  7. Memuat program penduduk;
  8. Tes adaptor grafik standar (VGA atau PCI-E);
  9. Tes RAM;
  10. Uji perangkat input utama (BUKAN manipulator);
  11. Tes CMOS
  12. Uji port utama LPT / COM;
  13. Uji drive floppy disk (drive floppy disk);
  14. Uji hard disk drive (HDD);
  15. Diagnostik mandiri subsistem fungsional BIOS;
  16. Mentransfer kontrol ke bootloader.


Tes ini dapat mengungkapkan kerusakan, seperti kartu video atau keyboard yang tidak berfungsi. Karena layar monitor mungkin tidak berfungsi, hasil tes dilaporkan sebagai serangkaian bunyi bip dengan ketinggian berbeda. Apa sebenarnya maksudnya harus dilihat dalam dokumentasi motherboard. Komputer yang lebih lama sering berbunyi bip saat startup - ini adalah program BIOS yang melaporkan hasil tes. Terkadang indikator tambahan dapat digunakan untuk menunjukkan nomor kesalahan.





Jika semuanya berjalan dengan baik, BIOS memulai proses pencarian bootloader OS. Untuk melakukan ini, ia mulai memindai semua hard drive yang terhubung ke motherboard. Data pada disk fisik dialamatkan dalam unit yang disebut sektor , biasanya 512 byte, tetapi standar saat ini adalah 4096 byte. Penginstal Windows menulis kode program khusus dan data partisi ke sektor pertama pada disk. Sektor ini disebut Master Boot Record . Disk dibagi menjadi beberapa partisi, diformat dengan sistem file mereka sendiri. Maksimal 4 partisi, masing-masing dapat diperpanjang (partisi extended), ini dapat secara rekursif dibagi menjadi 4 bagian dan secara teoritis jumlahnya tidak terbatas. Segera setelah BIOS menemukan Master Boot Record, BIOS membaca kode dari sana dan mentransfer kontrol ke sana. Kode ini secara bergantian mencari melalui data di partisi dan menemukan yang ditandai sebagai aktif, berisi kode bootloader Windows (Ini bukan partisi dengan C: \ Windows \ System32!), Partisi ini disebut partisi sistem . Biasanya, ini membutuhkan 100MB dan disembunyikan dari pengguna. Sektor pertama dari bagian ini menyimpan kode boot ke mana kontrol ditransfer. Ini adalah sektor boot volume , kode di dalamnya mencari file Bootmgr , tempat proses boot Windows dimulai. File Bootmgr dibuat melalui satu tautan antara file Startup.com danBootmgr.exe .



Prosesor mulai bekerja dalam mode yang disebut "Nyata" . Ini adalah mode kompatibilitas, di mana CPU bekerja dengan cara yang sama seperti prosesor 16-bit lama yang tidak memiliki dukungan memori virtual dan bekerja langsung dengan memori fisik melalui bus alamat 20-bit, yang memungkinkan 1MB memori untuk ditangani. Program MS-DOS sederhana berjalan dalam mode ini dan memiliki ekstensi .COM. Hal pertama yang dilakukan oleh Startup.com (Bootmgr) adalah mengalihkan prosesor ke mode "Protected", di mana perlindungan berarti perlindungan proses dari satu sama lain. Mode ini mendukung memori virtual dan alamat 32-bit, yang dapat digunakan untuk mengatasi RAM 4GB. Langkah selanjutnya, Bootmgr mengisi tabel alamat virtual untuk 16MB RAM pertama dan mengaktifkan terjemahan dari alamat virtual ke alamat fisik. Dalam mode ini Windows bekerja. Karena pada tahap ini subsistem OS belum dibuat, Bootmgr memiliki implementasi sistem file NTFS sendiri yang sederhana dan tidak lengkap, berkat itu ia menemukan file BCD (Data Konfigurasi Boot) , yang menyimpan pengaturan parameter boot OS. Anda dapat mengeditnya menggunakan utilitas BcdEdit.exe . Pengaturan BCD ini dapat menunjukkan bahwa Windows dalam keadaan hibernasi dan kemudian Bootmgr akan memulai programWinResume.exe , yang membaca status dari berkas Hyberfil.sys ke dalam memori dan me -restart driver. Jika BCD mengatakan ada beberapa sistem operasi, maka Bootmgr akan menampilkan daftarnya dan meminta pengguna untuk memilih. Jika ada satu OS, kemudian Bootmgr meluncurkan WinLoad.exe, proses ini melakukan pekerjaan utama untuk menginisialisasi Windows:

  1. Memilih versi kernel Windows yang sesuai. Anda dapat menganggapnya sebagai Windows10.exe meskipun sebenarnya disebut NtOsKrnl.exe. Versi apa yang ada? Menurut wikipedia:

    • ntoskrnl.exe adalah kernel Windows prosesor tunggal. tanpa dukungan PAE
    • ntkrnlmp.exe (Kernel NT Bahasa Inggris, versi Multi-Prosesor) - Kernel multiprosesor Windows. tanpa dukungan PAE
    • ntkrnlpa.exe — Windows PAE.
    • ntkrpamp.exe — Windows PAE.


  2. HAL.dll (Hardware Abstraction Layer), CPU.
  3. vgaoem.fon
  4. , . National Language System.
  5. Memuat registri SISTEM ke dalam memori, berisi informasi tentang driver yang akan dimuat. Informasi tentang semua driver terletak di HKLM \ SYSTEM \ CurrentControlSet \ Services \ . Driver yang perlu dimuat memiliki kunci start = SERVICE_BOOT_START (0). Kami akan berbicara tentang perangkat registri di artikel lain.
  6. Memuat driver sistem file untuk partisi tempat file driver tersebut berada.
  7. Memuat driver ke dalam memori, tetapi belum menginisialisasinya karena dependensi melingkar.
  8. Mempersiapkan register CPU untuk eksekusi kernel Windows yang dipilih pada langkah pertama - NtOsKrnl.exe.


Ketika driver dimuat, WinLoad memeriksa tanda tangan digital mereka dan jika tidak cocok, akan ada "layar kematian" biru ( BSOD ) atau hijau ( GSOD , untuk pratinjau orang dalam).





Jalankan di UEFI





Contoh layar boot UEFI



BIOS telah ada selama lebih dari 30 tahun, dan dalam upaya untuk memperbaiki kekurangannya, Intel membuat Intel Boot Initiative pada tahun 1998, kemudian berganti nama menjadi EFI dan disumbangkan ke Forum EFI pada tahun 2005. Kekurangan BIOS:

• Bekerja hanya dalam mode 16-bit

• Hanya dapat menangani 1Mb RAM

• Seringkali memiliki masalah kompatibilitas

• MBR terbatas hanya pada empat partisi disk utama

• Disk OS tidak boleh lebih dari 2,2Tb.

• Memiliki kemampuan yang sangat terbatas untuk memvalidasi bootloader OS.

BIOS digantikan oleh UEFI, sebenarnya ini adalah OS mini yang dapat berjalan di 32-bit dan 64-bit. Untuk kompatibilitas, ada opsi Compatibility Support Module, yang termasuk dalam pengaturan dan mengemulasi BIOS.





Di UEFI, boot terjadi dalam bitness asli untuk prosesor - 32 atau 64, ada akses ke semua memori, memori virtual didukung, Boot Aman diaktifkan dan dimungkinkan untuk menjalankan antimalware sebelum OS mulai memuat. Urutan boot OS di UEFI:

  1. Inisialisasi dan peluncuran firmware, peluncuran chipset.
  2. Tes POST, mirip dengan BIOS
  3. Memuat Driver EFI dan Menemukan Disk Boot yang Memenuhi Syarat EFI
  4. Cari folder bernama EFI. Spesifikasi UEFI mensyaratkan adanya partisi untuk Partisi Sistem EFI , diformat untuk sistem file FAT, dengan ukuran 100MB - 1GB, atau tidak lebih dari 1% dari ukuran disk. Setiap Windows yang diinstal memiliki direktori sendiri di partisi ini - EFI \ Microsoft .

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


Untuk melihat konten Partisi Sistem EFI, buka konsol dengan hak admin (WinKey + X => Windows PowerShell (Admin)) dan jalankan perintah mountvol Z: / s, Z:, dir . CD - mengubah direktori.

Perbedaan utama antara komponen BootMgr dan WinLoad untuk UEFI dari rekan BIOS mereka adalah bahwa mereka menggunakan EFI API daripada interupsi BIOS, dan format partisi boot MBR BIOS dan Partisi Sistem EFI sangat berbeda.



Inisialisasi kernel



Izinkan saya mengingatkan Anda bahwa kami sedang mempertimbangkan untuk memuat PC dalam konteks keyboard, jadi Anda sebaiknya tidak fokus pada semua tahapan. Penting untuk memahami di mana keyboard berada dalam proses ini, tahapan yang penting untuk pemahaman disorot .

Pada tahap sebelumnya, komponen WinLoad.exe / WinLoad.efi diluncurkan , yang meluncurkan NtOsKrnl.exe dengan menentukan parameter boot di variabel global nt! KeLoaderBlock (memori mode kernel tersedia untuk semua proses) yang dikumpulkan WinLoad selama pekerjaannya. Ini termasuk:

  1. Jalur ke direktori System (Windows bootloader) dan Boot ( C: \ Windows \ System32 ).
  2. Pointer ke tabel memori virtual yang dibuat oleh WinLoad
  3. Sebuah pohon dengan deskripsi dari perangkat keras yang terhubung, digunakan untuk membuat kunci registri HKLM \ HARDWARE.
  4. Salinan registri yang diunduh HKLM \ System
  5. Arahkan ke daftar driver yang dimuat (tetapi tidak diinisialisasi) yang berpartisipasi dalam startup Windows.
  6. Informasi lain yang diperlukan untuk mengunduh.


Kernel Windows diinisialisasi dalam dua tahap. Sebelum ini, Lapisan Abstraksi Perangkat Keras diinisialisasi , yang antara lain mengkonfigurasi pengontrol interupsi untuk setiap CPU.

Pada tahap yang sama, string dengan pesan untuk BSOD dimuat ke dalam memori, karena pada saat penurunan tersebut mungkin tidak dapat diakses atau rusak.

  • Fase pertama inisialisasi kernel:

    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 berbeda dari proses pengguna, ini adalah proses asli dan memberikan izin tambahan. SMSS.exe bekerja dengan kernel yang melewati API Windows, ia menggunakan apa yang disebut API Asli . Windows API adalah pembungkus di sekitar Native API. SMSS.exe pertama-tama memulai subsistem Windows ( CSRSS.exe - Sub Sistem Waktu Proses Server Klien ) dan selesai menginisialisasi registri.



Proses dan utas SMSS.exe ditandai sebagai kritis, yang berarti jika mereka berhenti tiba-tiba, misalnya karena kesalahan, ini akan menyebabkan sistem crash. Untuk berkomunikasi dengan subsistem, misalnya, panggilan API membuat sesi baru, SMSS membuat port ALPC bernama SmApiPort... Variabel lingkungan dimuat dari registri, program seperti Check Disk (autochk.exe, program ini ditulis dalam registri HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ BootExecute ) diluncurkan . SMSS.exe diluncurkan untuk setiap sesi pengguna. Setiap sesi memiliki variabel globalnya sendiri (antrian pesan, misalnya) karena mekanisme memori virtual. Windows memiliki konteks utas, proses, dan sesi. Setiap SMSS.exe memulai contoh subsistemnya sendiri, saat ini hanya CSRSS.exe (Windows), di masa lalu, sistem operasi OS / 2 (os2ss.exe) dan POSIX (psxss.exe) didukung, tetapi gagasan ini tidak berhasil. SMSS.exe pertama masuk mode tidur menunggu proses WinInit.exe. Contoh lainnya malah membuat proses WinLogon yang menampilkan UI login.



WinInit.exe menginisialisasi subsistem untuk membuat shell grafis - Windows Station dan desktop , ini bukan desktop yang Anda lihat, ini adalah konsep Windows yang berbeda. Kemudian prosesnya dimulai:

  1. Services.exe - Services Control Manager (SCM) memulai layanan dan driver yang ditandai sebagai AutoStart. Layanan dimulai dalam proses svchost.exe . Ada utilitas bernama tlist.exe yang, ketika dijalankan dengan parameter tlist.exe -s , akan mencetak ke konsol nama layanan di masing-masing svchost.exe.
  2. LSASS.exe - Otoritas Sistem Lokal.
  3. LSM.exe - Manajer Sesi Lokal.


WinLogon.exe - Memuat penyedia kredensial , yang dapat berupa kata sandi, Smartcard, PIN, Hello Face. Itu memunculkan proses LogonUI.exe, yang menunjukkan antarmuka pengguna untuk otentikasi, dan kemudian memvalidasi data yang dimasukkan (login dan kata sandi, PIN).



Jika semuanya berjalan dengan baik, maka WinLogon memulai proses yang ditentukan dalam kunci registri HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit . Secara default, ini adalah proses UserInit.exe , yang:

  1. Menjalankan skrip yang ditentukan di registri:
    • HKCU \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts
    • HKLM \ SOFTWARE \ Policies \ Microsoft \ Windows \ System \ Scripts
  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 memberi tahu Penyedia Jaringan tentang pengguna yang masuk, yang memulihkan dan menyambungkan disk sistem dan printer yang disimpan di registri. Penyedia Jaringan adalah file mpr.dll dari folder sistem, yang dihosting oleh proses svchost.exe , mis. Layanan Windows.



Pohon proses terlihat seperti ini, di atasnya Anda dapat melihat siapa yang membuat siapa (tidak semua proses ditampilkan, mungkin sedikit berbeda dari versi Windows terbaru).





Dimana keyboard disini?



Selama startup, kernel Windows membaca informasi tentang pengontrol bus sistem dari registri, sebagai aturan, ini adalah bus PCI (lebih jarang MSI), pengontrol port I / O, termasuk USB, PS / 2, terhubung dengannya. Informasi tentang itu dicatat selama penginstalan Windows. Sistem memuat driver untuknya dan secara rekursif melewati semua port, juga memuat drivernya sendiri untuk masing-masing port. Driver dapat digabungkan menjadi node driver , misalnya driver keyboard akan dihubungkan ke driver port PS2. Tetapi port USB lebih rumit - pertama driver port, kemudian driver untuk bekerja dengan protokol HID, dan baru kemudian keyboard.



Setiap port dikendalikan oleh chipnya sendiri, yang memantau koneksi, menerima / mengirim sinyal antara CPU dan perangkat. Jika chipset South Bridge tidak dibangun ke dalam CPU, seperti yang sering dilakukan di laptop, tetapi ada sebagai chip terpisah pada motherboard, maka akan lebih tepat untuk mengatakan: sinyal antara South Bridge dan pengontrol port. Chip port kontrol memiliki jalur khusus dengan pengontrol interupsi (PIC atau APIC), yang melaluinya dapat meminta CPU untuk memperhatikan dirinya sendiri, misalnya, membaca data dari keyboard (port PS / 2, dengan USB, cerita lain). Karena OS telah memuat driver untuk port tersebut, ia dapat mengeluarkan perintah untuk itu, membaca dan mengirim data. Dalam contoh kami, driver dimuat dari C: \ Windows \ System32 \ i8042prt.sys . Mari kita ingat artikel sebelumnya . Di komputer lama dengan PIC pada sebuah chipIntel 8259 memiliki 15 garis interupsi, di mana keyboard dihubungkan ke pin IRQ1, pengatur waktu IRQ0, dan mouse ke IRQ12, yang sebenarnya merupakan kaki kelima dari chip 8259 kedua, yang melakukan multiplexing interupsi melalui pin IRQ2 pada pengontrol pertama. PIC modern dapat memiliki 255 pin untuk sinyal interupsi. Selama boot, OS memprogram APIC / PIC untuk mengembalikan angka tertentu ketika, katakanlah, interupsi datang dari keyboard atau port USB, dan dengan angka ini CPU menemukan fungsi yang akan dijalankan dalam tabel vektor interupsi . Nomor interupsi ditentukan oleh HAL dan Plug'n'Play Manager... Pengontrol interupsi mencari sinyal pada pinnya dalam urutan tertentu, misalnya, dalam loop tak terbatas, ia memeriksa tegangan pada pin dari 1 hingga MAX_PIN. Urutan ini menentukan prioritas, misalnya keyboard akan terlihat sebelum mouse, dan timer sebelum keyboard. Agar tidak bergantung pada kekhasan pekerjaan pengontrol interupsi, Windows mengabstraksi konsep IRQ (Permintaan Interupsi) di IRQL (Tingkat Permintaan Interupsi) . Jika pengontrol interupsi memiliki setidaknya 15 atau 255 baris, semuanya akan dipetakan ke 32 IRQL untuk x86 dan 15 IRQL untuk x64 dan IA64.
Apa yang dimaksud dengan prioritas IRQL:

  1. Tinggi - Saat sistem macet, biasanya panggilan ke fungsi KeBugCheckEx.
  2. Power Fail - tidak digunakan. Ini pada awalnya dirancang untuk 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.


Jika Anda selalu memprogram dalam mode pengguna, Anda belum pernah mendengar tentang IRQL, karena semua program pengguna dijalankan dengan prioritas Pasif / Rendah (0). Segera setelah suatu peristiwa terjadi dengan b tentang tingkat prioritas lshim (peristiwa keyboard, pengatur waktu penjadwal utas), prosesor menyimpan status utas terputus, yang merupakan nilai register CPU, dan memanggil interupsi dispatcher ( dispatcher interupsi , hanya fungsi), yang menaikkan prioritas IRQL melalui KeRaiseIrql API di HAL dan memanggil langsung rutin layanan interupsi itu sendiri . Setelah itu, CPU IRQL diturunkan ke level sebelumnya melalui fungsi KeLowerIrqldan utas yang terputus mulai memproses dari tempat yang sama tempat utas terputus. Penjadwal utas didasarkan pada mekanisme ini . Ini menetapkan pengatur waktu yang, pada interval tertentu (potongan waktu), menghasilkan interupsi dengan prioritas DPC / Dispatch (2) dan, dalam rutinitas layanan interupsi, menurut algoritme tertentu, menetapkan utas baru untuk eksekusi.



Mekanisme IRQL diimplementasikan di tingkat perangkat lunak di Lapisan Abstraksi Perangkat Keras ( HAL.dll ), bukan perangkat keras. Sistem Windows memiliki sopir bus), yang menentukan keberadaan perangkat yang terhubung ke bus - PCI, USB, dll. dan nomor interupsi yang dapat ditetapkan ke setiap perangkat. Sopir bus mengkomunikasikan informasi ini ke manajer Plug and play, yang sudah memutuskan nomor interupsi mana yang akan ditetapkan ke setiap perangkat. Selanjutnya, arbiter interupsi dalam PnP Mgr ( PnP interrupt arbiter ) membangun hubungan antara IRQ dan IRQL.



Saat interupsi keyboard tiba, utas apa pun yang sedang dijalankan (ini bisa jadi program Anda) ditugaskan untuk menanganinya. Dispatcher interupsi menaikkan prioritas CPU IRQL ke salah satu level Device1-DeviceN . Setelah itu, pengelola memori virtual tidak akan dapat menemukan halaman tersebut jika tidak dimuat ke dalam RAM (tidak akan dapat memproses Page Fault), penjadwal utas tidak akan dapat mengganggu eksekusi karena semuanya berjalan pada IRQL yang lebih rendah. Tugas utama driver keyboard saat ini adalah membaca data yang diterima dan menyimpannya untuk diproses lebih lanjut. Data ditulis ke objek jenis _DPC ( Panggilan Prosedur Ditunda ), yang disimpan ke daftar aliran DPC (seperti std :: list <DPC> , di kernel OS, alih-alih array, daftar tertaut digunakan). Segera setelah interupsi dari semua perangkat eksternal diproses, IRQL utas diturunkan ke level DPC tempat prosedur yang ditangguhkan (DPC) diproses. Kode penangan DPC keyboard memanggil fungsi dari driver keyboard Kbdclass.sys :



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


Jadi, driver keyboard (kbdclass.sys) menerima data dari port (USB, PS2) melalui interupsi dan menulisnya melalui WriteFile , sebuah komponen di dalam kernel Windows yang aktif, membacanya menggunakan API ReadFile dan menambahkan pesan dari keyboard ke antrean. File API dapat digunakan untuk membaca data dari driver. Mulai saat ini, pemrosesan data oleh tumpukan input Windows dimulai, lebih lanjut tentang ini di artikel berikutnya.



Jika Anda memiliki PC dengan port PS2 dan tahu cara menggunakan WinDbg dalam mode kernel, Anda dapat dengan mudah menemukan penangan interupsi keyboard dengan mengetik ! Idt , yang akan menampilkan seluruh tabel vektor interupsi.... Interupsi menjepit dirinya sendiri ke dalam jalannya program, kata vektor di sini berarti arah, arah pelaksanaan program. WinDbg dibuat khusus untuk debugging Windows, versi terbaru disebut WinDbgX. Ini memiliki antarmuka berbasis teks yang membuat takut orang yang terbiasa dengan Visual Studio, tetapi menyediakan lebih banyak opsi, khususnya, eksekusi skrip. Interupsi port PS2 ungu disorot dengan warna merah. Fungsi yang menanganinya disebut I8042KeyboardInterruptService , yang terletak di file 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.




Sekarang pertanyaannya muncul, dari mana pawang interupsi mendapatkan argumennya? Siapa yang menyebarkannya? Bagaimanapun, CPU tidak tahu apa-apa tentang itu. Jika Anda menempatkan di breakpoint nya, itu bahkan lebih terkejut melihat beberapa fitur yang lebih tinggi pada stack:



0: kd> kC

# Call Situs

! 00 i8042prt I8042KeyboardInterruptService

! 01 nt KiCallInterruptServiceRoutine

! 02 nt KiInterruptSubDispatch

! 03 nt KiInterruptDispatch

! 04 nt KiIdleLoop




Penjelasannya sederhana - itu adalah bukan fungsi yang disimpan dalam register IDT prosesor. Apa yang Anda lihat pada gambar di atas sebenarnya adalah objek bertipe _KINTERRUPT... Tabel interupsi berisi kode assembly khusus (nt! KiIdleLoop) yang mengetahui cara menemukan objek yang menjelaskan interupsi dalam memori. Apa yang menarik dari itu?

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


Segera setelah penangan interupsi keyboard dipanggil, ia akan memberi tahu driver keyboard tentang data yang diterima, setelah itu kernel OS akan diberi tahu, yang, setelah memproses data, akan mengirimkannya lebih jauh di sepanjang tumpukan masukan, di mana mereka dapat dikirim ke aplikasi yang akan menanggapinya, atau sebelum itu ke penangan bahasa (karakter Asia, koreksi otomatis, pelengkapan otomatis).

Kernel OS tidak secara langsung berinteraksi dengan driver keyboard; Plug'n'Play Manager digunakan untuk tujuan ini. Komponen ini menyediakan API IoRegisterPlugPlayNotification yang akan memanggil fungsi callback yang disediakan saat perangkat ditambahkan atau dihapus.



Beberapa kata tentang USB



Pengenalan dengan pengoperasian port USB akan membutuhkan artikel terpisah yang menjelaskan operasinya, ditambah penjelasan tentang pemrosesan data HID pada Windows. Ini akan memperumit banyak hal, dan sudah ada artikel bagus tentang topik tersebut, jadi PS2 adalah contoh sempurna karena kesederhanaannya.



USB dibuat sebagai port universal untuk semua perangkat, baik itu keyboard, kamera, pemindai, roda permainan dengan pedal, printer, dll. Selain itu, mendukung penyarangan port - motherboard USB => monitor dengan USB => keyboard dengan USB yang terhubung dengan mouse, flash drive dan hub USB yang menghubungkan hard drive. Melihat pin USB 2.0, Anda akan melihat bahwa pin tersebut tidak dirancang untuk mentransfer data tertentu, seperti PS2. Hanya ada empat dari mereka - pasangan bengkok untuk mentransmisikan bit data, plus dan minus daya.





Kabel USB 2.0



mengarah ke USB 3.0 lebih cepat dengan lima pin tambahan. Seperti yang Anda lihat, tidak ada baris CLOCK untuk sinkronisasi, sehingga logika transfer data lebih rumit. USB 2.0 kiri dan USB 3.0 kanan untuk perbandingan.

Semua data ditransmisikan melalui protokol HID (Human Interface Device) , yang menjelaskan format, urutan interaksi dan transfer data, dan lainnya. Standar USB 2.0 membutuhkan 650 halaman, dokumen Spesifikasi Kelas HID yang menjelaskan pengoperasian perangkat (mouse, keyboard, dll.) - 97 halaman, disarankan untuk mempelajarinya jika Anda bekerja dengan USB.



Pertama-tama, perangkat yang terhubung harus memberitahu tentang dirinya sendiri, untuk ini ia mengirimkan beberapa struktur data, yang menunjukkan ID perangkat dan ID pabrikan di mana manajer Plug'n'Play dapat menemukan informasi di registri, memuat dan menghubungkan driver. Perangkat USB bersifat pasif, mis. tuan rumah harus memeriksa keberadaan datanya sendiri pada interval tertentu. Tingkat polling dan ukuran paket data ditentukan di salah satu deskriptor perangkat USB. Ukuran paket maksimum adalah 64 byte, yang lebih dari cukup informasi tentang tombol yang ditekan.



Windows memiliki dukungan HID built-in, tidak sesederhana menghubungkan driver port PS2 ke driver keyboard karena driver HID harus dapat menangani semua skrip yang didukung oleh protokol. Terlepas dari penyedia data - port PS2, USB atau Remote Desktop atau mesin virtual - di bagian paling atas node driver akan ada Kbdclass, dari mana kernel OS akan menerima informasi. Pemberitahuan lampiran keyboard akan diproses melalui Plug'n'Play Manager , jadi tidak masalah bagi kernel Windows mana port atau sumber data perangkat yang digunakan.



Bagian 1 - Dasar OS dan Komputer

Bagian 2 - Bagaimana motherboard dan keyboard bekerja melalui port PS2



All Articles