Compilarea si Instalarea kernel-ului Windows

Echipa ItAssistant va ofera un tutorial la sfarsitul caruia veti putea intelege mai bine modelul de dezvoltare a Windows-ului si chiar veti putea compila singuri kernel-ul acestuia.

Introducere

In cadrul Windows Academic Program exista posibilitatea accesului la codul sursa a kernel-ului de Windows NT, prin intermediul initiativei Windows Research Kernel (WRK).

Codul sursa prezinta componentele cele mai importante din cadrul nuclelui (managementul memoriei, procese, thread-uri, scheduling, I/O manager) si poate fi folosit si modificat In scopuri non-comerciale. Se pot astfel urmari diversele mecanisme de implementare si design care stau la baza kernel-ului si se pot testa diverse alte solutii prin modificarea surselor. Accesul la sursele kernel-ului este limitat, anumite subdomenii (cum ar fi networking-ul) fiind absente.

Accesul la codul sursa pentru nucleul de Windows NT inseamna posibilitatea de modificare a acestuia si, evident, de compilare a kernel-ului si de boot-are.

Din pacate, kernel-ul de Windows nu vine cu optiuni de configurare, astfel incat procesul se rezuma la rularea comenzii de compilare si la instalarea noului kernel.

Daca se doreste un tip special de functionalitate vor trebui alterate sursele.

De asemenea, kernel-ul poate fi compilat numai pe un sistem Windows 2003 SP1 sau Windows XP x64. Versiunea curenta (WRK-1.2) nu poate fi compilata pe un sistem Windows XP x86.

Etapele de compilare sunt prezentate si In fisierul README.txt din radacina surselor.

Compilare kernel

Pentru compilarea surselor se parcurg urmatorii pasi (vom utiliza de acum inainte %wrk% ca radacina surselor de kernel de Windows):

C:\>set wrk=C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2
C:\>set arch=x86
C:\>set path=%wrk%\tools\%arch%;%path%
C:\>cd %wrk%\base
C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2\base>cd ntos
C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2\base\ntos>nmake -nologo %arch%=

Imaginea de kernel obtinuta se va regasi in %wrk%basentosBUILDEXE si va purta numele wrkx86.exe pentru un sistem cu arhitectura x86. Imaginea obtinuta este doar nucleul; modulele de kernel folosite vor fi cele existente in sistem in acel moment.

Instalare kernel

Procesul de instalare presupune copierea imaginii kernel-ului in %SystemRoot%system32:

C:\>copy %wrk%\base\ntos\BUILD\EXE\wrkx86.exe %SystemRoot%\system32\

Totusi, in afara imaginii de kernel, va trebui precizata imaginea de HAL (Hardware Abstraction Layer) care va fi utilizata.

Va trebui gasita imaginea corecta de HAL; exista trei imagini de HAL disponibile in %wrk%WS03SP1HALSx86. Pentru a afla care imagine este cea corecta va trebui utilizat linker-ul (folosind comanda link si analizata imaginea de HAL existenta In acest moment In sistem).

C:\>"C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
Setting environment for using Microsoft Visual Studio 2005 x86 tools.
C:\>link -dump -all %SystemRoot%\system32\hal.dll | findstr pdb
  80011530: 68 61 6C 2E 70 64 62 00 00 00 00 00 00 00 00 00  hal.pdb.........
    42435B3A cv           20 00001518      918    Format: RSDS, {2ECB059A-3F06-4
285-8E30-3FDE64119692}, 1, hal.pdb

Asocierea dintre iesirea comenzii de mai sus si imaginile disponibile in %wrk%WS03SP1HALSx86 este (dupa cum este precizat si In README.txt):

    halacpi.dll  -> halacpim.dll
    halaacpi.dll -> halmacpi.dll
    halapic.dll  -> halmps.dll

De obicei, imaginea cautata va fi halmacpi.dll.

Imaginea corecta de HAL va fi copiata tot in %SystemRoot%system32:

C:\>copy %wrk%\WS03SP1HALS\x86\halmacpi\halmacpi.dll %SystemRoot%\System32\

Configurare boot.ini

Pentru a boota proaspatul kernel va trebui adaugata o intrare in C:boot.ini, fisierul de configurare pentru loader-ul de Windows NT.

Se recomanda copierea unei linii de bootare existente si modificarea ei pentru a boota noul kernel si noua imagine de HAL, ca mai jos:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard"
/fastdetect /NoExecute=OptOut
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard - WRK-1.2
compiled kernel" /kernel=wrkx86.exe /hal=halmacpi.dll /fastdetect /NoExecute=OptOut

Pentru vizualizarea boot.ini In Windows Explorer, va trebui sa accesati Tools -> Folder Options -> View -> Hide protected operating system files (Recommended). Fisierul este implicit read-only; pentru editare va trebui sa anulati aceasta optiune.

Alternativ puteti face acest lucru din linia de comanda:

C:\>attrib -h -s -r boot.ini

Dupa configurarea boot.ini, sistemul poate boota in noul kernel compilat.

Windows Research Kernel (WRK)

Windows Research Kernel (WRK) este parte a Windows Academic Program si ofera accesul la codul sursa pentru kernel-ul de Windows in medii academice. Din aceeasi initiativa Microsoft mai fac parte si Windows OS Internals Curriculum Resource Kit si Project Oz.

WRK contine partile importante din nucleul pentru Windows XP x64 si Windows 2003 SP1 impreuna cu utilitare necesare pentru compilarea si testarea unor versiuni proprii de nucleu. Sursele incluse se refera la subsisteme precum procese, thread-uri, planificator, I/O manager, memorie virtuala.

Sursele si utilitare pot fi folosite numai in scopuri non-comerciale conform licentei.

In acest moment, sursele nucleului pus la dispozitie pot fi compilate si testare numai pe sisteme cu Windows 2003 x86/x64 sau Windows XP x64.

LiveKd (Windows)

Asemanator cu gdb, pe Windows exista posibilitatea analizei dinamice a kernel-ului folosind Live Kernel DebuggerLiveKd. Pachetul este oferit de SysInternals.

Pentru lucrul cu acesta aveti nevoie de pachetul Debugging Tools de la Microsoft. Acesta contine debugger-e peste care lucreaza livekd, cum ar fi kd sau WinDbg. Aceste debugger-e sunt, de obicei, folosite in cadrul unui sistem de doua calculatoare legate printr-un cablu serial: un calculator pe care se face debug iar altul care realizeaza debug-ul. LiveKd permite inspectia kernel-ului In timp ce acesta ruleaza.

LiveKd foloseste ca backend kd, WinDbg sau Dumpchk (kd este implicit). Inainte de pornire, Live Kd va inspecta configuratia curenta pentru a detecta prezenta simbolurilor de debug ale sistemului de operare; daca acestea nu sunt prezente se va cere sa fie descarcate.

Deosebirea intre kd si WinDbg este aceea ca WinDbg permite configurare prin interfata grafica; setul de comenzi de depanare este, insa, apropiat.

Un exemplu de sesiune LiveKd este prezentata mai jos:

C:\Documents and Settings\Administrator>livekd
LiveKd v3.0 - Execute i386kd/windbg/dumpchk on a live system
Sysinternals - www.sysinternals.com
Copyright (C) 2000-2005 Mark Russinovich
 
Launching C:\program files\Debugging Tools for Windows\kd.exe:
...
kd> dd nt!ExAllocatePool
80809627  8b55ff8b 6f4e68ec 75ff656e 0875ff0c
80809637  08be3ee8 08c25d00 50535300 01f08fe8
80809647  5a09e900 c0330000 0059b8e9 90909000
80809657  ffffff90 94d861ff 94d87480 90909080
80809667  ffffff90 96410cff 96411f80 90909080
80809677  ffffff90 96427cff 96429280 90909080
80809687  ffffff90 9642d9ff 9642ec80 90909080
80809697  ff8b9090 80ec8b55 89f7cc3d 840f0080
kd> u nt!ExAllocatePool
nt!ExAllocatePool:
80809627 8bff            mov     edi,edi
80809629 55              push    ebp
8080962a 8bec            mov     ebp,esp
8080962c 684e6f6e65      push    656E6F4Eh
80809631 ff750c          push    dword ptr [ebp+0Ch]
80809634 ff7508          push    dword ptr [ebp+8]
80809637 e83ebe0800      call    nt!ExAllocatePoolWithTag (8089547a)
8080963c 5d              pop     ebp
kd> dd nt!KiTimerExpireDpc
808a81c0  00200113 00000000 00000000 8081fc62
808a81d0  00000000 00000000 00000000 00000000
808a81e0  808a81e0 808a81e0 00000000 00000000
808a81f0  808a81f0 808a81f0 00000000 00000000
808a8200  00000000 00000000 808a8208 808a8208
808a8210  817a62c0 00000000 00000000 00000000
808a8220  00040001 00000000 817a6368 817a6368
808a8230  00000000 00000000 00000000 00000000
kd> dt nt!_KDPC
 
   +0x000 Type             : UChar
   +0x001 Importance       : UChar
   +0x002 Number           : UChar
   +0x003 Expedite         : UChar
   +0x004 DpcListEntry     : _LIST_ENTRY
   +0x00c DeferredRoutine  : Ptr32
   +0x010 DeferredContext  : Ptr32 Void
   +0x014 SystemArgument1  : Ptr32 Void
   +0x018 SystemArgument2  : Ptr32 Void
   +0x01c DpcData          : Ptr32 Void
kd> dt nt!_KDPC 808a81c0
 
   +0x000 Type             : 0x13 ''
   +0x001 Importance       : 0x1 ''
   +0x002 Number           : 0x20 ' '
   +0x003 Expedite         : 0 ''
   +0x004 DpcListEntry     : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x00c DeferredRoutine  : 0x8081fc62     nt!KiTimerExpiration+0
   +0x010 DeferredContext  : (null)
   +0x014 SystemArgument1  : (null)
   +0x018 SystemArgument2  : (null)
   +0x01c DpcData          : (null)
kd> dd nt!KiTimerExpiration
8081fc62  8b55ff8b 94ec81ec fa000000 18a100eb
8081fc72  8bffdf00 df00140d 1c053bff 89ffdf00
8081fc82  4d89e445 07850fe0 a10000c7 ffdf000c
8081fc92  00080d8b 053bffdf ffdf0010 89ec4589
8081fca2  850fe84d 0000c6f1 e7fc0d8b 8bfb8089
8081fcb2  d18b1045 fa81d02b 00000200 5a3d830f
8081fcc2  65830003 565300f4 01ffe181 8d570000
8081fcd2  4d89ff70 f845c7cc 00000018 04fc45c7
kd> u nt!KiTimerExpiration
nt!KiTimerExpiration:
8081fc62 8bff            mov     edi,edi
8081fc64 55              push    ebp
8081fc65 8bec            mov     ebp,esp
8081fc67 81ec94000000    sub     esp,94h
8081fc6d fa              cli
8081fc6e eb00            jmp     nt!KiTimerExpiration+0x10 (8081fc70)
8081fc70 a11800dfff      mov     eax,dword ptr ds:[FFDF0018h]
8081fc75 8b0d1400dfff    mov     ecx,dword ptr ds:[0FFDF0014h]
kd> q
quit:
Execute Kd again? (y/n) n
Exiting LiveKd.
C:\Documents and Settings\Administrator>

Comenzile utilizate in cadrul acestei sesiuni de debug sunt:

  • dt (dump using type information) – permite analiza tipurilor de date din sistem (cum este spre exemplu KDPC)
  • dd (dump memory) – permite analiza diverselor variabile, precizând continutul unei anumite locatii de memorie; poate primi ca parametru o adresa sau un simbol (asemanator cu comanda x de la gdb)
  • u (unassemble) – permite dezasamblarea codului unei functii

Un simbol poate fi parte a unui domeniu. Simbolurile de kernel sunt precedate de nt! pentru a se specifica faptul ca sunt simboluri de kernel.

Informatii complete despre functionarea depanatorului si comenzile utilizate gasiti In documentatia asociata (Debugging Help.chm).

Integrare LiveKd In WinDbg

Una dintre cele mai usoare forme de utilizare a LiveKd este prin intermediul WinDbg, care ofera interfata grafica pentru depanarea nucleului Windows.

Folosirea LiveKd In WinDbg Inseamna activarea optiunii Local Debugging. Pentru aceasta se acceseaza secventa de meniuri: File -> Kernel Debug (CTRL+K) -> Local.

Documentatie

Dezvoltarea kernel-ului are un grad sporit de dificultate raportat la programarea din user space. API-ul diferit, necesitatea cunoasterii amanuntite a sistemului pe care se lucreaza si a structurii kernel-ului necesita o etapa de pregatire suplimentara. Documentatia asociata este destul de eterogena, fiind nevoie de inspectia mai multor surse pentru a avea o intelegere completa a unui aspect.

Documentatie Windows

Documentatia principala de Windows este cea care vine cu Windows DDK (Driver Development Kit). Alternativ ea poate fi accesata de pe site-ul Microsoft. Informatii si utilitare se pot regasi si la SysInternals, site creat de Mark Russinovich (unul din autorii Inside Windows, 4th Edition) sau la Code Project. Desi cu mai putine resurse de documentatie decat kernel-ul Linux, Internet-ul ofera multe informatii.

In mod evident, nu trebuie ignorat accesul la codul sursa, care poate oferi informatii acolo unde documentatia nu este suficienta.

Sursa tutorial: http://elf.cs.pub.ro/so2/wiki/

Related posts:

  1. Compilarea si Instalarea kernel-ului Linux
  2. Prezentare RSS Gadget din Windows 7/Vista
  3. WinToFlash – Cum instalezi Windows de pe USB
  4. Instalare Microsoft Windows 8 Developer Preview
  5. Cum se instaleaza corect Windows XP – Partea I
Tags: , , , , , , ,

V-a placut acest tutorial? Aveti anumite sugestii pentru urmatoarele tutoriale video? Lasati un comentariu! Feedback-ul vostru este foarte important pentru noi.

Pentru intrebari mai elaborate, cu caracter general, va rugam folositi forumul si in cel mai scurt timp veti primi un raspuns. Astfel ii vom ajuta si pe ceilalti sa invete din eventualele probleme.

3 comentarii la “Compilarea si Instalarea kernel-ului Windows”

  1. Alex says:

    Marfӑ tutorial!!!

  2. silviu says:

    Foarte interesant… Astazi am invatat ceva nou :)

  3. Ionut
    says:

    Ma bucur ca v-a fost de folos :)