» »

[C#.net] kako vnesti vrednost direktno v pomnilnik?

[C#.net] kako vnesti vrednost direktno v pomnilnik?

Reliant2 ::

kako bi lahko vnesel vrednost direktno v pomnilnik?.. verjetno z kakšno ams komando? najboljše bi bil kakšen link.. se ne branim tudi drugih komand s katerimi vnašam/berem pomnilniška mesta

BlueRunner ::

Kaj točno bi želel narediti? Direktno dostopati do pomnilnika nekega objekta ali niza? Ali pa bi morda rad dostopal do nekega absolutnega naslova, ker se bi rad pogovarjal z določeno strojno opremo, ki ima na ta naslov preslikane svoje registre/pomnilnik?

Andruxa ::

C# pociva na .NET frameworku, ki skrbi za memory managment. To pomeni da se lokacija podatkov programa napisanega v C# spreminja v casu
delovanja programa.

Ti pa bi verjetno rad nekaj podobnega kar se da v c-ju s pointerji naredit. Zaradi razloga ki sem ga navedel je to v C# nezazeleno.
Vseeno pa ce zelis lahko pointerje forsiras z "unsafe" ( pogooglaj ), vendar ti ze sam izraz pove da to ni zazeleno.
To pac uporabis ce res moras, naprimer ce ze imas nekaj kode napisane v c-ju, pa se ti ne da prepisovat ....
Lp, A

Reliant2 ::

do direktnega naslova, če je to z c#.net sploh možno

jype ::

Ni možno, ker bi s tem komot sesu ne le aplikacijo, ampak kar cel OS.

Ta privilegij naj bi v sodobnih operacijskih sistemih imeli zgolj gonilniki za strojno opremo, lahko pa napišeš tak gonilnik in potem iz .net kličeš njega.

BlueRunner ::

jype je pravilno povedal... tvoja težava ni povezana z C# jezikom, temveč z dejstvom, da VSI resni (MacOS 9 in starejši so bili edina izjema) večopravilni operacijski sistemi uporabniškim aplikacijam niti pod razno ne dopuščajo direktnega dostopa do strojne opreme. Na veliko procesorskih platformah gre to tako daleč, da nimaš direktnega dostopa do ničesar, saj je tudi pomnilniške lokacije, kot jih vidi tvoja aplikacija, samo preko deskriptorjev virtualnega pomnilnika preslikane v tvoj naslovni prostor.

Če želiš narediti to, kar pač želiš, potem moraš najprej narediti gonilnik za dotično strojno opremo, v gonilniku pa narediš tudi API, preko katerega lahko potem uporabniški programi komunicirajo z njim. Pod okni je to navadno "dvoslojna" rešitev, saj imaš najprej gonilnik, ki komunicira direktno s strojno opremo, potem imaš sistemski servis, ki sme komunicirati z gonilnikom, šele nato pa imaš uporabniške aplikacije, ki lahko komunicirajo s sistemskim servisom.

Matako ::

Točno tako. Tukaj sta v bistvu dva trika, ki sta izvedena s pomočjo procesorjeve VMM (Virtual Memory Management) enote...

1. Naslovi so za uporabniške procese preslikani (t.i. paging)

Konkretno za Windows NT do XP je to spodnjih 2 GB. Gre za t.i. "userland" pomnilnik in je preslikan za vsak uporabniški proces posebej.Po domače to pomeni, da ima vsak up. proces "svojih" 2GB in lahko naslavja pomnilnik od 0...0x7fffffff (oz. do neke zgornje meje) brez skrbi, da bi motil kak drug proces. Vendar to niso naslovi fizičnega pomnilnika, mogoče strani, ki jo naslavlja v fizičnem pomnilniku sploh ni!

Zgornjih 2GB je za vse procese isti vendar dostopnih samo v nadzornem načinu procesorja in so rezervirani za kernel. Kolikor vem gre tukaj direktno preslikavo v fizični pomnilnik (kao naj bi bila kernel koda vsa v fizičnem pomnilniku, saj kak sklad pa skoraj sigurno? Kdorkoli? Info?) Trik je v tem, da se na ta način lahko preklopi iz up. načina v nadzorni z minimalno overheada. Kakorkoli.. to nas pripelje do drugega trika:

2. Dostop do VM je zaščiten po straneh. kadar proces naslovi pomnilnik, ki je v VM strani, ki mu ni bila dodeljena se sproži "page fault" past (napaka strani) in OS ti pokaže lepo poslovilno okence ter ubije proces. Itak, da dostop do pomnilnika rezerveranega za kernel takoj sproži to "past".

Tu je v bistvu še 3. trik, ki je najpomembnejši od vseh. VMM lahko sproži prekinitve, kadar se naslavja VM naslov, ki se ga ne da preslikati v fizični pomnilnik - na ta način lahko OS naloži stran z diska (pagefile).


Skratka - direkten dostop do pomnilnika ni možen iz up. procesov. Če želiš početi kaj takega, moraš napisati gonilnik, ki se naloži v kernel in potem lahko tam dela vse mogoče (vključno sesuje sitem).

Mislim, da je v drugih OS npr Linux in na drugih arhitekturah zelo podobno ...
/\/\.K.

Zgodovina sprememb…

  • spremenil: Matako ()

Shinobi ::

Mater kak ste zakomplicirali zadevo.
Fant bi pomoje samo rad odprl datoteko v pomnilnik in namesto v fajl dostopal v array.
Naredi si array of char pa cel fajl not preberi pa je stvar resena.

Matako ::

Kaj pa vem Shinobi... meni se še vedno zdi, da je hotel Reliant2 vpisat X na naslov Y v RAMu. Obstaja naravni zakon, po katerem vsakdo, ki ga zanima programiranje svojega stroja pride do trenutka, ko bi rad to naredil - kar je dobro. Svoje čase je to na domačih mikrih šlo neznosno lahko, zdaj pa so se stvari na najpogostejših OS resno... zakomplicirale. Prav nič ne škodi, če ve kako stvari delujejo pod havbo - pride slej ko prej prav (po zakonu o "uporabnosti neuporabnega znanja").

No, nisem pa prepričan, da je hotel to. Pa saj bo Reliant2 sam povedal - mogoče pa je res hotel izvesti kaj drugega.
/\/\.K.

Zgodovina sprememb…

  • spremenil: Matako ()

Reliant2 ::

Matako ve točno kaj sem mislil..


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Nvidia ukinja podporo za 32-bitne operacijske sisteme

Oddelek: Novice / Grafične kartice
155859 (3778) Truga
»

Zakaj imam samo 3GB namesto 4GB rama? (strani: 1 2 )

Oddelek: Operacijski sistemi
8920366 (10451) bobi1992
»

Navidezni pomnilnik

Oddelek: Šola
133413 (3013) B & O
»

Vista in 2GB po aplikaciji

Oddelek: Operacijski sistemi
191961 (1671) r0b3rt
»

Pomnilnik v Windows: 1. del (strani: 1 2 )

Oddelek: Novice / Operacijski sistemi
509788 (7372) Jst

Več podobnih tem