Organizarea RAM-ului
#1
Publicat: 03 noiembrie 2008 - 16:50
De mai multe ori m-am lovit peste tot felul de necazuri, cand am ajuns sa studiez memoria calculatorului. Am crezut ca nu o sa fie greu sa stapanesc niste notiuni noi, insa dupa mai multe surprize, am ajuns sa nu mai inteleg nimic :deadtongue: . Inainte sa postez, am mai citit cateva topic-uri "din zona" si nu am gasit dublura la subiectul asta.
Vreau sa invat TOT despre RAM, si ca sa stiti cam pe unde sunt, am sa va prezint ce stiu in momentul de fata: - Fiecare octet din RAM are o adresa unica. - Daca avem o informatie pe 4 octeti (spre exemplu 0x12345678), in RAM, se vor memora octetii in ordinea 78|56|34|12, unde adresa creste de la stanga la dreapta. - Initial, calculatoarele puteau memora adrese de memorie pe 16 biti, permitandu-le sa identifice orice octet din primii 64Kb de memorie. - Windows-ul suporta adrese de memorie de pana la 32 de biti, accesand pana la 4Gb de memorie continua. - Aici e o problema :deadtongue: : cand cei 64 Kb nu au mai fost suficienti, s-a implementat segmentarea (cosmarul meu), care marea limita de memorie pana la 1Mb. Am mai intalnit la unele probleme de programare: "Limita de memorie 16 Mb". :cursing: - Aici apare inca o problema: compilatoarele au optiunea de utiliza un anumit model de memorie (tiny, small, huge.. etc). Am gasit intr-o carte o explicatie a lor, din care nu am inteles chiar nimic :deadtongue: . Am motive sa cred ca are legatura cu segmentarea asta afurisita. - Stiu ce presupune normalizarea pointerilor. Ramane doar sa inteleg cum se lucreaza cu memoria din ASM. Va rog sa imi raspundeti fie cu explicatii, fie cu link-uri. Am citi si eu de pe net ce am gasit, dar nu era suficient. |
#3
Publicat: 03 noiembrie 2008 - 16:58
Citat Teoria aia era valabila sub MS-DOS... Acum avem sisteme pe 32 sau 64 biti cu model de memorie total diferit si extrem de simplu... Asa ca nu stiu de ce iti mai bati capul... Editat de chri5ty, 03 noiembrie 2008 - 16:59. |
#5
Publicat: 03 noiembrie 2008 - 21:38
chri5ty, pe Nov 3 2008, 16:50, a scris: cand cei 64 Kb nu au mai fost suficienti, s-a implementat segmentarea (cosmarul meu), care marea limita de memorie pana la 1Mb. chri5ty, pe Nov 3 2008, 16:58, a scris: pentru ca lucrez probleme pt concursuri / olimpiade, si alea folosesc astfel de sisteme. |
#8
Publicat: 03 noiembrie 2008 - 22:12
Din cate tin minte, explicatia pentru care procesoarele 8086 si 8088 aveau 20 (16+4) de linii de adresare si nu 32 sau alta valoare mai mare a fost pentru ca la vremea respectiva (in jurul lui 1980) s-a considerat ca e arhisuficient pentru un program sa poata adresa 2^20 bytes (deci 1 MB)..
Pare o valoare mica, da sa nu uitam ca pe un PC la vremea respectiva rula un sistem de operare mono-tasking, ce rula in mod normal o singura aplicatie (in afara sistemului de oparare), in mod text-only, de obicei black&white pe un ecran cu rezolutia de 25x40 (caractere), sistemul de oparare si programul erau incarcate de obicei de pe o caseta sau floppy, nu de pe un HDD - astfel ca un program care sa ceara mai mult de 640 KB trebuia s afaca ceva cu totul special.. Editat de tudor_turcu, 03 noiembrie 2008 - 22:29. |
#10
Publicat: 03 noiembrie 2008 - 22:35
Citește și tu aici: http://webster.cs.uc...ganization.html și pe wikipedia. Sunt atâtea articole care explică bine încât e greu de imaginat ca cineva de aici să stea să-ți explice mai pe îndelete.
|
|
#11
Publicat: 04 noiembrie 2008 - 00:37
Deci sistemele de adresare pe 20, repsectiv 24 de biti s-au introdus pe rand, cum au aparut noi arhitecturi de procesoare?
80386 e modelul folosit azi, cu adresare pe 32 de biti? Metoda de adresare depinde strict de arhitectura procesorului, sau trebuie initializata reprezentarea cea mai potrivita la incarcarea sistemului, prin 2-3 instructiuni? Citat Din cate tin minte, explicatia pentru care procesoarele 8086 si 8088 aveau 20 (16+4) de linii de adresare si nu 32 sau alta valoare mai mare a fost pentru ca la vremea respectiva (in jurul lui 1980) s-a considerat ca e arhisuficient pentru un program sa poata adresa 2^20 bytes (deci 1 MB).. |
#12
Publicat: 04 noiembrie 2008 - 07:46
chri5ty, pe Nov 4 2008, 00:37, a scris: 80386 e modelul folosit azi, cu adresare pe 32 de biti? chri5ty, pe Nov 4 2008, 00:37, a scris: Metoda de adresare depinde strict de arhitectura procesorului, sau trebuie initializata reprezentarea cea mai potrivita la incarcarea sistemului, prin 2-3 instructiuni? Faptul ca s-a marit linia de adresare nu inseamna ca s-a pastrat modelul segment:offset (atentie)... Editat de neagu_laurentiu, 04 noiembrie 2008 - 07:47. |
#13
Publicat: 05 noiembrie 2008 - 17:19
<<Deci sistemele de adresare pe 20, repsectiv 24 de biti s-au introdus pe rand, cum au aparut noi arhitecturi de procesoare?
80386 e modelul folosit azi, cu adresare pe 32 de biti? Metoda de adresare depinde strict de arhitectura procesorului, sau trebuie initializata reprezentarea cea mai potrivita la incarcarea sistemului, prin 2-3 instructiuni?>> Am sa explic cateva lucruri simple: Celula elemetara este un bistabil: http://www.hobbyproj...s/bistable.html cam ca aici, bine ca se foloseste MOS nu bipolar si nici exemplul nu este prea bine alea, pentru ca circuitul din imagine sare din 1 in 0 si invers la fiecare 1 ajuns la el si memoreaza acesta stare. Acum o biti formeza un octet. Dar de unde stim ce octat adresam ? RAM-ul include ceea ce in electronica numim decodor, adica un circuit de genul: http://www.ee.surrey...er/decoder1.htm In acest exemplu se adu 2 intrai deci pe 2 biti si ai 4 iesiri. Practic printr-o succesinue de porti logice scriu un numar pe 8 biti si imi alimeteaza doar octetul x. Acum, Luam ca exemplu magistrala de date: DS:[SI] Initaial s-a foloit un word cum ar fi SI. El are valoare maxima 0FFFFh=65535zecima= 64k in reprezentarea memoriei, Cand asta nu a mai fost suficienta s-a inventat segmetul si offsetul accesat mov al, ds:[si] DS este octet si are valoare maxima FF Acum dintr-o trista inspiratia s-au adunat cam asa: DS=1111 1111 ------------- + SI=------ 1111 1111 1111 1111 ------------------------------------ 10000 1110 1111 1111 1111 in binar Mihai astea cred ca sunt 20 de linii de adresare pentru ca sa duci valoare asta de la procesor in RAM in mod paralel cum se obisnuieste iti trebuie 20 de fire electrice gen panglica care sa merga de la unul la celalat. 1 0 E F F F in hexa 1 110 015 in zecimal . Asta este cam 1Moctet. Nu este un MB!, este cam atat. Altfel spus adresa BIOS-ului este 0:400 dai si 40:000 Acum trecand pe 32 de biti in loc de ax a aparut eax eax = 0FFFF FFFFh partea low din eax este tot ax. A mai ramas si DS si au aparut alte resitre de segmat noi. Aste pentru ca si procesorele noi sa poate interpreta programe facute pentru cele vechi. Deci acum memoria se poate adresa doar cu ESI, dar si cu DS:SI daca vrem sa adresam doar o parte. Daca lucrez sun 32 biti nu mai poat umbla la DS care este pastrat undeva. Si o reprezentare schematica a unui procesor: http://www.hobbyproj...or_systems.html Editat de Gurban_Dan, 05 noiembrie 2008 - 17:27. |
#15
Publicat: 05 noiembrie 2008 - 18:15
mp_nova_2004, pe Nov 5 2008, 18:11, a scris: Putin off-topic: Ce vrei sa spui? ... vrea sa introduca termeni diferiti pentru 1. "mb" asa cum este folosit in industrie si 2. "mo" asa cum este folosit in IT. Mo este defapt termenul romanesc pentru Mb, iar industria profita de diferenta aceea de 1024 vs 1000 oricum. |
|
#16
Publicat: 05 noiembrie 2008 - 19:20
chri5ty, pe Nov 3 2008, 16:50, a scris: ... In mare masura ai primit raspuns la intrebarile tale. In ceea ce priveste modelul de memorie ales, aceasta se facea doar pe compilatoarele de DOS. Sub Windows/LINUX/UNIX, nu ai de ales, modelul ti-e impus ca fiind cel flat. Ce inseamna flat? Data/codul/stiva se afla intr-o zona de memorie continua, nesegmentata. Te vei gandi cum e posibil? Simplu. In mod protejat (modul in care lucreaza SO actuale), se foloseste paginarea, nu segmentarea. Dimensiunea unei pagini variaza, si e in general 4 sau 8 KB. Partea folositoare e ca intr-o pagina poti sa ai orice adresa virtuala vrei. Deci pot fi oricate programe care folosesc aceeasi adresa, pentru ca folosesc o adresa virtuala, care se afla in interiorul propirului spatiu virtual de memorie, si adresele sunt pe 32 de biti. In DOS, mai existau aplicatii care isi adresau de exemplu date in segmente diferite fie pe 16 fie pe 32 de biti, deoarece se pastra compatiblitatea. Tiny/small de exemplu indica offseturi de 16 biti pentru cod/date/stiva si pointeri de tip near (16 biti), huge indica adrese de 32 de biti, etc. In ceea ce priveste latimea de banda a magistralei de date/adrese ea indica practic cati biti pot fi transferati simultan. Evident, o magistrala pe 20 de biti poate transfera 20 biti simultan, etc. etc. LE: si cu ce consideri ca o sa te ajute aceste elemente legate de arhitectura procesorului/sistemului de operare la concursuri...? Editat de AndreiASM, 05 noiembrie 2008 - 19:21. |
#17
Publicat: 05 noiembrie 2008 - 21:31
OriginalCopy, pe Nov 5 2008, 18:15, a scris: ... vrea sa introduca termeni diferiti pentru 1. "mb" asa cum este folosit in industrie si 2. "mo" asa cum este folosit in IT. Mo este defapt termenul romanesc pentru Mb, iar industria profita de diferenta aceea de 1024 vs 1000 oricum. Cred ca l-ai zapacit si mai mult :) - Mo (MegaOctet) si MB (MegaByte) sunt unul si acelasi lucru (prespunand ca 1 Byte are 8 biti) - problema ca prefixul 'Mega' e folosit cu intelesuri diferite in diferite cazuri, de unele persoane: - in general, prefixul 'Mega' reprezinta 1 milion (10^6) conform standardului SI (http://en.wikipedia.org/wiki/SI) - folosit in cazuri gen MegaTona sau MegaJoule - in computing/IT/software, prefixum M (Mega) e folosit de obicei ca avand valoarea 1.048.576 (220); cum ziceai, in unele cazuri, unii au folosit ulterior si in IT prefixul Mega- "subintelegand" valoarea de 1 mil., mai ales in ce priveste capacitatea mediilor de stocare (harddiscuri). In incercarea de a elimina confuzia, s-a propus sa se foloseasca prefixul 'Mebi' (MiB - MebiByte) pentru a desemna 1.048.576 Bytes, prefix care a fost standardizat de organizatii precum IEC (IEC 60027-2), SI, IEEE, ANSI insa nu a avut mare success deocamdata printre oamenii obisnuiti.. Editat de tudor_turcu, 05 noiembrie 2008 - 21:37. |
#18
Publicat: 06 noiembrie 2008 - 09:39
Citat 10000 1110 1111 1111 1111 in binar Mihai astea cred ca sunt 20 de linii de adresare pentru ca sa duci valoare asta de la procesor in RAM in mod paralel cum se obisnuieste iti trebuie 20 de fire electrice gen panglica care sa merga de la unul la celalat. Poate nu pricep eu ceva simplu de tot, dar nu sunt aici 21 de fire? Se trimite adresa "pe din doua"? Adica offset-ul si restul adresei? Sau poate se memoreaza bitul cel mai semnificativ in registrul FLAGS? La nivel de hardware, am inteles ca se comunica cu 20 de fire, nu numai cu RAM-ul, ci cu toate componentele. Citat Acum trecand pe 32 de biti in loc de ax a aparut eax eax = 0FFFF FFFFh partea low din eax este tot ax. A mai ramas si DS si au aparut alte resitre de segmat noi. Aste pentru ca si procesorele noi sa poate interpreta programe facute pentru cele vechi. Deci acum memoria se poate adresa doar cu ESI, dar si cu DS:SI daca vrem sa adresam doar o parte. Daca lucrez sun 32 biti nu mai poat umbla la DS care este pastrat undeva. Ca sa lucrez sub 32 de biti, trebuie sa intru in modul protejat presupun. Acum nu mai pos sa accesez DS-ul, dar adresarea se face mai simplu, cu ESI (registru de 32 de biti, in care se poate memora o adresa completa), nu? Citat Data/codul/stiva se afla intr-o zona de memorie continua, nesegmentata. Te vei gandi cum e posibil? Simplu. In mod protejat (modul in care lucreaza SO actuale), se foloseste paginarea, nu segmentarea. Dimensiunea unei pagini variaza, si e in general 4 sau 8 KB. Partea folositoare e ca intr-o pagina poti sa ai orice adresa virtuala vrei. Deci pot fi oricate programe care folosesc aceeasi adresa, pentru ca folosesc o adresa virtuala, care se afla in interiorul propirului spatiu virtual de memorie, si adresele sunt pe 32 de biti. Uite o chestie de care am uitat sa intreb: Adresele virtuale sunt manevrate doar de sistemul de operare, nu? Si mai exact, cum? Parca mi-ai zis odata ca toate executabilele functioneaza la adresa virtuala 0x00600000 (sau asa ceva). Cui folosesc adresele virtuale? Intr-un executabil, instructiunile nu au adrese relative, fata de inceputul imaginii din RAM? Seteaza un registru la o valoare x si isi vede de treaba. Toate adresele pornesc de la 0. Paginile acelea de 4/8k sunt produsul imaginatiei cuiva? Daca adresarea memoriei tot e flat, cui foloseste sa o mai imparta in bucatele? "Am un compilator bun si gata!" E de datoria executabilului sa manevreze corect adresele de memorie, si de datoria sistemului de operare sa ii ofere accesul doar in zonele alocate. Eu asa cred. Am cam luat-o la vale cu ideile revolutionare :rolleyes:. |
Anunturi
▶ Utilizatori activi: 1
0 membri, 1 vizitatori, 0 utilizatori anonimi