Hali Ferenc,
>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?
Sajnos win kernelt meg nem irtam (de oszinte reszvetem hozza :), de
hatha megvalosithato.
A sokat gorcsolo win fuggvenyek tobbsege elerheto overlapped modban
is, ahol csak egy eventre kell varni, amit a win lekezel, csak az
event ket veget kell megirnod. Es azok a fuggvenyek visszaternek dolguk
vegezte nelkul is. Gondolom egy szalat inditanak. De ez csak tipp.
Masik 5let: a driver betoltesekor elinditassz egy thread-ot,
amint sikerult letrehoznod egy pipe-t. A szalban figyeled a pipe-n az
uzenetek erkezeset (SleepEx, suspend mode = true), es ha jon uzeneted
felebred a threadod igy elerheted a sajat level=0 memoriateruletet.
(vagy mittomen melyik szinten fut) Es, mint a jo oreg DOS-ban korforgo
buffer, aminek van irasi es olvasasi cime. Ellenorizheted igy mindket
reszrol, hogy van-e parancs, stb. De ha torolni is akarsz parancsot a
lockkal bajban leszel, egyebkent nem kell sztem.
Persze csak akkor ha ezen a szinten ezek engedelyezve vannak ezek a
fuggvenyek...
Ajanlom tanulmanyozasra a virusokat. :) Nagyon talalekonyak ha kernelt
kell felulirni :D
Jo szorakozast !
Gusi
|
Szia,
Elekron is olvastam a kerdesedet.
Probalok valaszolni, ahogy en gondolom az egeszet.
> 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.
Igen, de csak a kezdo bazis virtualis cimet, es nem blokkos, tordelt a
memoria, folyamatos.
Meg nem hasznaltam, nem javasolja a ddk, mert egy ido utan fregmentalt
lesz a memoria, ezt irja a DDK.
>
> 1. Hogy lehetseges ez, hiszen az egesz kernel cimtartomany 2G, vagy
> valamelyik windoz alatt mindossze 1G?
Ezt nem tudom, nekem win2000-es ddk-am van, 2000 alatt szoktam dolgozni,
abban ilyet nem ir, nincs benne limit, vagy meg nem talaltam meg...
>
> 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?
A fg.-ben lehet, a hardverben nem biztos, ez a IC gyarto cegtol fugg, a
PCI IC-ben van egy 0-256 cimu terulet, ahova be kell irni a kezdo
cimeket, a felhasznalando lokalis mem nagysagot, PCI interface speckokat.
>
> 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?
Lehet, azt irja hogy a DriverEntry hasznalja, pl. cash-re.
>
> 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.
Gondolom ez egy olyan fg. amit nem illik hasznalni, max. rovid tavra,
pl. cache-re, mert pl. nincs korlatozva a mem foglalas.
>
> 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?
Ez folytonosat csinal, es inkabb cache-nek.
A useres mem belekerul az MDL-be, ez meg nem, tehat az a rendszerbe be
lesz illesztve, a masik nem nagyon, mert inkabb cashe-nek kell, mint mar
irtam
>
> 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.
Win 2000 DDK-ban 3.3.1.
A map regiszter kell a logikai cimhez, ami a hardverhez van kapcsolva,
az MDL kell a virtual cimhez, ami a deriverekhez van kotve.
> 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.
Szerintem a visszaadott erteked hibas lesz pl. NULL, es elszallsz.
>
> 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?
Dispatch fg.-nek elkuldod az elsot, az beallit egy flagat es kesz, ha
jon a masik akkor csinal valamit, akkor kuld vissza adatokat, vagy
valamit nem ertek...
>
> Koszi!
--
Tiszai Istvan
http://www.tiszaii.tk
|
Sziasztok!
Segitseget kerek! Soros port allapotat szeretnem
lekerdezni es ra adatot kitenni, de nem a soros
port kommunikacios szabvanya szerint, hanem a
csatlakozo ( 9 polusu ) tuskeire. Ha lehet ilyet
egyaltalan? :) ?
A lenyeg, hogy van egy eszkozom (pl nyomtato)
ami a soros porton kommunikal a geppel.
Hiperterminallal le mentettem az adatokat
kommunikacio kozben), masik geprol atkuldtem
az eredetire (ahol az eszkoz volt), de a driver
nem ismeri fel!!!
Ha az eszkoz a portot nem szabvanyosan
hasznalja, akkor van-e ra megoldas, hogy
valahogyan (lehetoleg programmal) leszedjem az
adatokat a csatlakozo labairol?
Tehat az a lenyeg, hogy egy sz.gepet kotnek
az eszkoz es a sajat gepem koze, igy szeretnem
a be- es ki-meno adatokat kezelni, lementeni.
Talan nem is szabvanyos lesz a kommunikacio,
nem baj. Majd utolag atnezem, hogy mik voltak
az adatok, es szabvanyos volt-e.
Ha esetleg valaki tud program reszletet is
kuldeni, koszonom. A Turbo Pascalt ismerem,
de ha mas programban van az sem gond, majd
kibogaraszom a lenyeget.
A segitseget elore is koszonom: Roka!
(webes bekuldes, a bekuldo gepe: 193.158.111.83)
|