|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Traduzione indirizzi virtuali in indirizzi fisici
Supponiamo di trovarci in una piattaforma Windows (NT-based) e che in un certo momento in un certo processo sia allocata una pagina di memoria virtuale, leggibile, scrivibile e senza nessun page guard impostato. supponiamo anche che in un momento in cui la pagina è residente (cioè si trova in memoria fisica) il processo tenti di accedere ad una sua locazione, in lettura o in scrittura a vostra scelta. in una tale situazione, secondo voi, l'HAL (Hardware Abstraction Layer) di Windows o qualche altro componente del sistema operativo sono tenuti a fare una qualsiasi operazione? durante questa operazione di accesso in memoria, viene eseguita una qualsiasi riga di codice del sistema operativo, in particolare qualche parte di codice relativa alla traduzione da indirizzi virtuali ad indirizzi fisici? e in caso di risposta affermativa, tali operazioni vengono eseguite anche al fetch di ogni singola istruzione di codice del programma?
mi scuso con l'utente ekerazha se ho mal posto la questione (si tratta di una nostra discussione proveniente da altrove che stiamo spostando qui). |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Sui processori x86 che operano in modalità protetta le cose funzionano così: il selettore (che fa riferimento ad un descrittore di segmento) viene usato insieme all'offset a 32 bit per comporre un indirizzo lineare. Se il sistema di paging è disabilitato, l'indirizzo lineare è già a tutti gli effetti l'indirizzo fisico. Quando il sistema di paging è attivato, le cose cambiano un pochino. Una pagina ha tipicamente una dimensione di 4 KByte (anche se sui x86 si possono avere pagine da 2MB o 4MB). L'indirizzo lineare è suddiviso in 3 parti: Directory, Table e Offset. Senza entrare nei dettagli (si veda la documentazione Intel), tramite una serie di tabelle organizzate su 2 livelli, il processore è in grado di convertire l'indirizzo lineare in un indirizzo fisico. Il nocciolo di tutta la gestione del paging è 1 bit che è presente nelle entry di queste tabelle. Se il bit di 'Present' indica che la pagina è mappata in memoria fisica, l'accesso è immediato da parte del processore e non richiede l'intervento di alcun altro componente hardware/software. Se il bit indica che la pagina non è presente, allora viene generata una eccezione di Page-Fault (#PF). A quel punto è esclusivamente compito del S.O. gestire la cosa: dovrà certamente caricare la pagina dal file di swap, scegliere una pagina fisica in cui metterla, risistemare le entry nelle tabelle, invalidare nella TLB la entry della pagina e quindi alla fine, riavviare l'istruzione che ha generato il #PF.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
bene bene, concordo al 100%
![]() aspetto solo che quel troll ignorante di ekerazha legga ![]() grazie andbin. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2002
Città: somewhere in Europe
Messaggi: 2554
|
Provo a rispondere, vediamo se ho ben capito la domanda.
Se un processo ha allocata della memoria (non importa se fisica o virtuale), a quello spazio può accedere solo quel processo. Quando si swappa dal processo A al processo B il sistema operativo si preoccperà di salvare i registri contenuti nel processore relativi al processo A, per poter poi ritornare all'esecuzione del processo A quando sarà il caso. Mettiamo caso che ora sul processore stia girando il processo B. La fase di decodifica degli indirizzi avviene a livello HW, dato la complessità delle operazioni e la quantità richiesta. Se il processo B chiede di accedere ad un indirizzo riservato al processo A si scatena un interrupt e il controllo passa al Kernel del sistema operativo che genera un'eccezione. In sostanza il processore non sa se una locazione di memoria è in memoria fisica o in swap, lui cerca comunque in memoria fisica, se non è presente è il sistema operativo che prende il controllo e trasferisce quella porzione di dati in memoria fisica. |
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
2) un'eccezione non richiede uno switch in kernel-mode, o almeno non mi risulta |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
aggiungo: al massimo potrebbe non far parte di quei 2 o 3 GB, nel qual caso sarebbe un indirizzo che si riferisce al kernel space, ma di certo non allo spazio di indirizzamento di un altro processo.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2002
Città: somewhere in Europe
Messaggi: 2554
|
era da prendere con le pinze
![]() non avevo visto che Andbin aveva già ampiamente risposto alla domanda. |
![]() |
![]() |
![]() |
#8 | ||
Messaggi: n/a
|
Quote:
Tratto da "Finnel, Lynn (2000). MCSE Exam 70-215, Microsoft Windows 2000 Server. Microsoft Press. ISBN 1-57231-903-8" (riportato su Wikipedia): Quote:
|
||
![]() |
![]() |
#9 |
Messaggi: n/a
|
Aggiungo anche uno schemino che sembra piuttosto intuitivo: http://en.wikipedia.org/wiki/Image:W...chitecture.svg
|
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
no, sta dicendo che la cpu è in grado di interpretare autonomamente un eventuale linear address se la pagina è caricata in memoria (cioè nn è richiesto swap). Nel caso di page fault, allora il sistema operativo deve intervenire come tutti sappiamo.
ciauz |
![]() |
![]() |
![]() |
#11 | |
Messaggi: n/a
|
Quote:
|
|
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Il sistema operativo provvede a scegliere e procurare le pagine fisiche e mapparle negli indirizzi lineari del processo; fatto questo, la pagina _è_ del processo e ci accede tramite l'MMU -- il lavoro del s/o è finito.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Ma nn ho capito bene, che intendi per operazioni sulla memoria?
Allocazione/deallocazione? O, come avevo capito prima, si vuole chiarire se ad es in un'istruzione tipo mov eax,00FFAxxh (indirizzo a ca@@) interviene anche il sistema operativo nella traduzione di quell'indirizzo? Ultima modifica di The3DProgrammer : 11-09-2007 alle 14:32. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Ecco mentre scrivevo forse ilsensine ha chiarito la questione
![]() ciau |
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Concettualmente in genere ne bastano solo due: User e Supervisor (in altri processori come i Motorola in effetti ce ne sono solo 2 di livelli, appunto quelli appena menzionati). Questo significa solamente che in modalità supervisor è possibile eseguire tutte le istruzioni che si vuole, pure quelle "privilegiate" e accedere a qualunque locazione di memoria indirizzabile. In modalità user invece non è possibile eseguire istruzioni privilegiate e non è possibile accedere a zone di memoria che il codice in modalità supervisor ha chiaramente marcato come non accessibili dal livello user. Esatto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#17 | |
Messaggi: n/a
|
Quote:
Per andare sul banale: se nella mia applicazione ho una malloc() o una realloc() (o qualcosa di simile) la chiamata deve comunque passare dal sistema operativo o no? Detto questo, devo fare una parziale rettifica in quanto pensavo che il sistema operativo intervenisse sempre durante l'accesso alla MMU e non che su x86 la cosa venisse gestita direttamente dalla CPU. Ultima modifica di ekerazha : 11-09-2007 alle 14:56. |
|
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Innanzitutto, le chiamate al s/o non servono per allocare memoria; smetti di pensare in termini di "memoria" e pensa in termini di "indirizzi virtuali". La malloc non ritorna memoria (lo faceva ai tempi del DOS), ritorna indirizzi virtuali. Per far questo, occorre sì una chiamata al s/o -- chi vuoi che abbia i diritti per manipolare le tabelle di pagine? (chiamate comunque ottimizzate e ridotte tramite una gestione di un heap in user space). Solo quando accedi alle pagine il s/o si pone il problema di fornirti la pagina di memoria, ma lo fa in maniera trasparente tramite la gestione dei page fault. Fatto questo, la pagina è tua -- per il momento. Può accadere che il s/o si "riprenda" la pagina (mettendo il contenuto in swap, durante il page reclaim o per "anzianità"), oppure che il contenuto venga spostato su una pagina fisica diversa da quella inizialmente assegnata (perché ad es. un driver sta richiedendo una serie di pagine fisicamente continue per operazioni dma). Questo avviene su tutti i s/o che utilizzano l'mmu. Una volta però che la pagina fisica è associata ai tuoi indirizzi virtuali, ripeto, il s/o è come se non esistesse, puoi utilizzarla liberamente senza impatti prestazionali.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ora ... malloc è solo una funzione della libreria standard del "C". Non so esattamente cosa faccia (dipende dalla implementazione). Su Windows posso solo presumere che chiami una delle API Win32 per la allocazione di memoria, che a sua volta chiamerà presumibilmente funzioni kernel-mode per fare quello che serve per allocare la memoria nel processo.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#20 | |||
Messaggi: n/a
|
Quote:
Quote:
Quote:
Ultima modifica di ekerazha : 11-09-2007 alle 15:19. |
|||
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:31.