Системное программное обеспечение персональных ЭВМ

Шугаринг купить узнать больше. |

Пример 3 - часть 2


адрес блока */ intdosx(&rr,&rr,&sr); if (rr.x.cflag) printf("\7Неудовл.запрос на расширение mem=%d\n",rr.x.bx); else return(MK_FP(rr.x.ax,0)); } /*==== Определение адреса начала последнего (большого) свободного блока ====*/ void init(void) { /* получение адреса системных блоков */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); csegm=peek(sr.es,rr.x.bx-2); do { /* движение по цепочке MCB */ freetop=csegm; cmcb=(struct MCB *)MK_FP(csegm,0); /* переход к следующему блоку */ csegm+=(cmcb->size+1); } while(cmcb->type!='Z'); memmap("Исходный блок"); } /*==== Выдача карты памяти ====*/ void memmap(char *s) { printf("\n***** %s *****\n",s); csegm=freetop; do { /* движение по цепочке MCB */ cmcb=(struct MCB *)MK_FP(csegm,0); printf("Адрес=%04X Размер=%-5u ",csegm,cmcb->size); if (cmcb->owner==0) printf("свободен\n"); else printf("занят\n"); /* переход к следующему блоку */ csegm+=(cmcb->size+1); } while(cmcb->type!='Z'); getch(); }

Из работы программы предыдущего примера видно, что MS DOS при выделении памяти использует дисциплину "первый подходящий" - память выделяется из первого в цепочке свободного блока, размер которого больше или равен затребованному. В DOS 3.0 и выше имеется возможность управлять дисциплиной распределения памяти. Для этого служит функция DOS 0x58. Подфункция 0 (AL=0) этой функции позволяет прочитать установленную дисциплину (результат - в AX). Подфункция 1 (AL=1) позволяет задать (в BX) дисциплину. Возможны три дисциплины: 0 - первый подходящий (установлена по умолчанию), 1 - последний подходящий, 2 - самый подходящий.

В программном примере функции getorder и setorder обеспечивают обращение к функции DOS 0x58 для чтения/установки дисциплины.

Функции init, memmap, memget и memfree работают аналогично одноименным функциям предыдущего примера.




- Начало -  - Назад -  - Вперед -