Newsgroup: it.comp.programmare.win32
Titolo: [VxD] Gestione memoria Intel

Sempre a seguito del mio studio (didattico, per i miei studenti, sic!) sui
VxD per Win95/98/ME, mi sono scontrata con la gestione della memoria (e dei
privilegi) attuata dall'architettura IA32 di Intel.
Pongo al solito alcune questioni e alcune intuizioni di cui mi piacerebbe
aver conferma (o smentita).
A.
IOPL è determinato, per le applicazioni, da Windows; se la CPU è in V86 Mode
vale (quasi) sempre 3 (dimostrato da Schulman nel famoso libro)
Ma in PM, cioè per le applicazioni Win32, QUANTO VALE?
B.
Ho la certezza che la Page Directory e le tabelle delle Pagine sono ampie
ognuna 4Kb (come una pagina fisica) e ogni tabella contiene 1024
elementi; ogni elemento è quindi descritto da 4 byte.
Per la Page Directory esso è l'indirizzo a 32 bit della tabella delle pagine
referenziata. OK.
Ma in una tabella delle pagine i 4 byte NON possono indicare un indirizzo a
32 bit (altrimenti i bit che indicano pagina mancante o usata o modificata
dove stanno?).
Ho dedotto bene ipotizzando che in un elemento della tabella delle pagine
sono
utilizzati solo 20 bit per indicare il n. della pagina fisica e NON il suo
indirizzo (max. 1048576 pagine fisiche da 4kb)?
In questo modo rimangono ben 12 bit per le info di pagina.
C.
La Page directory viene allocata subito dopo il primo mega dello spazio
degli indirizzi di un processo.
Da qui fino allo spazio riservato all'applicazione ci sono solo 3Mb.
Ma in teoria le tabelle delle pagine possono occupare 4Mb (1024*1024*4).
La spiegazione risiede nel fatto che molto spazio di indirizzamento di 4Gb
in realtà non è di possesso del processo (penso ai 2GByte finali, ad
esempio)?
D.
Siccome la protezione della memoria è ottenuta dalla CPU confrontando (per
ogni istruzione asm che si riferisce alla memoria) l'RPL (o CPL) corrente
associato al selettore (CS,DS,...), con il DPL associato al descrittore di
segmento (segmento in cui quell'indirizzo di memoria si trova), viene
spontanea la domanda:
il DPL viene immesso nel codice del programma dal linker, ma l'RPL chi
cavolo lo decide?
In altri termini, i selettori da chi vengono impostati a runtime e con quali
criteri (intendo i due bit riservati all'RPL)?
E.
Un indirizzo virtuale segmentato è maggiore di 32bit?
Seguendo le indicazioni desunte dal modo di indirizzamento dell'IA32, pare
proprio che in un descrittore di segmento compaia un indirizzo a 32 bit che
rappresenta la base del segmento selezionato dal selettore.
Ma per ottenere l'indirizzo virtuale bisogna *sommargli* l'indirizzo a 32
bit dell'operando (ne è l'offset)! Lo dicono i manuali, orca porcaccia!
Com'è sta storia?
Si spiegherebbe solo se gli indirizzi base collocati nei descrittori della
LGT valessero tutti e sempre ZERO.
Ancora grazie per l'attenzione.
susanna

LGT valessero tutti e sempre ZERO.
l'arcano e' presto spiegato: le CPU IA32 utilizzano sempre e cmq un
modello segmentato x la gestione della memoria, in PM e' tuttavia
possibile inizializzare descriptors che hanno per base address = 0 e
limit 4GB nascondendo di fatto la segmentazione a favore di un c.d.
flat memory model in cui la parte offset puo' referenziare un
qualsiasi byte dei 4GB indirizzabili (qualcuno forse ricordera' anche
vecchi tricks come il (un)real flat model, che andava di moda qualche
annuccio fa..) questo meccanismo e' indipendente dal paging in quanto
riguarda la traduzione del logic address (sel:offset) a linear
address, mentre l'indirezione introdotta dal paging subentra nella
traslazione da linear address a physical address
Spero di essere stato sufficentemente chiaro,  esaustivo no di certo,
ma l'implentazione del memory managment in win32 (considerando
anche le corpose differenze tra win9x e NT/2K/XP)  e' argomento
complesso da spiegare/riassumere in un solo post, soprattutto
xche' e' necessario prima aver ben chiaro la gestione della memoria
in PM nell'archittettura IA32: non avermene ma credo che prima
sarebbe bene che riesaminassi in dettaglio l'argomento PM
sui manuali intel (od eventuali guide reperibili in rete.. ti
consiglio quelle di di Alexei Frounze che e' oltre ad essere uno 
dei + attivi e disponibili su 
alt.os.dev
 gestisce un sito
davvero ricco di materiale d'interesse 
alexfru.chat.ru
).
Una volta fatto questo i vari Pietrek, Oney, Salomon saranno di +
chiara comprensione.
Cmq se posso saro' ben felice di rispondere ad altre domande,
sia privatamente via mail che sul NG.
Saluti, 
  Walker Boh

LGT valessero tutti e sempre ZERO.
un indirizzo virtuale ha due strade per corrispondere a un indirizzo
reale.....
se non é abilitata la paginazione viene sommato l'indirizzo a 32bit
all'indirizzo base contenuto nel descrittore del segmento.
se il risultato é superiore al valore LIMITE (opportunamente espresso
se in presenza di granularità) il s.o. genera un'eccezione.
se invece é presente la paginazione, viene trovata la pagina
in cui risiede l'indirizzo......
cod

privilegi) attuata dall'architettura IA32 di Intel.
Ho poco da dire, se non consigliarti di fare una ricerca su questi tre
nomi: Solomon, Ricther, Russinovich. 
Se hai dei soldi prenditi "Inside Win2000" Russinovich e credo
Ricther, ci dovrebbe essere un capitoletto sulla gestione della
memoria (almeno nell' "Inside NT 4" scritto da Solomon c'era).
Ricther ne parla invece su "Programmazione avanzata in Win32" o
qualcosa di simile. Credo siano arrivati alla quarta o quinta edizione
(io ho la tre).
Russinovich ne parlo' invece in un articolo su Windows Magazine, ora
Win200 Magazine. Puo' provare a vedere se sul loro sito c'e'
l'articolo, ma ne dubito. In verita' Russinovich e' bravo a
programmare, e meno a spiegare nel dettaglio (per me).
In italiano esiste un articolo di dal Infantino su Computer
Programming, e un altro carneade su Windows Magazine Italia. Nessuno
dei due pero' ha scritto cose all'altezza di Ricther e Solomon.
Se non hai soldi invece vai sul sito Intel, e scaricati il pdf dal
titolo simile "Come costruirsi un sistema operativo".
Ti ricordo solo che gli attuali processori Intel possono indirizzare
piu' di 32 bit, ovviamente in maniera segmentata e che sui processori
Intel le pagine non sono necessariamente di 4 Kb, ma si puo' arrivare
a 4 Mb. Non mi ricordo per quale motivo sia il kernel di NT che di
Linux allocano un troncone cosi' fatto.
Mi ero interessato alla gestione della memoria sui processori Intel
qualche anno fa, ma ora mi ricordo veramente poco. Se vuoi potrei
tirare fuori dal cilindro qualche altro punto di riferimento.
-- 
Tieni per te il Papero se vuoi la mia email
Non usi la Papero Template Library? Male.
Sito Papero -> 
http://utenti.tripod.it/papero

 wrote:
:
<omissis>
: In italiano esiste un articolo di dal Infantino su Computer
: Programming, e un altro carneade su Windows Magazine Italia. Nessuno
: dei due pero' ha scritto cose all'altezza di Ricther e Solomon.
Si, mi pare di averli letti entrambi. Prodigiose opere di copia e incolla.
Come ho gia` avuto modo di ricordare, le nostre magnifiche riviste
professionali (e hai capito di chi parlo), in una decina d'anni, non si sono
mai degnate di affrontare questi temi, nemmeno per sbaglio.
<omissis>
: Mi ero interessato alla gestione della memoria sui processori Intel
: qualche anno fa, ma ora mi ricordo veramente poco. Se vuoi potrei
: tirare fuori dal cilindro qualche altro punto di riferimento.
Grazie lo stesso.
susanna

 wrote:
:
: >A.
: di norma dovrebbe valere 3
Ok.
: >B.
: si, nei manuali di intel trovi tutte queste informazioni
: 20 bit sono utilizzati per l'allineamento su confini da 4kb
Ok.
: >C.
: questo dipende da chi implementa il s.o. essa deve essere residente in
: memoria prima che il bit P del registro CR0 venga attivato, quindi CR3
: deve puntare ad un indirizzo realmente presente in memoria.. ma non
: c'è nessun limite per la sua posizione.
Ok.
: >D.
: le istruzioni per poter essere usate in modo protetto chiedono
: determinati RPL, pensa a LIDT e LGDT ... RPL = 0 quindi se CPL != 0
: eccezione
In questa affermazione pare che RPL sia associato al tipo di istruzione...
: >In altri termini, i selettori da chi vengono impostati a runtime e con
quali
: >criteri (intendo i due bit riservati all'RPL)?
: dal s.o. che decide che privilegi riservare all'applicazione
.. ma qui pare sia associato al codice (ai segmenti del codice). In realta`
l'RPL sta in quei famosi due bit del selettore (CS, DS,...)... e allora
ancora non capisco bene. Forse pero` sono solo un po' dura.
: >E.
: un indirizzo virtuale ha due strade per corrispondere a un indirizzo
: reale.....
: se non é abilitata la paginazione viene sommato l'indirizzo a 32bit
: all'indirizzo base contenuto nel descrittore del segmento.
Questo e` quello che riporta la letteratura. Ma la somma di due indirizzi a
32 bit puo` generare indirizzi superiori a 32 bit, evidentemente. E molta
letteratura, anche autorevole (ma sempre riferita a Windows e non a Intel),
senza dare alcuna giustificazione, mostra come questa somma debba ancora
essere necessariamente un valore a 32 bit. E anche quando e` attiva la
paginazione.
E' questo che non capisco. A meno che non si dia per scontato che Win32
setti sempre a zero l'indirizzo base contenuto nei descrittori.
Grazie.
susanna

 wrote:
:
: >Ma in PM, cioč per le applicazioni Win32, QUANTO VALE?
: x la system VM ed i thread in esecuzione nel suo "contesto"
: IOPL==0 chiaramente: tuttavia il #GP handler
: di win9x si premura di emulare molte delle istruzioni IOPL
: sensitive e priviligiate eseguite da thread che girano
: con CPL==3 : x questo motivo f.e. resta possibile utilizzare
: INx, OUTx direttamente da codice win16/32, chiaramente pagando
: un discreto overhead.
Questo e` sicuramente interessante. Significa quindi che IN e OUT generano
eccezioni, e cioe` che, di massima, IOPL per applicazioni Win32 vale 3? E
che quindi una istruzione di I/O in un applicativo Win32 e` piu` 'lenta' di
sua sorella posta in un VxD?
: Cmq se posso permettermi non farebbe male avere a portata di
: mano un debugger e sperimentare "live" cio' che accade realmente:
: ti consiglio TRW2000 che puoi utilizzare senza dovere sborsare
: i quattrini per un Softice (oltre essere ricco di funzioni
: ed implementato come VxD dinamico).
Ehm, questo e` un mio problema, in effetti.
: si, diversamente da NT/2K/XP, in win9x esistono solo pages di 4KB (
: CR4.PSE=0)
Ok.
: esattamente, assumendo paging enabled (
CR4.PG
) e CR4.PAE e CR4.PSE-36
: disabled, un 32bit linear address e' ripartito in:
Ok.
: i restanti 12 bit come sai contengono (quando la PTE e' present)
: in parte informazioni relative allo stato della PTE stessa ed in
: altra parte sono disponibili come storage x informazioni
: gestite/mantenute dal S.O. (colouring, copy-on-write,ecc.)
Ok.
: >La Page directory viene allocata subito dopo il primo mega dello spazio
: >degli indirizzi di un processo.
: non direi proprio.. la PD puo essere allocate ovunque nel linear
: address, nella fattispecie in win9x si trovano mappate a partire da
: 0xFF800000, te ne puoi sincerare facilmente convertendo
: da physical a linear l'address in CR3
Ok. Pero` la PD e le tabelle stanno tutte li`, vero?
: ogni buon S.O. che si rispetti, e quindi anche win9x,
: non effettua il commit di tutti i 4MB  ...
Ok.
<omissis>
: >il DPL viene immesso nel codice del programma dal linker, ma l'RPL chi
: >cavolo lo decide?
: stai facendo un po' di confusione:
Probabile.
: >In altri termini, i selettori da chi vengono impostati a runtime e con
quali
: >criteri (intendo i due bit riservati all'RPL)?
: dimentica pure RPL di fatto cio' che conta e' il DPL del descrittore
: a cui si riferisce il selettore.
Io lo dimentico anche. Ma se il DPL lo imposta il Sistema Operativo, con
qualcosa dovra` pure confrontarlo...
: Cmq va detto che in S.O. come win9x/NT/2k che utilizzano sia il
: flat memory model che la paginazione, devi tenere soprattutto
: in considerazione le protezioni a livello di pagina che incontrerai
: molto piu' frequentemente che non quelle a livello di
: segment/descriptor
Cioe` solo le validazioni sui diritti d'accesso dei segmenti (lettura,
scrittura, ecc..)?
: >Un indirizzo virtuale segmentato č maggiore di 32bit?
: >Seguendo le indicazioni desunte dal modo di indirizzamento dell'IA32,
pare
: <...>
: >Si spiegherebbe solo se gli indirizzi base collocati nei descrittori
della
: >LGT valessero tutti e sempre ZERO.
: l'arcano e' presto spiegato: le CPU IA32 utilizzano sempre e cmq un
Ok.
: ... in PM nell'archittettura IA32: non avermene ma credo che prima
: sarebbe bene che riesaminassi in dettaglio l'argomento PM
: sui manuali intel
In effetti era quello che tentavo di evitare postando qui!
: Cmq se posso saro' ben felice di rispondere ad altre domande,
: sia privatamente via mail che sul NG.
Grazie ancora.
susanna

setti sempre a zero l'indirizzo base contenuto nei descrittori.
però si può generare un overflow.....
sommando due interi a 32bit se essi superano il limite max
viene attivato il bit Overflow nel registro flag.
Considera che cmq non bisogna giungere all'overflow....
basta semplicemente controllare che il risultato rientri
nel campo di valori ammessi da LIMITE.
immagino che il processore generi un'eccezione nel caso in cui
la somma dell'offset con la base superi il valore max...... però
non mi sono mai posto questo quesito.
cod

mai degnate di affrontare questi temi, nemmeno per sbaglio.
effettivamente, un solo articolo mi pare che nelle riviste italiane di
programmazione negli ultimi anni sia comparso relativo alla gestione
della memoria sui processori intel. (tra l'altro mi pare che non
funzionava.... non ricordo bene)
ora spero di non sembrare presuntuoso... ma sto affrontando nei
limiti delle mie conoscenze la scrittura di un sistema operativo
per processori x86 in modo protetto.. e l'argomento memory
manager al momento é quello che mi sta impegnando.
di quanto sto scrivendo, sto documentando tutto .... e i miei
appunti sono pubblicati sul sito 
www.programmazione.it
 
in una serie di articoli intitolati 'scrivere un sistema operativo'.
ciao
cod

In effetti era quello che tentavo di evitare postando qui!
k.. colpo incassato =P
Saluti,
       Walker Boh

non mi sono mai posto questo quesito.
si viene triggerato un #GP x ogni caso in cui si si tenti di accedere
un indirizzo > limit (o >= nel caso di crossing x accessi a
word,dword,ecc)
Saluti,
 Walker Boh
p.s. 
ho letto il tuo post su 
alt.os.dev
 .. eheh probabilmente questo nick
non ti ricorda nulla.. il mio originario l'ho considero parte 
del passato ormai.. cmq posso dirti che in chan di tanto in tanto
passo ancora (Melkor), e che l'idea di scrivere un SO ultimamente
e' assai diffusa fra i suoi frequentatori.. quindi se cerchi qualcuno
con cui scambiare opinioni/idee non dovrai cercare poi tanto lontano..

 wrote:
:
: >Questo e` sicuramente interessante. Significa quindi che IN e OUT
generano
: >eccezioni, e cioe` che, di massima, IOPL per applicazioni Win32 vale 3? E
: se esamini l'immagine di EFLAGS (salvandola nello stack o via
: GetThreadContext) vedrai che IOPL vale 0;
: ora se il thread sta girando in UM/CPL=3, essendo CPL > IOPL ,
: la conseguenza inevitabile del tentativo di  eseguire istruzioni IOPL
: sensitive, come nel caso di quelle privilegiate x CPL > DPL/(RPL)  e'
: un #GP.. tuttavia il #GP handler di win9x in molti casi non attiva la
: SEH ne termina l'esecuzione del thread, si premura invece di emulare
: (od ignorare) silenziosamente l'istruzione che ha generato il #GP.
: Generalmente l'emulazione si limita ad un pass-throu ma
: nei casi di INx/OUTx e' in effetti il kernel a preoccuparsi
: di effetturare l'operazione nel I/O address space per conto
: dell'applicazione; per converso come e' noto NT/2K/XP non
: prevedono affatto tale emulazione per le applicazioni win16/win32
: ma solo per i thread/task creati nel contesto di una VDM
: (a titolo di curiosita' esistono anche dei performance counters
: che riportano il numero di istruzioni emulate ).
<omissis>
Tutto molto interessante.
Ok, chiudiamo con una citazione:
"La sezione sui livelli di privilegio e` di fatto incomprensibile.
Probabilmente dovrete leggerla piu` di una volta per riuscire a comprenderla
e, anche in questo caso, e` ancora facile che non riusciate ad orientarvi
tra i DPL, i CPL e gli RPL. Nessun altro microprocessore di uso comune ha
qualcosa di analogo a questa complessita` di protezione e possiamo in modo
legittimo sollevare la domanda se queste caratteristiche sono utili e
vantaggiose (la posizione Intel) oppure rappresentano un design sfuggito a
qualunque controllo (la posizione di molti altri)."
susanna

 wrote:
<omissis>
: ora spero di non sembrare presuntuoso... ma sto affrontando nei
: limiti delle mie conoscenze la scrittura di un sistema operativo
: per processori x86 in modo protetto.. e l'argomento memory
: manager al momento é quello che mi sta impegnando.
:
: di quanto sto scrivendo, sto documentando tutto .... e i miei
: appunti sono pubblicati sul sito 
www.programmazione.it
: in una serie di articoli intitolati 'scrivere un sistema operativo'.
:
: ciao
: cod
Ci daro` sicuramente un'occhiata!
ciao e grazie.
susanna

con cui scambiare opinioni/idee non dovrai cercare poi tanto lontano..
beh, mi spiace signor Walker .. ma ho un problema tremendo :)
non ricordo i nomi di nessuna persona, a menocché non ne prenda
appunti sull'agenda...
cmq lascia stare che su 
alt.os.dev
 é molto in voga l'idea di scrivere
un sistema operativo da parte di chi lo frequenta... io ho
incominciato a frequentarlo proprio xché ho già avviato il progetto
da tanti anni or sono..... la prima volta che ho tentato avevo
16 anni, ma era stato per cercare di inserire un diagnostico
+ decente a quella porcheria di bios che aveva il primo pc :)
cmq al momento mi diletto su intel... non so se nei prox mesi
devo scrivere una specie di s.o. embedded per un piccolo
processore..... 
poi lo so che non devo cercare tanto lontano :) ho trovato
anche in 
alt.os.dev
 un tizio che pone quesiti a dir poco
stuzzicanti sull'argomento s.o. cmq se ti unirai a questa
banda di sciagurati che si alzano la mattina e incominciano
a scrivere sistemi operativi x i propri pc sei il benvenuto :))))
ciao
cod
p.s. oltre alle news in rete che frequenti ? ho l'impressione
che il tuo indirizzo email non mi é nuovo......

che il tuo indirizzo email non mi é nuovo......
gia'..ogni tanto ricompaio su qualche forum, tanto x ricordare
i vecchi tempi.. cmq un indizio.. piu' di un annetto fa' mi
spedisti untutorial su Gemini.. che pubblicai su ringzer0 =)
[OT mode off]
Saluti,
  Walker Boh

spedisti untutorial su Gemini.. che pubblicai su ringzer0 =)
hehehe.... sono passati 2 anni da allora.... come vola il tempo...
ne sono successe cose .........
é un piacere risentirti
ciao
cod

 Prodigiose opere di copia e incolla. [..]
Ovviamente. Pero' essendo io uno di quegli autori non considero la
cosa immorale.
L'unica fonte "originale" per la gestione della memoria nei processori
Intel, e' l'Intel stessa. L'unica fonte "originale" per la gestione
della memoria da parte di Windows e' la Microsoft.
Esistono pero' anche altri S.O.
Se non hai problemi con l'inglese, perche' non ti iscriviti alla mail
list dei Kernel Hacker di Linux? Fu una delle mie fonte per alcuni
dubbi che ebbi quando il problema mi interessava, anche se oggi mi
limiterei a chiedere su questo NG a Walter Boh.
Se sei di Parma come l'indirizzo suggerisce, e se ti interessa, potrei
anche darti il mail/indirizzo di un tipo strano che si era fatto un
suo S.O. molti anni fa, e che tuttora vive di esso. L'unico "genio
dell'informatica" che abbia mai incontrato. Insopportabile come
persona, ma decisamente competente.


 wrote:
:
<omissis>
: Se sei di Parma come l'indirizzo suggerisce, e se ti interessa, potrei
: anche darti il mail/indirizzo di un tipo strano che si era fatto un
: suo S.O. molti anni fa, e che tuttora vive di esso. L'unico "genio
: dell'informatica" che abbia mai incontrato. Insopportabile come
: persona, ma decisamente competente.
Vai, ma tempo sia stato un mio studente...
ciao
susanna

Vai, ma tempo sia stato un mio studente...
E anche se fosse?
Paura dell'allievo che supera il maestro? :-)
Ne dubito fortemente comunque, cosi' ad occhio non ti darei 50 anni.
Non ha fatto l'universita' per scelta di vita, e le superiori le ha
fatto tanto tempo fa.
Ci vorra' un poco di tempo per l'indirizzo, per correttezza prima devo
chiedere il suo permesso a divulgarlo (anche se solo via email).
++++
<modalita off topic>
E' una curiosita' personale, ma i tuoi studenti cosa studiano?
Un'istituto superiore con una persona che insegna cose simili mi
sembra troppo bello, e una universita' in italia che insegna cose che
non stanno solo nei libri mi sembra molto improbabile.
</modalita off topic>


 wrote:
:
: >: [..] L'unico "genio
: >: dell'informatica" che abbia mai incontrato. Insopportabile come
: >: persona, ma decisamente competente.
: >
: >Vai, ma temo sia stato un mio studente...
:
: E anche se fosse?
: Paura dell'allievo che supera il maestro? :-)
Mai.
Lo studente che intendo io supero` realmente la maestra!
Pensa che in terza (superiore), dopo pochi giorni gli chiesi su che
programmi stesse lavorando e mi confesso` candidamente che stava ultimando
il driver di stampa per l'HP Laserjet (per Linux)! Eravamo nel 1994 e aveva
16 anni.
Piu` tardi, verso la fine della quarta, pur prendendo diligentemente
appunti, esclamo`, durante la lezione: "Toh', questo non lo sapevo" (per
inciso era l'algoritmo di Peterson per la gestione software della mutua
esclusione).
Non so se mi spiego.
: Ne dubito fortemente comunque, cosi' ad occhio non ti darei 50 anni.
8-)
<omissis>
: <modalita off topic>
: E' una curiosita' personale, ma i tuoi studenti cosa studiano?
: </modalita off topic>
La materia e` 'Sistemi per l'elaborazione e la trasmissione
dell'informazione', si svolge sui tre anni terminali dell'indirizzo
informatico degli Itis.
1mo anno: architetture degli elaboratori e assembler;
2do anno: I/O e sistemi operativi;
3zo anno: reti di computer.
Strano a dirsi, ma e` il programma ministeriale (anche se ancora per poco,
data l'incalzante e ROVINOSA riforma alle porte).
ciao e grazie
susanna

dell'informazione'
Wow... sembra una cosa seria... :)
Nelle universita' americane l'avrebbero chiamato "Computers and
computer networks" ;)

Strano a dirsi, ma e` il programma ministeriale 
Allora ci sono anche persone con della testa al potere (a volte
almeno). Ma tanto fanno in tempo a rovinarsi all'universita'. Almeno
Fisica a Parma, dal punto di vista informatico, mi fece una pessima
impressione ai tempi dei tempi.
-- 
Tieni per te il Papero se vuoi la mia email
Sito Papero -> 
http://utenti.tripod.it/papero
Link al Sito Papero 
http://www.mathtools.net/