Newsgroup: it.comp.lang.c
Titolo: Modalità protetta

Leggendo il libro sulla programmazione grafica di Andrea Fasano, ho notato
che usa la funzione memset (che però stranamente sul compilatore che usa,
Watcom, non è dichiarata in string.h) per scrivere nella memoria video,
dall'indirizzo 0xa0000.
Provando a fare lo stesso (con le opportune modifiche, ovviamente) col
DJGPP, eseguendo il programma ottengo un memory fault:
1) Guardando le FAQ di DJGPP ho letto che non posso accedere alla memoria
video dall'indirizzo 0xa0000 perché DJGPP lavora in modalità protetta e
quindi la memoria è mappata differentemente. Il problema è che anche il
Watcom lavora in modalità protetta, no, come mai li funziona?
2) Le FAQ consigliano di usare le funzioni_farpeekX/_farpokeX per accedere
la indirizzi assoluti, ma queste sono ovviamente più lente. Non ci sono
altri modi?
3) Se scrivessi le routine grafiche con l'assembly inline del DJGPP otterrei
sempre il memory fault? E con un assembler, tipo NASM?
4) Da quanto ho capito, in modalità protetta a ogni programma viene
assegnata una memoria che può gestire. Per accedere al resto bisogna usare
qualche chiamata del sistema operativo, o cosa? No penso che per accedere
ad esempio alla memoria del bios, etc in modalità protetta devo usare solo
funzioni già pronte, che, comunque, saranno state programmate da zero, in
che modo?
5) Il DJGPP ha sia le funzioni per accedere agli interrupt i cui prototipi
si trovano in dos.h, come int86(), sia quelle in DPMI.h, come __DPMI_int().
Le ho provate entrambe con l'interrupt 0x10(che serve a impostare la
modalità grafica), e hanno funzionato entrambe. Qual'è la differenza?
6) La gestione della modalità protetta sotto dos, è standard, vero? Si
dovrebbe appoggiare a un server DPMI, che è standard, no? Allora come si
spiegano le differenze col Watcom?
7) Mi sembra strano il fatto che le FAQ dicano che non si può usare
l'indirizzo a0000, perchè DJGPP lavora in modalità protetta. Non è questo un
indirizzo in modalità protetta, mentre quello in mod reale è a000:0000?
Grazie,
Marco

indirizzo in modalità protetta, mentre quello in mod reale è a000:0000?
Attento a non fare confusione.
Dire 0xa0000 e dire 0xa000:0000 significa dire la stessa cosa.
Entrambe sono espressioni di indirizzi raggiungibili in modalita'
reale. 0xa0000 e' rappresentato in modo assoluto, mentre 0xa000:0000
in modo relativo alla segmentazione adottata. In pratica, ogni
indirizzo espresso nella forma segmento:offset viene calcolato come
segmento*16+offset. Ad esempio, l'indirizzo 0xA0000 puo' essere
raggiunto anche con 0x9F00:0x1000 (difatti 0x9F00*16+0x1000 = 0xA0000)
.
--
Andrea Laforgia
andrea_...@bigfoot.com


non é come dici ... é il problema del primo mega e nelle FAQ del DJGPP
troverai qualcosa ... mi auguro !!

 raggiunto anche con 0x9F00:0x1000 (difatti 0x9F00*16+0x1000 = 0xA0000)
Grazie! In pratica ogni indirizzo fisico può esere raggiunto in infiniti
modi, no?
Comunque, come mai ci sono sia le funzioni in dos.h che dpmi.h per accedere
agli interrupt(vedi punto 5)?
Marco

 non ho capito cosa vuoi dire
Intendo dire: come fanno le funzioni _farpokeX() e _farpeek() ad accedere
alla memoria in modalità protetta. Vorrei saperlo per poter accervi
direttamente, senza usarle.
Comunque, in modalità protetta, non posso accedere all' indirizzo a0000
perchè non ne ho il permesso e basta, o comunque essendo la memoria
rimappata quell'indirizzo corrisponde in realtà a qualcos'altro?
Se volessi accedere all'area di memoria del BIOS, ad esempio per leggere i
valori del timer?
Si può impostare il dos extender per fare in modo che mi dia accesso a
particolari zone della memoria, o cose del genere?
Grazie
Marco

 particolari zone della memoria, o cose del genere?
il dos4gw ti fa già vedere 4G, col djgpp extender devi come già detto
allocare un descrittore e farlo puntare dove vuoi

allocare un descrittore e farlo puntare dove vuoi
In pratica così facendo potrei acceder a tutta la memoria, potendo fare ad
esempio anche quello che fanni i virus, no?
Marco

 esempio anche quello che fanni i virus, no?
in teoria si ... ma tra la teoria e la pratica, in genere, c' é più
differenza che in teoria !!

 venga eseguito del codice in modalita' V86 (cioe' reale simulata).
Il watcom produce codice "reale a 16 bit" e a 32 bit solo in modalità
protetta;
Il codice in modalità protetta può essere usato attraverso il dosextender
dos4gw lanciandolo da dos in modalità reale.

 problemi di formato del modulo oggetto )
Non voglio scrivere una funzione in assembler e linkarla ad un programma C
col DJGPP.
Intendo dire, come dovrei fare usando solo un assembler (senza toccare C e
DJGPP...)?
Marco

Leggendo i vari documenti sul sito del DJGPP, ho capito che la strada
migliore per scrivere nella memoria in modalità protetta è quello di usare
un selettore, che è già definito per il DJGPP?
Ma se ne volessi definire uno?
Poi, non ho ben chiara la differenza tra descrittore di segmento e
selettore.
Comunque, ho trovato anche un'altra via, ovvero l'uso della funzione
__djgpp_nearptr_enable(), che disabilita la protezione della
memoria(__djgpp_nearptr__disable() per riabilitarla). Ora, Eseguendo
l'eseguibile sotto DOS, a meno di non accedere ad esempio ad dati infetti da
virus, o cose, del genere, non penso che ci dovrebbero essere problemi, no?
Ma in un sistema multitasking come windows(eseguendo l'applicazione in una
finestra DOS) cosa potrebbe succedere? La protezione verrebbe disabilitata
per ogni processo o solo per il mio programma.
So chhe sembra una soluzione rischiosa, ma penso sia la più veloce, dato che
potrei usare anche solo i puntatori per scrivere leggere in memoria, senza
chiamare funzioni...
Infine, scrivendo un programma completamente in assembly, per accedere alla
memoria dovrei fare la stessa cosa, ovvero definire un selettore, metterlo
in un registro 16bit e usarlo in combinazione con uno a 32? Se si,
resterebbe sempre il problema di come si fa a definire un selettore...
Grazie,
Marco
ps. non so proprio dove trovare queste informazioni, questo newsgroup sembra
l'unica risorsa sicura...



