Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Configurarea dinamica a DOS-ului

ms dos



+ Font mai mare | - Font mai mic



Configurarea dinamica a DOS-ului

 

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1343
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved