if; for; call (за извикване на друг ВАТ файл); %1, %2 – параметри от позиционния ред (извиквани)
Подчинява се на правилата на ВАТ файловете. Използва още и GoTo. Може да има например: C:\SB\sbinit.com – път до изпълним файл. Сам по себе си е текстов файл. След изпълнението на изпълним файл връща управлението пак към себе си.
Възможно е да има няколко изброени пътя, ни все пак има някакво ограничение.
Set path = C:\MICROS~1\COMMON\MSDEV\BIN;
4. DOSSTART.BAT и WINSTART.BAT
Първият се изпълнява, когато се влиза под DOS или чрез рестартиране на компютъра в DOS режим. Зарежда периферните устройства в чист DOS.
Вторият се изпълнява при стартиране на Windows.
……… да не се трие. Принципно е скрит файл.
LOGO = 1/0 – да се показва картинката с облачета на Windows, т.н. LOGO. 0 – черен екран на DOS.
- logo.sys
BOOTKEYS = 1/0 – 1 – дали да се интерпретират функционалните клавиши F5, F8.
BOOTSAFE = 0/1 – 1– винаги влиза в SafeMode.
AUTOSCAN = 0/1/2: 0 – за отмяна на ScanDisk; 1 – въпрос, дали да се стартира ScanDisk; 2 – автоматично стартира ScanDisk.
6. INI файлове – WIN.INI, SYSTEM.INI
Текстови файлове.
СТРУКТУРА: [секция 1] [секция 2] ключът: string
Ключ 1 = стойност 1 ………… стойностите: string, integer, bool,
Ключ 2 = стойност 2 ………… 0, N, No, F (false)
; коментар [секция n] 1, Y, Yes, T (true)
Не може да има едноименни ключове.
[windows]
load = ……… (може да има списък от .ЕХЕ)
run = ………
SYSTEM.INI
[vcache]
// тази секция е възможно и да я няма. Каква част от RAM е заредена в кеша. Ако липсва Windows автоматично си наглася [KB]. Съществуват и такива програми за нагласа. Например: CacheMam. Подобрението на системата е най-много 4,5%
MinFileCache = x
MaxFileCache = y
[386 Enh]
// за защитения режим на работа
device =
// зареждат се виртуални драйвери. Възможна е поредица от ключове, като се повтарят. Device = според брой ключове
MinPagingFileSize = a
MaxPagingFileSize = b
// доспъпни от MyComputer\Proparties\Performance\VirtualMemory. Всяка промяна изисква Restart.
PagingDrive = C:
// място на разполагане на swap файла
[boot]
shell = explorer.exe
WIN.INI
[windows]
load = C:\progr1.exe; C:\progr2.exe; ……
run =
Основни функции за работа с .INI файлове:
GetProfileInt (…) – подаваме секция, връща се ключ = ………
GetProfileString (…) – ако го няма ключа или секцията се връща зададения от нас резултат по подразбиране
WriteProfileInt (…)
WriteProfileString (…)
GetPrivateProfileInt (…) – същите параметри като в GetProfileInt + пътя, указващ къде се намира INI файла, който четем.
GetPrivateProfileString (…)
7. Windows Registry
Всичко, което в INI файловете се пази в Registry. За NT имат особено значение!
а) логическа организация
Състои се от ключове и стойности (keys and values). Разширението от INI файловете е, т.нар. дървовидна структура (ключовете могат да се влагат един в друг). Ключове на директории; стойности на файлове.
Коренни ключове – отделни дървета
HKEY_LOCALMACHINE (HKLM)
HKEY_USER (HKU)
HKEY_CLASSES_ROOT (HKCR)
HKEY_CURRENT_USER (HKCU) – за отделните потребители, които са регисттрирани
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA (9x) – информация за текущото състояние на компютъра, например …
или
HKEY_PERFORMANCE_DATA (NT) - … натоварване на CPU
HKLM\NetWork\Logon – Ключ съставен от подключове
@ - подразбираща се стойност (default)
NULL – неинициализирана стойност
Username = sp1 – значение на стойността – типът е string
б) физическа организация – за 9х; SYSTEM.DAT (HKLM); USER.DAT (HKU/HKCU)
Намират се в директорията на Windows, обикновено в Windows\System
Ако работата е многопотребителска: Windows\Profile\ - тук се намира USER.DAT за всеки потребител.
В Windows NT – SYSTEM. (HKLM)
SOFTWARE. (HKLM)
Без разширения са. Намират се в: Windows\System32\Config
Потребителската информация NTUSER>DAT (HKCU) се намира в: Windows\Document and Settings\Profile\
в) предназначение
HKCU\SOFTWARE\Microsoft
HKLM\SOFTWARE\Microsoft
Определят поведението на системата
Програма за копие на регистрите на системата Ashampoo Uninstaller.
HKCU\Software\Micrisoft\Windows\CurrentVersion\Policies\Explorer
ClearRecentDocSOnExit = 1 – да се изтриват от Start Menu документите, които последно са използвани.
TweafUI – Програма за промяна поведението на Windows, както и за поведението на външния вид на Explorer.
Връзки:
ProgIDS – Свързан със стартиране на програми (идентификатори на програми)
HKCR \ .ZIP @ = WinZip
HKCR \ .AGJ @ = WinZip
HKCR \ .AVI @ = AVIFile
………
HKCR \ WinZip @ = WinZip Archive
HKCR \ WINZIP \ DefaultIcon @ = WinZip.exe, 1
HKCR \ WINZIP \ Shell \ Open \ Command @ = “WinZip.exe %1” // %1 параметър по подразбиране, смисълът е каква команда ще се задейства при натискане на Open
HKCR \ WinZip \ Shell \ OpenwithMyProg \ Command – ще излиза в командното меню при щракване с десен бутон.
За Visual C:
MFC AppWizard
Singe.doc
Multiple
Document/View Architecture – свързва код в Registry
г) грижи за Registry
Norton Utilities – относно връзките, когато са нарушени
WinDoctor; RegClean.exe
д) ред на зареждане (9х)
-
MSDOS.SYS
-
CONFIG.SYS
-
AUTOEXEC.BAT
-
WINSTART.BAT
-
зареждате се VxD (статични) драйвери от [386Enh] в SYSTEM.INI
-
Зареждат се VxD
HKLM \ SYSTEM \ CURRENTCONTROLSET \ SERVICES \ VxD
-
Програми:
HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ RunServices
RunServicesOnce
Run
RunOnce
-
load = от...
run = …WIN.INI
-
shell = от SYSTEM>INI
-
Всяко от StartUp директории
ПРЕКЪСВАНИЯ. РЕЖИМ НА РАБОТА НА CPU
Прекъсванията са механизми, които заставят CPU да прекъсне за кратко време изпълнението на текущата програма и да обработи заявката за прекъсване. Максималният брой прекъсвания е 256.
1. Външни прекъсвания (апаратни)
Те биват маскируеми и немаскируеми.
1.1. немаскируеми прекъсвания – не могат да се забранят по програмен път и имат по-висок приоритет. Те се генерират при използване на копроцесор или при грешка при четене в паметта.
1.2. маскируеми прекъсвания – генерират се от контролера (контролерите) за прекъсвания по заявка на определени периферни устройства. Контролерите могат да бъдат 1 или 2. От 286 нататък имат 2 контролера на прекъсвания, които са каскадно свързани. Могат да се свържат до 8 периферни устройства чрез линиите IRQ 0, …, IRQ 7.
Към IRQ 0 по принцип е свързан таймерът.
IRQ 0 за І контролер се използват 2 порта:
IRQ 1 020h и 021h
IRQ 2 за ІІ контролер те са 0A0h и 0A1h
………
IRQ 7 за инициализация се използват и инициализационни думи в точно определена последователност ICQ 1 … ICQ4.
Операционните команди и думи (OCQ) са 3 и могат да се използват в произволен ред.
За І контролер номера на прекъсването се получава, като към номера на прекъсването се прибави 8 (за IRQ 0 Intr 8).
За ІІ контролер:
IRQ 8 Intr 70h
……
IRQ F Intr 77h
Ако е подадена заявка за прекъсване към IRQ 2 се изпълнява програма, която обработва прекъсване Intr Ah. Тази програма чете регистрите на ІІ контролер, за да определи номера на IRQ. По този номер се извиква едно от прекъсванията от Intr 70h до Intr 77h като софтуерно.
1.3. процедура на прекъсване:
- контролера на прекъсване получава заявка от определено периферно устройство и, като спазва схемата на приоритета генерира сигнал Intr, който е входен за процесора.
- процесорът проверява IR (Interrupt Flag). Ако има стойност 1, прекъсванията не са маскирани.
- ако прекъсванията не са маскирани процесът генерира сигнал INTA (потвърждение на прекъсване).
- щом получи този сигнал, контролерът изпраща.
- изпълнява се процедура по предаване на управлението на обслужващата програма:
= IF и IT се нулират;
= флаговият регистър, указателят на инструкцията се запазват в стека;
= от вектора, който сочи номера на обслужващата програма, се зареждат нови стойности за регистър на кодовия сегмент. По този начин управлението се предава на обслужващата програма. Щом поеме управлението обслужващата програма може да разреши маскирани прекъсвания, тъй като стековата организация позволява влагане на 1 прекъсване в друго.
- след като завърши работата си програмата трябва да изпълни инструкция IRET, при което запазените в стека стойности се възстановяват и процесорът може да продължи изпълнението от мястото, където е бил прекъснат.
2. Вътрешни прекъсвания (изключителни събития)
Възникват при изпълнение на дадена програма и са свързани с програмни или апаратни особености на системата. Делят се на 3 типа: нарушения, капани и критични грешки.
• нарушения – при тях грешката се забелязва преди нейното възникване (нарушение на привилегиите);
• капани – възникват след изпълнение на дадени инструкции (препълване). Трябва да има схема за обработване на грешката;
• критични грешки – възникват при програмни или апаратни проблеми, при които е невъзможно да се определи причината за грешката. Изпълнението на програмата се прекратява.
3. Програмни (софтуерни) прекъсвания
Изпълняват се с помощта на двубайтова инструкция INT, следвана от номера на прекъсването.
3.1. забрана и разрешаване на прекъсванията
Използват се инструкции STI и CLI.
3.2. най-приоритетно прекъсване RESET (начално установяване) Intr 19h
3.3. таблица на преходите на прекъсване
Връзката между номера на дадено прекъсване и съответната обслужваща програма се осъществява с помощта на векторите на прекъсване. Под DOS, таблицата с векторите на прекъсване заема първият един килобайт от ОП. За всеки вектор се заемат 4 байта. Може да се получи конфликт между вътрешно прекъсване и функции на BIOS, ако потребителската програма не е предвидила средства за обработване на вътрешните прекъсвания.
Прекъсване 0 заема адреси от 000h до 003h. Това е вътрешна грешка – деление на 0.
Прекъсване 1 заема адреси от 004h до 007h. Това е прекъсване по единична стъпка trace.
Прекъсване 2 заема адреси от 008h до 00Bh. Това е NMI прекъсване.
Прекъсване 8 заема адреси от 020h до 023h. Това е прекъсване от таймера.
Началният номер на вектора се получава, като се умножи номера на прекъсването по 4.
В защитен режим също има 256 прекъсвания, на за всяко прекъсване сте отделят по 8 байта.
Таблицата може да заема произволно място в паметта. Регистър IDTR указва къде се намира таблицата в защитен режим.
4. Режим на работа на процесора.
4.1. реален режим на работа
При реален режим адресирането става чрез сегмент и отместване. Максималният размер на сегмента е 64 КВ. Максималното адресируемо пространство е 1 МВ. Адресът е 20 разряден. Получава се, като се измести наляво с 4 бита и добавяне на отместване.
Прекъсванията и изключителните събития се обслужват с помощта на вектори, разположени на постоянни адреси. За всяко прекъсване има 4 байта.
4.2. защитен режим на работа
адресното пространство е до 4 GB. Може да се работи с виртуалната памет до 64 ТВ. Основни различия между режим със защита и реалният режим са в размера на адресното пространство и механизма на адресиране.
• организация на паметта – получаването на базовия адрес на сегмента става косвено. Използва се 16 битов селектор, който сочи индекс от специална таблица, поддържана от ОС. Тази таблица съдържа 64 битови дескриптори. Едно от полетата на дескриптора представлява 32 битов адрес на сегмента. Физическият адрес се получава чрез сумиране на адреса на сегмента и 32 битово отместване. В дескриптора се съдържа и 20 битово поле, което определя границите на сегмента.
Съществува гранулираност на сегмента – специален бит. Ако е 0 имаме максимална големина от 1 МВ. Ако стойността е 1 гранулираността е 4 КВ и се получава максимален размер на сегмента 4 GB.
Налично е странично разделение на паметта – големината на страниците е 4 КВ. Страницирането е опционно. Адресът, получен чрез сумиране на сегмента и отместването, се подава на входа на странициращото устройство. Странициращото устройство работи с 3 типа таблици.
- разделяне на 32 битовия адрес.
• дескриптори (таблици на описанията) – размер на таблицата 8В ÷ 64 КВ.
І тип – глобална дескипторна таблица GDT. Тя съдържа дескрипторите за сегменти, които са достъпни за всички задачи в системата.
ІІ тип – локална дескрипторна таблици LDT. Дефинира се за всяка самостоятелна задача под управлението на кода, данните, стека, шлюзовете на задачите и изискванията. Осигурява механизма за защита на кода и данните за текущата задача от останалите задачи. Даден сегмент не може да бъде използван от текущата задача, ако не е описан в главната ДТ или в нейната локална ДТ.
ІІІ тип – дескриптор на прекъсването IDT. Използват се 4 нива на защита.
Най-висок приоритет има ниво 0. Потребителските програми се разполагат на ниво 3.
Правила за достъп до данни: от текущото ниво на привилегия може да има достъп до данни сегмент със същото ниво на привилегия или по-малко.
Достъп до програми: програма може да извика друга програма само, ако втората има същото ниво на привилегия или по-високо.
4.3. режим V-86
Създаден е, за да могат в режим със защита да се изпълняват програми, написани за реален режим. Възможно е при многозадачна работа част от задачите да работят в режим V-86, а други в обикновен защитен режим. Начинът на адресация е еднакъв с реален режим на работа. Прекъсванията се прихващат и обработват чрез ДТ на прекъсванията. Желателно е да се използва страницирането на паметта.
4.4. режим на ситемно управление SMM
За пръв път при процесора 386S4. При този режим се реализира конкретна функция от системата със сигурност на процесора или от системата за обслужване на консумация.
ПРОЦЕСИ И НИШКИ. ПРИОРИТЕТИ. СИНХРОНИЗАЦИЯ.
1. Общи положения
Windows 9x, NT – preemptive
Нишка (thread) – път на изпълнение (фрагмент от код) на програмата.
Процес (process) – включва 1 или повече нишки, кода, данни и други ресурси (отворени файлове, манипулатори). Всяка нишка работи самостоятелно, без да вижда другите нишки.
Приоритет – разпределянето на ресурси между процесите и нишките зависи от тях.
Клас приоритет (за процес):
REALTIME_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
Нишков приоритет (общо 7):
THREAD_PRIORITY_TIME_CRITICAL1
…………………………
…………………………
…………………………NORMAL
…………………………IDLE
2. Процеси и нишки
2.1. създаване и унищожаване
процес: CreateProcess (…)
ShellExecute (…)
PROCESS_INFORMATION pinf; //MANDLE hpROCESS; DWORD PLD;
CreateProcess (“C:\myprog.exe”,…,HIGH_PRIORITY_CLASS &pinf);
ShellExecute (NULL, “print”,”doc1.doc”,””,SW_SHOW);
нишка: CreateThread (…, ThreadProc, param,…);
DWORD WINAPI ThreadProc (LPVOID P);
TerminateThread (HANDLE h, DWORD exitcode);
TerminateProcess (HANDLE h, DWORD exitcode);
BOOL GetExitCodeProcess (HANDLE h LPDWORDlp ExitCode);
BOOL GetExitCodeThread (………);
DWORD SuspendThread (HANDLE h);2
DWORD ResumThread (HANDLE h);3
2.2. получаване на манипулатори
HANDLE GetCurrentProcess ();
HANDLE GetCurrentThread ();
2.3. промяна на приоритет
BOOL SetPriorityClass (HANDLE h, DWORD priority);
BOOL SetThreadPriority (HANDLE h, DWORD priority);
SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
while (1);4
3. Синхронизация
i ++; inc [i]
i = i + 1; move eax, [i]
inc eax
mov [i], eax
3.1. средства
• специфични API функции:
InterlockedIncrement (…);
InterlockedDecrement (…);
InterlockedExchange (…);
• критична секция – може да се притежава само от една нишка в момента в рамките на процеса.
EnterCriticalSection (LPCRITICAL_SECTION sectn);
LeaveCriticalSection (……);
InitializeCriticalSection (……);
DeleteCriticalSection (……);
CRITICAL_SECTION sect;
InitializeCriticalSection (8 sect);
……………
EnterCriricalSection (8 sect);
// обработка на общ ресурс
LeaveCriticalSection (8 sect);
……………
DeleteCriticalSection (8 sect);
• синхронизационни обекти
Общи черти: имат 2 състояния – активно и неактивно (signaled и nonsignalled). Могат да се използват във функциите:
WaitForSingleObject (HANDLE h, DWORD milliseconds);
WaitForMultipleObject (…);
Обектите са:
• mutex;
• semaphore;
• event.
DWORD WaitForSingleObject (HANDLE h, DWORD timeout);
WAIT_OBJECT_05
WAIT_TIMEOUT
WAIT_ABANDONED
Функцията променя h, ако е mutex, semaphore, event
WaitForMultipleObject (…);
PROG 1;
……………
HANDLE Proc = CreateProcess (…, “c:\prog2.exe”, …);
DWORD excode;
do
{
GetExitCodeProcess (hProc, &excode);
}
while (excode == STILL_ACTIVE);
……………
WaitForSingleObject (hProc, INFINITE);6
Семафор – цяло число
• сигнализиран – при > 0
• несигнализиран – при == 0
HANDLE h = CreateSemaphore (…);
WaitForSingleObject (h, INFINITE);
ReadFile (…);
//обработка
WriteFile (…);
ReleaseSemaphore (h, 1, NULL);
BOOL ReleaseSemaphore (HANDLE h, LONG releasecnt, LPLONG);
mutex – MUTuallyExclusive
• несигнализиран == 0 – зает, притежван
• сигнализиран == 1 – свободен
HANDLE CreateMutex (LPSECURITY_ATTRIBUTES s, bool initialowner, LPCTSTR name);
WaitForSingleObject (h, INFINITE);
ReadFile (…);
//обработка
WriteFile (…);
ReleaseMutex (n);
BOOL ReleaseMutex (HANDLE h);
HANDLE h = CreateMutex (NULL, TRUE, “MyMutex”);
BOOL isfirst = (GetLastError ()!+ERROR_ALREADY_EXISTS);
…………………………
CloseHandle(h);
Събитие event
• сигнализирано – SetEvent (HANDLE h);
• несигнализирано – ResetEvent (HANDLE h);
HANDLE CreatEvent (LPSECURITY_ATTRIBUTES s, BOOL manula7, BOOL initialstate, LPCTSTR name);
PulseEvent (HANDLE h);8
HANDLE ev = CreateEvent (NULL, FALSE, FALSE, “setting_event”);
……………
DWORD WINAPI Thread (LPVOIDP)
{
while (1)
{
WaitForSingleObject (ev, INFINITE);
ReadSettings ();
}
}
……………
CreateThread (…, Thread, …);
……………
//промяна на настройките
WriteSettings ();
PulsEvent (ev);
……………
CloseHandle (ev);
Типовете се пишат с главни букви
• покриват стандартните С/С++ типове
|
|
• следват Асемблерски имена
|
API
|
|
С тип
|
|
|
|
INT
|
-
|
int (32b) typedef
|
|
BYTE
|
-
|
unsigned char (8b)
|
SHORT
|
-
|
short (16b)
|
|
WORD
|
-
|
unsigned short (16b)
|
LONG
|
-
|
long (32b)
|
|
DWORD
|
-
|
unsigned (32b)
|
ULONG
|
-
|
unsigned long
|
|
|
|
|
USHORT
|
-
|
unsigned short
|
|
|
|
|
UINT
|
-
|
unsigned int
|
|
|
|
|
CHAR
|
-
|
char (8b)
|
|
|
|
|
• конвенции за имена на указателни типове
9префикс Р – указател (*)
префикс LP – далечен указател (long pointer) far *
LPBYTE BYTE FAR *
PBYTE BYTE *
В 16 bit Win:
#define FAR far
В 32 bit Win:
#define FAR
Р
LP
…
PBYTE BYTE *
LPBYTE BYTE FAR *
…
PVOID void *
…
HANDLE void *
…
HPEN void *
…
…
CHAR char 8bits символ ANSI
WCHAR wchar_t 16bits символ UNICODE
TCHAR CHAR или WCHAR
#fdef UNICODE
#defin TCHAR NCHAR
#else
#define TCHAR CHAR
#endif
LPSTR CHAR * (тип за масиви)
LPWSTR WCHAR *
LPTSTR TCHAR *
TCHAR msg [] = “Hello”; //не е преносимо към UNICODE
TCHAR msg [] = _T(“Hello”) //преносимо е към UNICODE
LPCSTR const CHAR *
LPCWSTR const WCHAR *
LPCTSTR const TCHAR *
GetWindowText (…) //LPSTRtext
GetWindowText A(…) //LPSTRtext
GetWindowTextW (…) //LPWSTRtext
Int INC (int a, int &res1, int *ts2)
{
res1=a+1; int r1, r2;
*res2=a+1; int r3.INC (1, r1, &r2);
return a+1;
}
GetWindowText (HANDw, LPTSTR t, int maxeg);
LPTSTR txt;
GetWindowText (HWND, txt, 128);
Txt=new TCHAR [129]; ≡ TCHAR txt [129];
Delete txt; GetWindowText (HWND, txt, sizeof-1);
ВЪВЕДЕНИЕ В СОМ (Component Object Model) и DirectX
COM е MS технология. Позволява обекти, работещи в нишки, процеси да си взаимодействат толкова лесно, както и ако работят в един процес.
1. СОМ
1.1. Интерфейси
СОМ – съвкупност от класове (интерфейси)
Получаване на интерфейси:
-
CoCreateInstans (…)
-
С използване на друга специфична функция:
DirectDrawCreator (…) IndirectDraw
-
чрез извикване на методи на интерфейса, който вече сме придобили
1.2. Уникални идентификатори.
128 битови цели числа, представят се като 16-ични разради: 8-4-4-12
Пример:
ABCDEF01 – 0000-1111-2222-333344445555
H KCR\CLSID
Основни:
UUID – универсално – уникален идентификатор
GUID – глобално – уникален идентификатор
LUID – локално – уникален идентификатор
IID
REFID
GUIDGEN.EXE
1.3. Интерфейс (клас) IUnKnown
ULONG IUnknown AddRef ();
ULONG IUnknown Release ();
HRESULT IUnknown Interface (REFID void, void **pvObject);
1.4. Жизнен цикъл на обектите (екземпляр на класовете). Брояч на използванията на класовете
Увеличаване на броя с 1 AddRef () ++ бр
Намаляване броя с 1 Release () – бр
Трябва да има достатъчен брой Release, за да може да се освободят всички интерфейси.
1.5. Метод QueryInterface
IDirectDraw *lpDD;
IDirectDraw2 *lpDD2;
DirectDrawCreate (NULL, &lpDD, NULL);
If (lpDD == NULL) ………//грешка
lpDD QueryInterface (IIDD_DirectDraw2, (void**)10 & lpDD211);
HRESULT.IUnknownDrawInterface (…………);
== 0 – OK
!= 0 – грешка
if (lpDD2 == NULL) ………
РАЗРАБОТВАНЕ НА РЕЗИДЕНТНИ ПРОГРАМИ (TSR)
1. Приложение
Разработване на TSR се налага, когато ОС не поддържа многозадачност (например DOS). Създава се т.нар. псевдомногозадчност.
Пример: кирилизация на DOS
В някои случаи драйвера на мишката под DOS е също TSR.
Когато се изпълнява TSR се отнема от времето за изпълнение на основната задача. Това води до забавяне при нейното изпълнение. Колкото повече TSR имаме, толкова основни задачи се изпълняват по-трудно.
Изисквания:
1) броят на стартираните TSR не трябва да бъде голям;
2) да се изпълняват максимално бързо, което води до използване на Assembler;
3) да са малки по размер;
2. Действия, извършвани от TSR
TSR се инсталират еднократно. Обявяват заеманата от тях памет за неизползваема от други програми. Прихващат 1 или няколко прекъсвания. Освобождават излишна памет. Връщат управлението на DOS.
Активирането на TSR става при настъпване на някакво събитие. Например натискането на релейна клавишна комбинация, задаване на команда от командния ред или активиране по време.
При TSR има елементарна форма на събитийно програмиране.
Резидентната програма се състои от 2 основни части: резидентна част и инсталационна част.
Възможни са комбинациите:
1) първо резидентната част, а след това инсталационната част;
2) първо инсталационната част, а след това резидентната част.
За предпочитане инсталационната част да е в края на програмата. При стартиране има 1 скок към инсталационната част. Желателно е да е в края, защото след инсталирането TSR няма нужда от инсталационната част. Паметта, която тя заема може да се освободи и се намалява размера на TSR програма. В резидентната част може да има няколко входа в зависимост от прихванатите прекъсвания.
Препоръки при разработване на резидентни програми:
- да се намали размера на заемания от резидентната програма блок памет до възможния минимум (размера на резидентната част);
- да се освободи блока, принадлежащ на резидентната програма, ако не се използва;
- да се запомнят адресите на прихванатите прекъсвания;
- резидентната програма да може да бъде активирана и деактивирана по всяко време от потребителя;
- резидентната програма да може да бъде деинсталирана (да се премахне от паметта);
- да не позволява зареждане на 2 копие в паметта;
- да се освобождава заеманата памет след деинсталиране;
- да се възстановят оригиналните вектори на прихванатите прекъсвания;
- да се разреши проблема с нерекурсивността на DOS при използване на DOS функции;
- да се прави проверка, дали е възможно използването на дисковия драйвер.
3. Инсталиране на резидентни програми
Съществуват два начина за инсталиране чрез използване функциите на DOS.
1) Използване на 27 прекъсване на DOS – използва се, когато големината на резидентната програма е до 64КВ. Програмите могат да бъдат във формат .ехе и .соm. Програмите, които използват това прекъсване не могат да се зареждат в адаптерния сегмент. В регистър DX трябва да се зареди адресът на последния байт от резидентната част.
2) Като се използва 31h функция на прекъсване 21 на DOS – резидентната програма може да бъде по-голяма от 64КВ, може да се зарежда в адаптерния сегмент. В DX трябва да се подаде големината на резидентната част в параграфи.
4. Освобождаване на излишна памет
Може да се използва функция 4Аh на 21 прекъсване. Ако се използва резидентна програма може да се използва 49h на 21 прекъсване.
5. Пренасочване на вектор на прекъсване
Активирането на резидентната програма става при генериране на прекъсване. За целта е необходимо да се промени таблицата с вектори на прекъсванията, като се замени началният адрес на програмата, облажваща съответното прекъсване на BIOS или DOS с началния адрес на резидентната програма. По този начин при всяко генериране на прекъсване първо ще се активира резидентната програма. След прихващане на прекъсването са възможни два варианта. При първият се изпълнява кода на резидентната програма и след това управлението се връща на оригиналната програма, обработваща прекъсването (най-често използвания вариант). При втория вариант не се връща управлението. В този случай кода на резидентната програма трябва да изпълнява функциите на оригиналната програма за обработване на прекъсването.
Прихващането и пренасочването на вектор на прекъсване се извършва по следния алгоритъм:
1) забраняват се прекъсванията – CLI
2) използва се функция 34h на 21h прекъсване за получаване адреса на вектора на прекъсване
АН = 35
AL = номера на вектора на прекъсване
Inter 21h
ES:BX се получава сегмента и отместването на вектора на прекъсването
3) запомня се адреса в променливи от резидентната част
4) пренасочване на вектора на прекъсването
Fun 25h Inter 21h
AH = 25h
AL = номера на вектора, който искаме да пренасочим
DS:SH – сегмент:отместването на новия адрес
DS трябва да сочи резидентната програма
5) STI – разрешаване на прекъсванията – ако резидентната програма прихваща повече от 1 вектор на прекъсване за всяко прекъсване се използва този алгоритъм
6. Проверка за наличност на резидентна програма
Резидентната програма трябва само веднъж да се зареди в паметта. Има няколко метода за проверка. Проверката за наличност се извършва в инсталационната част, т.е. ако се опитаме да заредим второ копие от програмата, проверката се осъществява от инсталационната част на второто копие.
Методите са:
1) Използване на свободна клетка от работната област на BIOS като флаг за наличност.
Недостатък: тази клетка може да бъде попроменена от други програми или да се използва от друга версия на BIOS.
2) Използване на клетка от самата резидентна програма.
Недостатък: сложно търсене.
3) Използване на уникална последователност от символи.
Недостатък: усложнено търсене.
4) Поименно търсене на резидентната програма – трябва да се проверят всички МСВ. На отместване 8 от началото на блока започва началото на резидентната програма.
Недостатък: усложнено търсене.
5) Дефиниране на потребителска функция на прекъсване на DOS или BIOS – да се дефинира потребителската функция на едно от прихванатите прекъсвания. Дефинирането на нова функция се извършва в инсталационната част. Обработката се извършва от резидентната част. Проверката се извършва от инсталационната част.
7. Деактивиране на резидентната програма
Използва се, когато работата на резидентната програма временно трябва да бъде спряна. За целта се използва клетка от резидентната част, която служи като флаг за активност/неактивност. Когато резидентната програма е неактивна тя веднага трябва да върне управлението на прихванатите вектори на прекъсването. Деактивирането се прилага и в случаите, когато резидентната програма не може да бъде деинсталирана.
8. Деинсталиране на резидентната програма
Всяка добре резработена резидентна програма трябва да дава възможност за деинсталиране. Трябва да се направи следното:
- да се направи проверка, дали деинсталирането е възможно. Ако е невъзможно се извършва деактивиране и се извежда съобщение. Ако е възможно се възстановяват адресите на прихванатите от резидентната програма вектори на прекъсване. След това се извършва освобождаване на заемания от резидентната програма блок от паметта.
Деинсталирането става в ред, обратен на инсталирането.
Деинсталирането е възможно само, ако адресите на прихванатите прекъсвания сочат началото на резидентната програма. За възстановяване векторите на прекъсването се използва 25h функция на 21h прекъсване. Освобождаването на блока от паметта, принадлежащ на резидентната програма става с помощта на 49h функция на 21h прекъсване.
9. Разрешаване проблема с нерекурсивността на DOS
Не може да се влага DOS функция в друга функция. Има флаг inDOS. Стойност 1, когато се изпълнява DOS функция и стойност 0, когато не се изпълнява.
Много често се използва 28h прекъсване.
10. Проверка за използване на дисков драйвер
Трябва да се прихване 1Вh прекъсване и да се организира брояч на дисковите операции.
СТАНДАРТНИ И ИНСТАЛИРУЕМИ ДРАЙВЕРИ (DOS)
1. Стандартни драйвери
Програми, всяка от които е функционално ориентирана към конкретно устройство и служи за интерфейс между обслужващите функции за стандартните устройства и BIOS функциите, ориентирани апаратно към конкретно периферно устройство. Стандартните драйвери за обслужване на устройството имат имена:
CON, PRN=LP1, AUV=COM1, COM2, LP2
Всички тези драйвери са обединени във файл IO.SYS на DOS. Драйверите са подредени в свързан линеен списък. В заглавието на всеки драйвер се указва адреса на заглавието на следващия драйвер. Всички драйвери имат една и съща структурна схема. DOS притежава специална функция 44h на 21h прекъсване за работа със стандартни драйвери (IOCL).
2. Видове драйвери в зависимост от обслужваното устройство
По отношение на DOS устройствата са 2 основни типа:
- символни;
- блокови.
Съответно драйверите са за символно и блоково устройство.
2.1. Драйвери за блоково устройство
Характерно за тях е, че обменят информация под формата на големи блокове от байтове. Тези устройства се използват като външна памет (дискове, магнитни ленти). Драйверите за външни устройства нямат имена, а обръщението към тях става с буквите А, В, С … Ако блок драйвери са повече от 1, подреждането им във верига определя символ за обръщение.
Създаването на драйвери за блокови устройства е доста трудно.
2.2. Драйвери за символни устройства
Символните устройства обменят информация байт след байт и са подходящи за обмен на данни със сравнително ниска скорост. Тези драйвери имат собствени имена, аналогични на имената на файловете.
3. Специализирани драйвери
Освен стандартните устройства могат да бъдат включени и специализирани устройства. За да се облекчи достъпът на потребителя до тези устройства са необходими драйвери. Чрез тях се осъществява връзка с потребителските програми. Възможни са три начина за създаване на специализирани драйвери с възможност за достъп от потребителски програми.
- специализиран начин да бъде вмъкнат в кода на потребителската програма. Създава се от програмиста с цел достъп до ресурсите на периферното устройство. Използва се само от конкретната програма. Пример са компютърните игри. Те имат собствени драйвери.
- специализиран драйвер се създава като отделен модул във вид на резидентна програма. Такъв драйвер може да бъде използван от всяка потребителска програма, ако се знае каква входна информация се подава и каква е изходната информация накрая.
- специализираните драйвери се създават по подобие на стандартните драйвери и се зареждат в паметта от DEVICE= и DEVICEHIGH= във файла SONFIG.SYS. Тези драйвери се наричат инсталируеми.
4. Инсталируеми драйвери
Създават се като стандартен DOS интерфейс по отношение драйверите на устройство. Освен поддържането на нови периферни устройства инсталируемите драйвери могат да модифицират някои от стандартните драйвери. Инсталируемите драйвери винаги се добавят в началото на веригата от драйвери. Ако вашият инсталируем драйвер има същото име като стандартния драйвер, то DOS първо ще намери инсталируемия драйвери, тъй като прекъсването е в началото. Инсталируемия драйвер се създава като асемблерска програма със зададен формат.
5. Структура на инсталируемите драйвери
Инсталируемите драйвери имат 3 основни части:
- заглавна част;
- стратегически блок;
- изпълним (основен) блок.
5.1. Заглавна част
Заглавната част съдържа указател към следващия драйвер в списъка. Съдържа атрибути на драйвера, указател към стратегическия и основния блок и името на драйвера. Големината на заглавната част е 18В. Първите 2В са отместването на указателя към следващия драйвер в списъка. Следващите 2В – атрибути на инсталируемия драйвер. Те характеризират драйвера. Следващите 2В са указател към стратегическия блок. Други те 2В – указател към изпълнимия блок. 8В – за име на драйвера.
Когато се създава драйвер първите 4В се попълват с FFFF:FFFF (указател за следващ драйвер).
Блок за заяква към драйвера (Request Header (RH))
Блок за заявка към драйвера се изгражда от DOS пир всяко обръщение към драйвера. Драйверът получава достъп до заявката чрез указател, съдържащ се в регистрите ES:EX. Блокът за заявка се състои от 2 части – постоянна и променлива част. Променливата зависи от заявката. В постоянната част се съдържа информация за дължината на блока заявка (максимален размер 256), номер на устройство, код на командата, дума за състоянието на драйвера. Променливата част зависи от това каква команда ще се извърши. Поддържат се около 23 функции на DOS, така че може да има 23 вида променливи части.
След като драйверът дешифрира кода на функцията, той осъществява съответното обслужване. Резултатите от изпълнението на заявката се поместват в думата за състоянието в блока на заявката. Думата за състоянието се обработва от COMMAND.COM и в зависимост от резултата се извежда съответното съобщение.
5.2. Стратегически блок
Състои се от 5 реда програмен код. Задачата му е да буферира заявките от DOS. Запазва информация от ES:EX, така че тази информация после да бъде използвана от изпълнимия блок. Стратегическият блок задължително завършва с команда RET, за да върне управлението на DOS. След това DOS извиква изпълнимия блок.
7 – DOS извиква изпълнимия блок
11 – попълва дума за състоянието
5.3. Изпълним блок
Неговата задача е да провери блока за заявка и в зависимост от указаната команда да осъществи изпълнение. Резултатът от обслужването се записва в думата на състоянието (11). Изпълнимият блок трябва да съдържа около 23 функции. Мога да бъдат игнорирани всички функции с изключение на нулевата. Това е инициализиращата функция. Нейната задача е да запише адреса за края на драйвера в блока за заявка. По този начин DOS получава информация къде може да зареди следващия драйвер.
6. Инсталиране на драйвер
Драйверите се инсталират по време на процеса на начално зареждане. Използват се командите DEVICE, DEVICEHIGH във файла CONFIG.SYS.
7. Опит за запис във дисков файл
От потребителската програма се извиква 21h прекъсване. Това прекъсване извиква 26h прекъсване. То попълва блок за заявка и извиква стратегическия блок на драйвера за обслужване на диска. Стратегическият блок запазва адреса на заявката и връща управлението процедурата, обслужваща 26h прекъсване. След това DOS извиква изпълнимия блок. Той прочита блока за заявка. Установява каква функция трябва да изпълни и предава управлението на вътрешна за драйвера процедура, която осъществява записа, като използва 13h прекъсване на BIOS. Когато записа завърши управлението се връща по веригата.
ЛОГИЧЕСКА ОРГАНИЗАЦИЯ НА ДИСКОВЕТЕ
Под логическа организация на дисковете се разбира разделянето на общото пространство на диска на фиксирани области с различно предназначение.
MBR – съществува само при твърдите дискове, чест от него е таблицата на дяловете.
BR – запис на начално зареждане на ОС. Има го при дискети и дискове, като при дисковете се намира в активния дял.
FAT – таблица с местоположението на дяловете. Поддържат се 2 копия на FAT.
Основна директория.
Област за данни.
1. Запис за начално зареждане
Големината му е 1 сектор = 512В и служи за зареждане на ОС. При дискети се намира на 1 сектор, 0 глава, 0 пътечка. При твърдите дискове на това място се намира MBR. За зареждане на ОС се използва 19h прекъсване. Това прекъсване зарежда на адрес 000:7С00h. При твърди дискове ВIOS претърсва областта от MBR, наречена РТ за активен дял (този дял, от който може да се зареди ОС). РТ поддържа информация за 4 дяла, като за всеки дял информацията е 16В. Поддържа се следната информация:
- дали дяла е активен или не;
- откъде започва този дял;
- принадлежност на дяла;
- къде завършва дяла;
- кой е първият сектор в дяла;
- брой сектори.
При грешна структура на дял се извежда съобщение за невалиден РТ. Ако се открие активен дял от него се взема BR и се прави опит той да бъде зареден на 0000:7С00h. Ако това е невъзможно се извежда грешка при зареждане на ОС. Ако се зареди BR се прави проверка за следния идентификатор в края на областта: 55ААh. Извежда се съобщение за невалидна ОС. След като се зареди успешно BR, той поема управлението от BIOS. Започва с 3В jump към процедура, наречена BoolStrap, служеща за зареждане на ОС.
След това има 8В с версия, име на производител – служебна информация. След това има област наречена ВРВ (BIOS Parameter Block). В ВРВ се поддържа следната информация:
- брой байтове в сектор;
- брой сектори в клъстер;
- брой копия на FAT;
- максимален брой елементи в главната директория;
- общ брой на секторите;
- брой сектори във FAT таблицата;
- брой сектори в пътечка;
- брой глави.
2. Таблица с разположение на файловете – FAT
FAT таблицата указва кои части на листа на кой файл принадлежат. Тъй като тази информация е много важна, съществуват 2 копия. Съществуват 3 версии:
- FAT12 – за описание на всеки елемент се отделят 12В. Използва се при дискети.
- FAT16 – малки твърди дискове.
- FAT32 – максималното пространство, което може да се опише е 2ТВ.
Клъстер представлява най-малката област от адресното пространство.
Всеки клъстер се състои от 1 или няколко последователни сектора. Размера му се избира като се прави компромис между големината на FAT таблицата и ефективното използване на дисковото пространство. 1 клъстер = 1 сектор. 2048 елемента е големината на FAT (3КВ).
Когато файловете не са разположени в последователни клъстери се говори за фрагментиране. Номерата на клъстерите съответстват на номера в FAT таблицата. Нулев и 1 елемент от FAT таблицата не описват клъстерите. Нулевият елемент е идентификатор на типа на диска, а първият е пълен само с 1.
Ако в елемент от FAT таблицата има 0, това означава, че съответният клъстер е свободен. Например FFF7 е идентификатор на повреден клъстер. Ако се съдържа FFFF – край на верига от клъстери. Информацията за това кой е началния клъстер на файла се получава от описанието на директорията, в която се намира файла. Има специални байтове, които определят кой е номера на първия клъстер. След като се открие първия клъстер се проследява веригата от клъстери, докато се открие FFFF.
3. Основна директория
Тя е в основата на дървовидната структура на диска. Разполагат се на точно определено място след второто копие на FAT. При FAT12 и FAT16 има фиксирана големина. В основната директория са описани поименно всички файлове и директории, които му принадлежат.
4. Област за данни
Заема преобладаващата част от диска и се намира от края на основата директория до последния клъстер.
5. Функции на BIOS за работа с дискове
Достъпни са през 13h прекъсване – функция за инициализиране, за четене, за запис, за форматиране. Функция се поставя в АН, а в регистър DL се указва устройството, с което ще се работи. За твърди дискове се използва 80h и 81h (в DL). Номер на четящо – записващата глава се указва в DH. При BIOS информацията се разглежда по секторно. Номер на сектора се указва в CL. Ако трябва да се прочетат и запишат повече от 1 сектор, техният брой се записва в регистър AL.
6. Функции на DOS за работа с дискове
DOS разглежда диска като логическа структура. DOS използва функции на 21h прекъсване. Притежава функции за отваряне на съществуващ файл, четене на файл или устройство, запис във файл и устройство, затваряне на файл, промяна атрибутите на файл, създаване на нов файл или нулиране размера на съществуващ файл.