CATEGORII DOCUMENTE |
In timpul exploatarii sistemului de catre un program, apar
foarte multe cazuri in care programul nu foloseste in mod optim resursele
sistemului, sau chiar esueaza datorita unei configurari inadecvate. Singura
posibilitate de a scapa de probleme pare sa fie modificarea fisierului
CONFIG.SYS si repornirea calculatorului. x3b1bi
Reconfigurarea se poate rezolva si fara abandonarea activitatilor prin asa
numita reconfigurare dinamica.
Generalitati
Configurarea dinamica a sistemului DOS din punctul de vedere al unui
program, ar insemna ca programul contine parti de cod prin care el insusi poate
sa modifice, in caz de nevoie in timpul executiei, unii parametri ai
sistemului.
Astfel de cazuri ar fi : nevoia de memorie, nevoia de a folosi mai multe
fisiere, un acces mai rapid la disc, cresterea dimensiunii stivei sistem,
folosirea de drivere diferite de cele instalate initial in sistem, etc. La
pornirea calculatorului se realizeaza o configurare initiala a sistemului, dar
o configuratie optima executiei unui program poate fi inadecvata pentru
executia unui alt program.
Este de dorit, ca un program care modifica parametrii sistemului, sa refaca
parametrii la valorile lor initiale inainte de terminarea executiei. Deoarece
nu intotdeauna avem acces la sursele programelor pentru a putea face aceste
modificari, va trebui sa fie folosita o alta metoda. Aceasta ar consta in
redirectarea unor intreruperi ale sistemului.
Tabela de control a sistemului
La majoritatea sistemelor de operare nu se pot modifica parametrii
sistemului fiind pastrati intr-o zona inaccesibila programelor utilizator.
Sistemul DOS nu are o asemenea protectie, putindu-i-se modifica acesti
parametri. Pentru a realiza modificari vor trebui cunoscute: adresele la care
pune sistemul tabelele sale interne, organizarea acestora si modul de folosire
de catre sistem a continutului tabelelor. Managerul de memorie al sistemului
DOS administreaza o tabela interna nedocumentata numita DCB(DOS-Control-Block),
care pe linga adresa de inceput a listei MCB(Memory-Control-Block) contine si
alte adrese spre alte tabele folosite de sistem precum si date obisnuite.
Conform tabelei DCB se pot reconstitui toate informatiile referitoare la
organizarea interna a memoriei. Adresa de inceput a acestei tabele se poate
obtine cu ajutorul functiei DOS 52h (INT 21h) nedocumentata de catre Microsoft,
care in perechea de registrii ES:BX intoarce adresa tabelei DCB. Constructia
tabelei este la fel de nedocumentata si variaza in functie de versiunea sistemului.
Ca lucrurile sa fie si mai misterioase adresa intoarsa de functia DOS indica
spre mijlocul tabelei, astfel unele informatii din tabela se acceseaza cu
offset negativ.
Continutul tabelei DCB este prezentat mai jos cu mentiunea ca valoarea
xxh(hexa) de la inceput reprezinta offset-ul(deplasamentul) care poate fi + sau
-:
-0Ch: numarul de repetari al operatiei de acces la disc in caz de esec
(se poate seta cu functia DOS 440Bh(INT 21h))
-0Ah: timpul de asteptare intre doua operatii de repetare acces la disc
-08h: adresa bufferului de disc actual
-04h: indexul bufferului folosit de unitatea CON, daca asteapta caractere la
citire, in caz contrar contine valoarea 0000h
-02h: adresa primului MCB(MCB-urile sint organizate intr-o lista)
-00h: adresa tabelei DPB(DOS-Disk-Parameter-Block)
04h: adresa tabelei SFT(DOS-System-File-Table)
08h: adresa de inceput a driverului CLOCK$
0ch: adresa de inceput a driverului CON
10h: numarul maxim de octeti pe sector folosit la accesul periferiilor de tip
bloc
12h: adresa DIR(DOS-Diskbuffer-Info-record)
16h: adresa unui tabel cu actuala structura de directore
1ah: adresa tabelei FCB(File-Control-Blok)
1eh: numarul de FCB-uri admise in sistem
20h: numarul de drivere bloc instalate in sistem
21h: numarul LASTDRIVE (default 5)
22h: antetul driverului NUL
34h: numarul de drive-uri la care s-a aplicat comanda JOIN
35h: 0000h
37h: adresa tabelei SETVER
3bh: necunoscut/rezervat
3dh: necunoscut/rezervat
3fh: numarul bufferelor
41h: dimensiunea bufferelor
43h: unitatea pe care s-a incarcat sistemul(1=A:,259=C: harddisc)
44h: indicator procesor(01h 80386+)
45h: marimea memoriei EMS in ko.
Orice modificare in acest tabel va fi luata imediat in considerare de catre
sistemul DOS. Continutul tabelei descrise se refera la versiunea
DOS 5.0. La versiunile mai noi se pastreza vechile semnificatii, cu eventuale
mici extinderi ale tabelului spre adrese pozitive. Aceste extinderi insa nu
sunt esentiale pentru noi. Daca vrem de exemplu sa marim numarul de fisiere ce
pot fi deschise simultan, trebuie sa inlocuim toate tabelele care contin
informatii referitoare la fisiere, respectiv trebuie sa schimbam adresa
continuta in tabela DCB catre noua tabela SFT. La fel se procedeaza si in cazul
tabelelor directoarelor curente. Daca se modifica locul in memorie a unei
tabele, atunci vor trebui actualizate toate referintele existente in alte
tabele spre aceasta. In continuare se trateaza pe rand tabelele mai importante.
Tabelele de parametri disc
In tabela DCB la offsetul 00h se afla adresa de inceput a primei tabele
DPB(Disk-Parameter-Block), tabela care este folosita de catre DOS pentru lucru
cu periferice de tip bloc. Aceasta adresa poate fi obtinuta si cu ajutorul
functiei DOS 1Fh, care a fost mai amanuntit documentata prima data de Microsoft
la aparitia versiunii DOS 5.0. Aceste tabele DPB sunt inlantuite intr-o lista
liniara. Ultimul tabel contine adresa FFFFh:FFFFh.
Continutul tabelei DPB:
-00h: numarul de drive dat de DOS la instalare
-01h: numarul de subunitati
-02h: numarul de octeti pe sector(sistemul DOS rezerva in mod standard
512 octeti)
-04h: numarul de sectoare pe cluster - 1
-05h: numarul n,daca avem 2^n sectoare pe cluster
-06h: numarul de sectoare BOOT rezervate
-08h: numarul de tabele de alocare pentru fisiere (FAT)
-09h: numarul de intrari in directorul radacina(o discheta de capacitatea
360Ko are 112 intrari etc., un harddisc cu capacitatea 20Mo are 512 intrari in
directorul radacina)
-0bh: numarul de sector cu care incepe primul cluster
-0dh: numarul de sector cu care incepe ultimul cluster
-0fh: numarul de sectore pentru FAT
-11h: numarul sectorului cu care incepe directorul radacina
-13h: adresa antetului driverului de periferic care deserveste unitatea
-17h: octetul descriptor unitate
-18h: se refera la ultima operatie: valoarea 00h indica un acces obisnuit,
valoarea FFh indica faptul ca a fost schimmbat discul in unitate si tabela a
fost reinnoita cu datele referitoare la noul disc
-19h: adresa urmatorului tabel DPB(FFFFh:FFFFh daca acest tabel a fost ultimul
in lant)
-1dh: numarul ultimului cluster scris pe disc, adica clusterul dupa care vor fi
cautate clustere libere la un nou acces de scriere pe periferic
(la pornirea sistemului se pune pe 0), cu aceasta tehnica incercindu-se
evitarea fragmentarii informatiei pe disc;la versiunile mai vechi ale
sistemului noua alocare se facea intoeauna de la primul cluster liber
Tabelele driverelor de periferice
La pornirea sistemului de operare modulul SYSINIT (situat in fisierul
IO.SYS) incarca in memorie driverele din CONFIG.SYS respectiv din antetul
rezident al lui IO.SYS. Primul driver incarcat este driverul NUL. Cu el incepe
lista driverelor instalate in sistem. In antetul fiecarui driver se afla adresa
urmatorului driver, antetul ultimului driver continind adresa FFFFh:FFFFh. In
tabela DCB la offsetul 22h se situeaza antetul driverului NUL. Cu ajutorul
adresei continute in acest antet se pot accesa si celelalte drivere. Driverele
de tip bloc sunt accesate conform listei DPB. Fiecare DPB contine adresa
antetului unui driver. Driverele CLOCK$ si CON sunt accesate cu ajutorul
adresei antetului lor, continuta in DCB la offsetele 08h respectiv 0ch.
Tabelele bufferelor DOS
Sistemul DOS transfera datele intre periferice si programe utilizator cu
ajutorul driverelor de periferice. Unitatea de transfer fiind sectorul, daca un
program cere transferarea unui numar de octeti inferior numarului de octeti pe
sector, datele se pastreaza intr-o zona intermediara numita buffer. Zonele din
buffer se scriu pe disc numai la o operatie de inchidere de fisier sau la umplerea
bufferului. In cazul fisierelor de tranzactii (de ex. intr-o baza de date) prin
duplicarea handler-ului fisierului, cel initial se poate inchide, salvandu-se
astfel continutul bufferelor folosite de acesta. Numarul de buffere este
initial stabilit in CONFIG.SYS cu o linie BUFFERS=x,y unde x reprezinta numarul
de buffere iar y numarul de sectoare consecutive citite suplimentar in buffere
la o operatie de citire (folositoare pentru editoare de text in general). Nr de
buffere cu care programul lucreaza eficient cu discul depinde atat de politica
de gestiune a bufferelor, cat si de felul aplicatiei.
La offsetul 12h in DCB se situeaza adresa DIR. Tabela DIR ne informeaza despre
structura bufferelor.
Componentele tabelei DIR:
-00h: adresa listei antetelor de buffer
-04h: trebuie sa fie 0000h
-06h: adresa bufferului lookahead (0 nu este prezent)
-0Ah: numarul de sectoare consecutive citite suplimentar la o operatie de
citire (folosita si de catre SMARTDRIVE.EXE)
-OCh: locul unde se afla bufferele. Valoarea:00h-in memoria conventionala, nu
se foloseste zona de lucru, 01h-in memoria inalta UMB (Upper Memory
Block), se foloseste zona de lucru in memoria conventionala
-ODh: adresa primului segment de lucru in memoria conventionala
-11h: nefolosit
-14h: rezervat
-1Ch: Bit 0=1, UMB MCB spre o lista normala MCB
-1Dh: necunoscut
-1Fh: primul segment MCB in UMB sau FFFFh
-21h: adresa de start a listei MCB (2 octeti)
Un antet de buffer are urmatorul continut:
-00h: pagina logica EMS(-1 nu este in EMS)
-02h: adresa antet de buffer folosit anterior
-06: 0000h(2 octeti)
Pentru regasirea rapida a bufferelor, DOS utilizeaza o tehnica de tip
'hash': antetele de buffer contin o lista de adrese spre buffere care au
acelasi numar hash (numarul de sector disc MODULO numarul de antete). Bufferele
cu acelasi antet se situeaza in acelasi segment. Primul buffer se situeaza
imediat dupa antet.
Descrierea bufferelor:
-00h: adresa bufferului mai putin recent folosit (primul in lista este cel
mai recent folosit)
-02h: adresa precedentului buffer
-04h: discul de care apartine sectorul(0=A, 1=B, FFh=buffer nefolosit)
-05h: tipul datei din buffer
-bit 5 setat: remote buffer
-bit 4 setat: buffer cu date de cautare
-bit 3 setat: bufferul contine un sector din zona de fisiere
-bit 2 setat: bufferul contine un sector din director
-bit 1 setat: bufferul contine un sector din FAT
-bit 0: rezervat
-06h: numarul logic de sector
-0Ah: numarul de copii pentru FAT (continutul bufferului trebuie trecut in
fiecare FAT)
-0Bh: deplasamentul dintre doua sectoare aflate in FAT-uri consecutive si care
contin aceleasi informatii
-0Dh: adresa tabeleiDPB
-11h: numarul buffer(pentru remote buffer)
-13h: nefolosit
-14h: zona de date pentru buffer(dimensiunea sectorului);
Primul UMB-MCB se afla la adresa 9FFFh:0000h in mod predefinit. Aici se
rezerva
RAM-ul video pentru DOS. (la adresa A000h:0000h-incepe zona video si nu e
indicat sa fie folosit de catre programe utilizator).
Tabelele stivelor sistem
In fisierul CONFIG.SYS se poate seta initial numarul stivelor sistem, cu o
linie STACKS=x, y unde x inseamna numarul de stive folosite (intre 8-64), iar y
inseamna nr. de octeti pentru o stiva (intre 32-512). Stivele sint folosite la
apeluri interne. DOS incarca la initializarea sistemelor un manager de stive si
redirecteaza intreruperile 2h, 8h, 9h, 70h spre acest manager. La apelul
respectivelor intreruperi managerul de stive aloca o noua stiva, salveaza
adresa vechii stive
(SS:SP) in zona de date a noii stive, seteaza noile valori pentru SS:SP,
apeleaza rutina de intrerupere originala. La revenire din intrerupere, se
reface vechea valoare SS:SP, se elibereaza stiva alocata. Problemele apar in
general la revenire cind se poate intimpla sa nu poate elibera stiva. In
asemenea cazuri sistemul se blocheaza si trebuie repornit. Adresa de segment a
stivelor coincide cu adresa de segment al managerului.
Stivele au urmatoarea structura:
-00h:starea stivei:valoarea 0-stiva libera,1-stiva ocupata, 3-stiva blocata
(este suprascrisa de stiva urmatoare deci nu se poate elibera)
-02h: neutilizat
-03h: SS:SP salvat
-07h: offsetul cuvintului cel mai de sus folosit de stiva
-09h: zona stiva (depinde de valoarea y folosita in CONFIG.SYS )
Cuvintul din virful stivei contine offsetul inceputului zonei stivei, prin care sistemul testeaza consistenta stivei. Daca stiva nu este consistenta se blocheaza. Stivele se depun una dupa alta in memorie. Managerul de stiva se situeaza dupa tabela DCB iar la offsetul 00h fata de inceput contine o zona cu urmatoarele informatii despre stive:
-00h: rezervat
-02h: valoarea x
-04h: valoarea 8*x
-06h: valoarea y
-0Ah: adresa zonelor de stive
-0Ch: cadrul stiva cel mai de sus
-0Eh: cadrul stiva cel mai de jos
-10h: cadrul stiva cel mai recent eliberat
Tabelele directoarelor curente
In tabela de control DCB la offsetul 16h se afla adresa spre tabela CDS
(Current-Directory-Structure). Tabela CDS contine subtabele pentru fiecare
unitate de disc, referitoare la directoarele curente.
Structura unei subtabele:
-00h: litera de drive(ex: a:) si calea
-40h: rezervat(00h-00h-00h)
-43h: atribuirea unitatii
-bitul 15=1-unitate de retea
-bitul 14=1-unitate fizica
-bitul 13=1-unitate la care s-a folosit JOIN
-bitul 12=1-unitate la care s-a folosit SUBST
-45h: adresa DPB-ului
-49h: (pentru disc local) 2 octeti-clusterul de start pentru directorul curent
(0000h pentru directorul radacina, FFFFh-cluster de start nefolosit)
4 octeti-FFFFh
-49h: (pentru disc retea) adresa remote directorului sau adresa recordului de
redirectare sau FFFFh: FFFFh (inregistrare nefolosita)
-4Dh: necunoscut
-4Fh: offsetul in calea actuala dupa
-51h: necunoscut
-52h: adresa driverului IFS
-56h: (2 octeti ) octeti necunoscuti
Programele JOIN si SUBST modifica litera discului curent si adresa si adresa
spre DPB.
Tabelele fisierelor
Numarul de fisiere se poate stabili cu linia FILES=x in CONFIG.SYS, unde x
reprezinta nr. de fisiere ce pot fi deschise simultan. Adresa de inceput a
listei de tabele de fisiere (SFT), se afla la deplasamentul 043h din DCB.
Structura tabelei SFT:
-00h: adresa urmatorului tabel (ultimul contine adresa FFFFh:FFFFh)
-04h: nr. de fisiere gestionate in acest tabel ptr. fiecare fisier avind 3Bh
octeti
-05h: zona inregistrarilor ptr. fisiere
Structura unei inregistrari pentru un fisier:
00h:numarul handlerelor care se refera la fisier
02h:modul de deschidere al fisierului cu functia DOS 3Dh daca bitul 15=1,
fisierul a fost deschis cu FCB.
04h:atributul fisierului
05h:informatii referitoare la drive : bitul 15=1:fisier indepartat (remote)
bitul 14=1:nu se modifica data si timpul la inchidere bitul 13=1:pipe cu nume
bitul 12=1:no inherit bitul 11=1:spoolerul de retea
07h:adresa antetului driver la periferice de tip caracter respectiv adresa
DOS-Bios Paramater-Block la periferice de tip bloc
0Bh:clusterul de inceput pentru date
0Dh:timpul crearii fisierului (impachetat)
0Fh:data crearii (impachetat)
11h:lungimea fisierului
15h: deplasamentul actual in fisier
19h:(pentru fisiere locale) numarul de cluster al ultimului acces de scriere
(2 octeti)+numarul de sector al inregistrarii fisierului in directorul radacina
(4 octeti)
19h:(pentru fisiere de retea) adresa recordului REDIRIFS (4 octeti)+ necunoscut
(3 octeti)
20h:numele fisierului in format FCB
2Bh:adresa tabelei SHARE Share-File-Tabel
2Fh:numarul SHARE al fisierului deschis
31h:segmentul PSP pentru procese propietare
33h:deplasamentul in segment al recordului share (valoarea 0000h indica faptul
ca recordul nu exista)
35h:numarul absolut al ultimului cluster folosit
37h:adresa driverului IFS (Instalable-File-System)(4 octeti)
Aplicatie
Desi numarul de fisiere deschise simultan in sistem poate sa fie mai mult de
20 (vezi linia FILES din CONFIG.SYS), un program utilizator nu poate sa
utilizeze in mod obisnuit mai mult de 20 de fisiere deschise simultan.
Exemplul de program care urmeaza va arata modul in care se poate depasi aceasta
bariera. Fisierele sunt accesate de sistemul DOS cu ajutorul unor handlere de
fisier. Aceste handlere sunt numere intregi care indica numarul inregistrarii
fisierului in lista SFT unde se gaseste de fapt descrierea datelor referitoare
la fisier. Primele 3 handlere sunt ocupate pentru unitatea auxiliara (00h),
unitatea CON (01h) umitatea PRINTER (02h). Insa sistemul nu lucreaza direct cu
aceste handlere ci foloseste un tabel nedocumentat, cu indirectare dubla, in
zona PSP a programului utilizator cu 20 de intrari (numite handlere virtuale),
unde la fiecare intrare retine valoarea adevarata a handlerului (aceasta
reprezinta un index in tabela SFT ). O valoare FFFFh pentru handlerul real
indica faptul ca handlerul virtual nu este folosit. Aceasta virtualizare
permite DOS-ului de fapt folosirea fisierelor standard de iesire (handlerul
virtual 0000-handlerul real 01h ), de intrare (0001,01), de eroare(0002,01),
auxiliare (0003,00), de imprimare (0004,02).
Tabela din PSP arata in felul urmator:
18h:tabela cu handlere
32h:marimea tabelei de handlere
34h:adresa de deplasament al tabelei de handlere
36h:adresa de segment a tabelei de handlere
Programul rezerva spatiu pentru o tabela mai mare copiind primele 20 de valori
din vechea tabela si schimbind valorile continute la deplasamentele
32h, 34h, 36h, in PSP.
A$X+S program f20;
(* programul arata modul prin care putem deschide mai mult de 20 de fisiere in
program, practic am putea deschide 65520 de fisiere*) uses crt,dos; const
A5*2+50*2=110, 5 fisiere standard, deschise predefinit + 50 de fisiere, pe care
programul le poate deschideS marime_tabel=110; var
virtual_handle_tabel:arraya1..marime_tabeli of byte ; f:arraya1..50i of file;
reg:registers; adr:word: ss:string; i:integer; begin clrscr;
(* initializare tabel *) for i:=1 to marime_tabel do
virtual_handle_tabelaii:=$FF;
(* obtine PSP program *)
whith reg do begin ax:=$6200;
MSDOS(reg); adr:=bx; end;
(* copiaza handlerele vechi *) for i:=1 to 20 do virtual_handle_tabelaii:=MEMaadr:$17+ii;
(* numarul de handlere *)
Memwaadr:$32i:=marime_tabel;
(* adresa de deplasament si de segment a tabelei noi *)
Memwaadr:$34i:=ofs(virtual_handle_tabela1i);
Memvaadr:$36i:=seg(virtual_handle_tabela1i);
(* testare, prin incercarea de a deschide cate fisiere se poate, numarul maxim
de fisiere deschise simultan este fixat de linia FILES=xxx, in CONFIG.SYS *)
i:=1;
while ioresult=0 do begin str(i,ss);
writeln(i); assign(faii,ss+'.111');
A$I-S rewrite(faii);
A$I+S i:=i+1; end; readkey; end.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1443
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved