260 likes | 373 Views
СИСТЕМНЕ ПРОГРАМУВАННЯ. Завантаження системи і розподіл пам'яті. 1. Розподіл пам'яті.
E N D
Завантаження системи і розподіл пам'яті
Адреси c 0000:0000 по 0000:03 FF (1 Кбайт) займає таблиця векторів переривань. Відзначимо, що вектори можуть містити адреси програм-обробників, адреси таблиць даних або бути вільними. По специфікаціях DOS вектора з номерами від 0x60 по 0x67 вільні і можуть займатися програмами користувачів. Однак, якщо користувачеві необхідно використовувати власне переривання, йому не можна вибрати будь-який вектор з зазначеного діапазону без перевірки. У цей момент в пам'яті ПЕОМ можуть знаходитися якісь резидентні програми (наприклад, драйвери-русифікатори), які можуть використовувати ці ж вектора. Вільні вектори (а вони можуть знайтися і поза специфікованої області) знайти легко: ці вектори містять нульові адреси або константу NULL
# Include <dos.h># Include <stdlib.h>void * readvect (int in);main () { void far * vect; / * вектор * / int intnum; / * номер переривання * / int line, i; for (clrscr (), intnum = line = 0; intnum <l; 256; intnum + +) { for (i = 0; i <17; i + = 16) { vect = readvect (intnum + i); printf ("INT% 02Xh -% Fp -", intnum + i, vect); if (vect == NULL) printf ("%-16s", "Свободен"); else printf ("%-16s", "Зайнятий");} if (i) { printf ("\ n"); if (+ + line> 15) {Intnum + = 16; line = 0; getch (); clrscr ();} } }}/ * ==== Отримання вектора ==== * /void * readvect (int in) { union REGS rr; struct SREGS sr; rr.h.ah = 0x35; rr.h.al = in; intdosx (& rr, & rr, & sr); return (MK_FP (sr.es, rr.x.bx));}
Адреси з 0040:0000 по 0040:00 FF (256 байт) називаються областю пам'яті BIOS. Область пам'яті BIOS містить дані, що характеризують склад, режим роботи та поточний стан обладнання ПЕОМ. Ці дані встановлюються BIOS при завантаженні і змінюються програмами BIOS в процесі функціонування ПЕОМ.
Адреси з 0050:0000 до 0050: FFFF - область пам'яті DOS, що містить на фіксованих місцях деякі змінні DOS.Далі аж до адреси 9000: FFFF (640 Кбайт) - область пам'яті, займана компонентами DOS і розподіляється DOS для завантажуваних програм (резидентних і нерезидентних).
Адресний простір з A000: 0000 по B000: FFFF носить назву відеопам'яті. Фізично вона розташована на платі дисплейного адаптера. Реально, в залежності від типу адаптера, може матися лише частину цієї області. Для монохромного адаптера MDA вимагається лише 4 Кбайт, починаючи з адреси B000: 0000. Для кольорового - CGA - 16 Кбайт, починаючи з B800: 0000. Відеопам'ять для адаптерів EGA і VGA починається з адреси B800: 0000 в текстовому режимі і з A000: 0000 - у графічному.
Пам'ять у адресному просторі з C000: 0000 по F600: 0000 не обов'язково присутній в ПЕОМ. У цій адресної області розміщуються розширення ПЗП. Ми можемо перевірити встановлені на нашій ПЕОМ розширення ПЗП за допомогою програми, наведеної в прикладі 2. Ця програма читає перше слово з кожних 2 Кбайт, починаючи з адреси C000: 0000 у пошуках маркера розширення ПЗП: 0x55AA. Якщо такий маркер знайдений, то наступний байт містить довжину модуля ПЗП, а наступні кілька десятків байт наша програма виводить на екран у символьному вигляді, зазвичай в цій галузі міститься текстова інформація про призначення модуля ПЗП і про фірму виробника
/ * = ПРИКЛАД 2 = * // * =============== Пошук розширень ПЗУ =============== * /# Include <dos.h>main () { unsigned int segm, off; / * Частини адреси * / unsigned int byte = 0xAA55; / * Маркер ПЗУ * / clrscr (); for (segm = 0xc000; segm <0xffb0; segm + = 0x40) { / * Перебір пам'яті від C000: 0 з кроком 2 К * / if (peek (segm, 0) == byte) { / * Маркер знайдений * / printf ("Адреса ПЗУ =% 04x", segm); printf (", Довжина модуля =% d * 512 байт \ n", peekb (segm, 2)); / * Роздруківка частини ПЗУ * / for (off = 3; off <200; off + +) printf ("% c", peekb (segm, off)); getch (); printf ("\ n \ n"); } }}
Від FE00: 0000 і до кінця адресного простору розташоване ПЗП BIOS. BIOS в ПЗП містить програми,які виконують такі функції: • тест самоперевірки; • початковий завантажувач; • обслуговування клавіатури; • обслуговування дисплеїв; • обслуговування послідовних портів; • служба часу; • друк екрану.
При включенні живлення мікропроцесор 8086 розпочинає роботу з передачі управління за адресою FFFF: 0000 (ця адреса заноситься в регістри CS: IP) - це апаратна особливість мікропроцесора. Ця адреса належить ПЗУ BIOS, 5 байт за цією адресою містять команду переходу на початок програми POST у ПЗП (Power On Self Test - самоперевірка при включенні живлення). Програма POST перевіряє склад устаткування і формує список обладнання в області пам'яті BIOS, виконує тест ОЗУ (як правило, проходження цього тесту трасується на екрані терміналу) та іншого обладнання ПЕОМ і ініціалізує таблицю векторів переривань в частині переривань, обслуговуваних BIOS.
Потім BIOS починає процедуру початкового завантаження. Початковий завантажувач опитує перший пристрій гнучких дисків, перевіряючи на ньому наявність диска для початкового завантаження. Якщо диска там немає, програма звертається до ПЗУ, пов'язаним з іншими пристроями, які можуть містити диски для початкового завантаження. Коли пристрій завантаження знайдено, BIOS читає з нього блок початкового завантаження і передає на нього управління. Блок початкового завантаження, розміщений на доріжці 0, секторі 1, 0 сектор першої доступної дискети (або жорсткого диска) зазвичай зчитується в пам'ять за адресою 07C0: 0000 і містить завантажувач операційної системи і блок параметрів, з якого завантажувач отримує інформацію про конфігурацію системного диска.
Завантажувач через таблицю векторів використовує сервісні засоби BIOS для завантаження в пам'ять іншої частини системи. Завантажувач насамперед встановлює, що перші два файли в каталозі - IO.SYS і MSDOS.SYS (IBMBIO.COM і IBMDOS COM для операційної системи PC DOS.). Якщо це так, то обидва файли зчитуються в оперативну пам'ять.
Файл IO.SYS • складається з модуля резидентних драйверів (BIOS DOS), модуля ініціалізації BIOS.DOS і модуля системної ініціалізації. В ході ініціалізації BIOS DOS формується список резидентних драйверів пристроїв у відповідності зі списком обладнання, отриманим при роботі POST і змінюються деякі вектори переривань BIOS (тобто BIOS DOS перехоплює обробку цих векторів у BIOS ПЗУ).
Після відпрацювання модулів ініціалізації IO.SYS займана ними пам'ять звільняється, і управління отримує програма ініціалізації ядра DOS. Ця програма встановлює вектори переривань DOS і виконує ініціалізацію резидентних драйверів. В ході цієї ініціалізації визначається максимальний розмір сектора, використовуваного драйверами, і у відповідності з цим розміром в пам'яті організовується буфер секторів.
Потім виконується обробка файла CONFIG.SYS. У відповідності з параметрами, заданими в CONFIG.SYS (або за замовчуванням - якщо CONFIG.SYS відсутній), формуються системні таблиці і завантажуються встановлювані драйвери пристроїв. Нарешті, відкриваються системні файли (CON, PRN, AUX), завантажується в пам'ять командний процесор COMMAND.COM, і управління передається його секції ініціалізації. • Ім'я командного процесора задається оператором SHELL в CONFIG.SYS, за замовчуванням це COMMAND.COM.
COMMAND.COM складається з трьох частин: • резидентна частина, яка містить обробники переривань 0 x22 (адреса завершення), 0x23 (реакція на Ctrl-Break), 0x24 (критична помилка); • частина ініціалізації розташовується в пам'яті слідом за резидентної частиною COMMAND.COM, вона забезпечує виконання файлу AUTOEXEC.BAT і знищується (звільняє пам'ять) після виконання своїх функцій; • нерезидентна частина, яка містить інтерпретатор внутрішніх команд DOS і завантажувач зовнішніх команд. Ця частина розташовується в старших адресах пам'яті і може частково або повністю перекриватися завантажуваними програмами. При зверненні до нерезидентної частини командного процесора її збереження в ОЗУ перевіряється по контрольній сумі і при необхідності вона повторно завантажується в пам'ять.
Як виконати перезавантаження системи зі своєї програми? • Перш за все, визначимо, що перезавантаження може бути трьох видів - "гаряче", "тепле" і "холодне". • Переривання BIOS 0x19 дозволяє виконати перезавантаження системи з програми. При цьому перезавантаження починається з дій, наступних за виконанням програми POST - початкового завантажувача BIOS - і носить назву "гарячого" перезавантаження.
/ * = ПРИКЛАД 3. = * // * ========== Гаряче перезавантаження системи =========== * /# include <dos.h>Main () {/ * 2-й і 3-й параметри виклику нульові, оскільки дляпереривання 0x19 ніяких параметрів не потрібно * / int86 (0x19, 00,00);} Швидше за все, програма приведе до "зависання" системи. Справа в тому, що при "гарячому" перезавантаженні не встановлювати заново вектори переривань BIOS, таким чином, якщо переривання BIOS були до моменту видачі INT 19H перехоплені якимись резидентними програмами, після перезавантаження системи ці вектори будуть вказувати невідомо куди.
У "холодному" і "теплому" варіантах перезавантаження виконується з самого початку - з виконання програми POST. Різниця між "холодним" і "теплим варіантами полягає в тому, що в першому випадку POST виконується в повному обсязі - як при натисканні кнопки RESET, а в другому з неї виключається тестування устаткування і оперативної пам'яті - як при натисканні комбінації клавіш Ctrl + Alt + Del . Для запуску перезавантаження треба просто передати управління за адресою FFFF:0000 Тип перезавантаження BIOS визначає з вмісту слова за адресою 0040:0072 - якщо там знаходиться код 0x1234, виконується "тепле" перезавантаження, інакше - "холодне"
/ * = 4,4 ПРИКЛАД = * / / * === Виклик програми POST холодна / тепла завантаження === * / # Включити <dos.h> Main () { недійсними (* функції) (); / * адреса функції * / непідписаних Int код = 0x0A; / * Формується адресу POST - F000: FFF0 * / функція = MK_FP (0xf000, 0xfff0); в той час як (код == 0x0A) { Printf ("\ NУкажіте варіант перезавантаження: 0 - холодна; \ п"); Е ("1 - тепла>"); перемикач (getche ()) { випадку '0 ': код = 0; перерви; випадку '1 ': код = 0x1234; перерви; } } / * Запис ознаки типу перезавантаження в область пам'яті BIOS * / мішку (0x40, 0x72, код); / * Передається управління на POST * / (* Функції) (); }
Файл CONFIG.SYS CONFIG.SYS є текстовим файлом, що містить набір команд конфігурування системи. • BREAK - установка рівня перевірки Ctrl + Break. • BUFFERS - установка числа буферів для дискових операцій. • COUNTRY - установка залежного від країни формату дати та часу. • DEVICE - установка драйвера пристрою. • DRIVPARM - установка параметрів для дискового драйвера. • FCBS - установка числа блоками управління файлом, одночасно відкритих в режимі поділу. • FILES - установка числа описувачів файлів в системі. • INSTALL - завантаження TSR-програм (DOS 4.0 і вище). • LASTDRIVE - установка числа дискових ідентифікаторів. • SHELL - визначення файлу командного процесора і розміру оточення. • SWITCHAR - установка символу перемикання для командного рядка. • SWITCHES - скасування розширеної клавіатури. • STACKS - установка розмірів стеків, використовуваних для обробки переривань від обладнання