Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11650
Последний выпуск: 19.06.2015

Реализация многозадачности в RealMode.

Загрузка задачи.

В реальном режиме мы имеем 640Kb памяти - 10 сегментов по 64Kb. В первый сегмент нам лучше пока не соваться - эта область BIOS. Для простоты предположим, что каждая задача нашей ОС - это COM файл MS-DOS.

COM-программы содержат единственный сегмент (или, во всяком случае, не содержат явных ссылок на другие сегменты). Образ COM-файла считывается с диска и помещается в память, начиная с PSP:0100. Заметим, что COM-программа может использовать множественные сегменты, но она должна сама вычислять сегментные адреса, используя PSP как базу.

COM-программы предпочтительнее EXE-программ, когда дело касается небольших ассемблерных утилит. Они быстрее загружаются, ибо не требуется перемещения сегментов, и занимают меньше места на диске, поскольку заголовок EXE и сегмент стека отсутствуют в загрузочном модуле.

В MS-DOS после загрузки двоичного образа:

  • CS, DS, ES и SS указывают на PSP
  • SP указывает на конец сегмента PSP (обычно 0fffeH, но может быть и меньше, если полный 64K сегмент недоступен). Слово по смещению 06H в PSP указывает, какая часть программного сегмента доступна.
  • Вся память системы за программным сегментом распределена программе.
  • Слово 00H помещено (PUSH) в стек.
  • IP содержит 100H (первый байт модуля) в результате команды JMP PSP:100

Наша задача при загрузке файла проделать те-же самые действия, что-бы программы ни коим образом не догадывалась об отстутствии ее родной ОС.

Переключение задач.

Предположим, что каждая COM-программа занимает в памяти один сегмент. Обычно это выглядит следующим образом:

18.2 раза в секунду приходит аппаратное прерывание, и процессор отвлекается на выполнение некоторой процедуры - восьмого прерывания (int 08h). При этом он сохраняет в стеке регистр флагов (PUSHF), и регистры указывающие на текущую команду (CS:IP) (PUSH CS, PUSH IP). Всего 6 байт. После окончания аппаратного прерывания эти регистры восстанавливаются и основная программа продолжает свое выполнение.

Наша задача, в время выполнения прервания подменять стек таким образом, что-бы после восстановления регистров выполнялась другая программа, находящаяяся в памяти.

Структура дескрипторов задачи.

При наилучшем раскладе возможна загрузка восьми задач - 640Kb/64Kb=10, то есть всего имеем десять сегментов - один под переменные DOS, и один под ядро, вот и остается только восемь.

Для каждой из восьми возможных задач и для ядра, заводим структуру:

task8          DB ?                     ;¦  char id; (255 - no task)
               DD ?                     ;¦  void far * pointer;
               DW 255 DUP(?)            ;-  unsigned int stack[255]; }

id - идентификатор задачи, если загружена, то ее номер, 255 - если не загружена и 254 - если приостановлена.

pointer - Точка входа в задачу.

stack[255] - В это место будем сохранять некоторые регистры задачи при переключении, кроме того здесь будет хранится указатель на стек задачи, где сохранены остальные регистры, ну и еще что-нибуть - если понадобится.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
68K
28 января 2011 года
X_MAN
0 / / 28.01.2011
+0 / -3
Мне нравитсяМне не нравится
28 января 2011, 18:22:57
f где это всё прописывать
2.
60K
06 мая 2010 года
Dimo10xs
0 / / 06.05.2010
+2 / -2
Мне нравитсяМне не нравится
8 мая 2010, 11:01:46
Да уж , проще некуда .
3.
27K
13 марта 2007 года
seemanx
0 / / 13.03.2007
+1 / -1
Мне нравитсяМне не нравится
13 марта 2007, 20:17:38
МнеКажетсяПригодится(" =]");
4.
Аноним
+1 / -1
Мне нравитсяМне не нравится
21 марта 2006, 21:02:54
2Олежка
начиная с 0060:0000 и до B000:0000 место свободно, однако, гарантируется наличие только 32КБ памяти (неспроста загрузочный сектор помещается в 0000:7C00). Остальное нужно спросить у BIOS либо померить самому.
5.
Аноним
+1 / -1
Мне нравитсяМне не нравится
1 марта 2006, 11:23:27
Многозадачная ОС реального режима конечно не плохо, но хило... был бы проект многозадачной ОС защищенного или виртуального защищенного...
6.
Аноним
+0 / -1
Мне нравитсяМне не нравится
30 декабря 2005, 17:20:00
А нет инфы, какие области памяти можно использовать в своих интересах? Т.е. память, которая не является системной, не видеопамять и т.д.
7.
Аноним
+0 / -1
Мне нравитсяМне не нравится
25 ноября 2005, 16:44:59
Ито хорошо
8.
Аноним
+1 / -1
Мне нравитсяМне не нравится
29 октября 2005, 20:50:33
Одно плохо: всё это лишь для реального режима, что ясно из названия...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог