Hi!
Nehany egyszeru kerdes a kernel driver szagertokhoz:
Olvasom, hogy az MmAllocateContiguousMemory XP alatt 1G feletti mennyisegu
memoriat is le tud foglalni, persze ha van eleg fizikai memoria a gepben.
Tegyuk fel, hogy van.
Ha ez a fuggveny sikeresen elvegzi a foglalast, egyuttal be is mappeli
azt a kerneles virtualis cimtartomanyba.
1. Hogy lehetseges ez, hiszen az egesz kernel cimtartomany 2G, vagy
valamelyik windoz alatt mindossze 1G?
A kovetkezoket irjak meg: nem valami jo megoldas ez a fuggveny, mert lehet
hogy olyan cimet kapunk, amit a hardver nem tud kezelni, pl 4G feletti
teruletet egy PCI kartyanak.
2. Ez miert problema, hiszen a parameterekben meg lehet adni a legmagasabb
fizikai cimet amit a hardver kezelni tud?
3. Mashol azt irjak, hogy ez a fuggveny long-term _internal_ buffer
foglalasara alkalmas. Ez nem azt jelenti, hogy a hardver szamara nem
feltetlenul elerheto? Vagy csak hibas fogalmazas a DDK-ban?
4. Hogy lehet, hogy ez a fuggveny lazan lefoglal 1G-t, ugyanakkor a hozza
hasonlo funkcionalitasu AllocateCommonBuffer doksiban mindig felhivjak
a figyelmet arra, hogy rettento takarekosan kell banni vele, mert
kulonben elfogynak a map registerek, es akkor hetbaj lesz.
5. Ugyanez a kerdes vonatkozik arra is, ha az user progi lefoglal 1G
memoriat, azt METHOD_IN_DIRECT io-val atadja a drivernek. Az IOmanager
meghivja ra az MmProbeAndLockPages fuggvenyt, a driver pedig utana az
MmGetSystemAddressForMdlSafe-t. Ugyanaz tortenik mint fent, csak az
le tud foglalni 1G-t, raadasul fizikailag folytonos memoriat(!), ez
meg nem folytonosat csinal, es be is xarhat barmely fazisban. Miert?
6. Mik azok a map regiszterek es hany van beloluk?
Valami olyasmit sejtek, hogy az user modu virtualis cimeket PTE/TLB
bejegyzesekben tarolja a win, a kernel modu mappeleseket ezekkel a
regiszterekkel oldja meg, hogy takarekoskodjon az adminisztracios
terulettel, vagy mittomen.
7. Mi tortenik, ha az user progi akkora memoriat szeretne atadni direct
IO-val, amennyi fizikai lapot nem tud csinalni az MmProbeAndLockPages?
Hol fog keletkezni es milyen hiba? Ugyanis ilyenkor az Irp ha jol
sejtem, el sem fog jutni a driverig feldolgozasra, mert a buffert nem
lehet memoriaba lockolni.
8. Mi van, ha a buffert sikeresen lelockolta az iomanager, de bemappelni
(pl map regiszterek vagy virtualis cimtartomany hianyaban) nem
lehetseges? Van-e valami lehetoseg ilyenkor arra, hogy az Mdl-lel leirt
buffer egyben maradjon, de mindig csak egy kis resze mappelodjon be a
kernel cimtartomanyba, amin eppen dolgozik a driver? Pl 1 lap is eleg.
9. A fentiek alapjan melyik a javasolt modszer 1G koruli DMA buffer
megvalositasara? Egy PCI kartya dolgozik benne, tud egy scatter DMA
hangulatu sajat megoldast, viszont csak 32 bites cimzest tud, tehat
csak az also 4G fizikai memoriat tudja elerni.
Jelenleg commonbuffer DMA-val mukodik a rendszer jol, csak tovabb kene
lepni az 1G hatar fele :)
Nem tudom hogy melyik modszernek pontosan mik a hatarai, illetve az
MmAllocateContiguousMemory-rol irjak, hogy tud 1G-t XP alatt, de erre
a tovabbi win verziokban ne szamitsunk :( A tobbirol semmi info sehol.
Jelenleg nem is tudom kiprobalni, mert meg nincs meg a masfel G a
tesztgepben, allitolag nemsokara erkezik, de utana is rengeteg ido
lenne mindent vegigprobalni. Hatha tudja valaki konkretan...
10. Es vegul: hogy lehet azt megcsinalni, hogy elkuldok egy ioctl-t,
de ne kelljen megvarni hogy a driver kesz legyen vele. Kozben tudjak
tovabbi parancsokat kuldeni a drivernek, es egy ilyen tovabbi parancs
hatasara vegezzen az elso parancssal?
Koszi!
--
Valenta Ferenc <vf at elte.hu> Visit me at http://ludens.elte.h u/~vf/
"Egyetlen teny romba donthet egy faradsagosan felepitett ervrendszert"
|