Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разработка операционных систем - для начинающих и не только!


Информационный Канал Subscribe.Ru

Разработка операционных систем

Выпуск 23 от 2003-11-02

Сегодня в номере:

Intro

Добрый день!

Для начала - новость. В связи с тем, что мне приходит много писем с вопросами, для ответа на которые у меня иногда просто не хватает времени, был создан дискуссионный лист "Разработка операционных систем - форум", в котором вы, уважаемые подписчики, можете задавать вопросы не только мне, но и друг другу, т.к. ваше письмо, отправленное по адресу comp.soft.prog.osd-list@subscribe.ru получат все, кто подписан на этот лист. Для того, чтобы посылать письма на этот адрес, вам необходимо подписаться:

Рассылки Subscribe.Ru
Разработка операционных систем - форум.

Судя по результатам проведенного в прошлом выпуске опроса большинство проголосовавших подписчиков (27.7%) хотели бы видеть в рассылке продолжение и более подробное рассмотрение темы, затронутой еще в 14 выпуске - многозадачности.


Результаты опроса

Реализация многозадачности.........................30 (27.7%)
Работа с аппаратной частью компьютера..............27 (25%)
Системные вызовы, взаимодействие ОС и приложений...10 (9.2%)
Структура ОС (модульность и пр.)...................14 (12.9%)
Все равно - лишь бы побольше ;-)...................27 (25%)

Ну а как известно, желание подписчика - закон :)

Реализация многозадачности (продолжение)

Итак, в прошлом посвященном многозадачности выпуске мы узнали, что многозадачные операционные системы можно условно разделить на три категории: системы пакетной обработки (приоритетный параметр: пропускная способность), системы реального времени (приоритетный параметр: реактивность) и системы разделения времени (приоритетный параметр: гибкость).

По правде говоря, разделение на эти категории относится уже к высокоуровневой реализации механизма многозадачности, которая, как можно догадываться, пока не очень интересует многих из вас (по собственному опыту знаю - первоначально при разработке ОС руки чешутся сделать хотя бы примитивный циклический переключатель задач не особо задумываясь о том, какая же многозадачность получится в результате).

Также отмечу, что даже низкоуровневая (техническая) реализация многозадачности на процессорах архитектуры IA-32 - дело, полное граблей, и взявшемуся за него смельчаку придется изрядно попотеть еще до того, как он примется за проработку алгоритмов распределения процессорного времени между задачами

Мы будем рассматривать (по крайней мере для начала) самую популярную модель многозадачности - многозадачность в привелегированном режиме с двумя уровнями привилегий (Супервизор/Пользователь) в линейной несегментированной, но странично адресуемой памяти. В принципе такая модель не является вполне естественной для IA-32 (которой ближе скорее сегменты+4 уровня привилегий), но является стандартом де-факто для абсолютного большинства операционных систем и процессоров общего назначения.

Как раз из-за того, что такая модель - не родная для IA-32, а пришла от других процессоров, и появляются уже упомянутые грабли, в связи с чем разработка многозадачности требует тщательной отладки. Один из наиболее приемлемых способов отладки - эмулятор Bochs, собранный с gdbstub в совокупности с отладчиком GDB. Это позволит отлаживать ядро операционной системы практически точно также как и обычное приложение (ставить брекпойнты, смотреть значения переменных и т.д.)

Зрители из зала подсказывают, что лирическое вступление пора заканчивать и переходить к реализации :). Итак, встречайте: элемент, отвечающий в IA-32 сразу за два дела - многозадачность и разделение привилегий между пользователем и супервизором - TSS - Task State Segment или сегмент состояния задачи.

Забудьте на время о слове "сегмент" в названии TSS (оно сбивает с толку и вносит лишнюю путаницу) и представьте его как структуру данных, в которой сохраняется состояние процессора при переключении задач. Что считать состоянием процессора? Очевидно - регистры. Выглядит TSS таким образом:

                                    
   +----------------+---------------+
0  |   backlink     |ЗАРЕЗЕРВИРОВАНО| 4 
   +----------------+---------------+
4  |              ESP0              | 8
   +----------------+---------------+
8  |      SS0       |ЗАРЕЗЕРВИРОВАНО| 12
   +----------------+---------------+
12 |              ESP1              | 16
   +----------------+---------------+
16 |      SS1       |ЗАРЕЗЕРВИРОВАНО| 20
   +----------------+---------------+
20 |              ESP2              | 24
   +----------------+---------------+
24 |      SS2       |ЗАРЕЗЕРВИРОВАНО| 28
   +----------------+---------------+
28 |               CR3              | 32
   +----------------+---------------+
32 |               EIP              | 36
   +----------------+---------------+
36 |              EFLAGS            | 40
   +----------------+---------------+
40 |               EAX              | 44
   +----------------+---------------+
44 |               ECX              | 48
   +----------------+---------------+
48 |               EDX              | 52
   +----------------+---------------+
52 |               EBX              | 56
   +----------------+---------------+
56 |               ESP              | 60
   +----------------+---------------+
60 |               EBP              | 64
   +----------------+---------------+
64 |               ESI              | 68
   +----------------+---------------+
68 |               EDI              | 72
   +----------------+---------------+
72 |       ES       |ЗАРЕЗЕРВИРОВАНО| 76
   +----------------+---------------+
76 |       CS       |ЗАРЕЗЕРВИРОВАНО| 80
   +----------------+---------------+
80 |       SS       |ЗАРЕЗЕРВИРОВАНО| 84
   +----------------+---------------+
84 |       DS       |ЗАРЕЗЕРВИРОВАНО| 88
   +----------------+---------------+
88 |       FS       |ЗАРЕЗЕРВИРОВАНО| 92
   +----------------+---------------+
92 |       GS       |ЗАРЕЗЕРВИРОВАНО| 96
   +----------------+---------------+
96 |       LDT      |ЗАРЕЗЕРВИРОВАНО| 100
   +----------------+---------------+
100|T| ЗАРЕЗЕРВ.    | адрес карты IO| 104
   +----------------+---------------+
(Зарезервированные биты должны быть установлены в 0)
                                   

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

Почему же TSS все-таки называется сегментом? Потому для того, чтобы указать процессору на эту структуру (иначе говоря - адресовать ее) используется не адрес ее в памяти, а более хитрый способ: селектор сегмента в GDT, база которого уже указывает на линейный адрес TSS. Отсюда получается, что фактически TSS оформлена как отдельный сегмент в глобальной таблице дескрипторов сегментов. Адрес же текущей TSS находится в регистре TR (Task Register)

Итак, теперь процедура переключения процессора между задачами интуитивно ясна: каждая задача имеет свой TSS; допустим выполняется задача А, тогда при переключении с A на B процессор записывает значения регистров в текущий TSS, заменяет текущий TSS на TSS задачи B и загружает из текущего TSS значения регистров. Исполнение следующей инструкции произойдет уже в рамках задачи B.

На этом месте пора остановиться. А в следующем выпуске мы разберемся, почему сказанное в вышестоящем абзаце вообще говоря правильно, но далеко не является самым оптимальным (а значит, подходящим для нас) вариантом :)

А также вы узнаете, что же это за загадочные стеки SS0-2:ESP0-2 :)


На этом, уважаемые подписчики, я прощаюсь, и как всегда напоминаю, что:

lonesome AT lowlevel DOT ru - мой почтовый ящик, который с нетерпением ждет ваших писем в любое время дня и ночи
http://www.lowlevel.ru - Сайт. Наш сайт :)
http://www.lowlevel.ru/articles/ - Архив всех выпусков рассылки (кроме того, его можно найти здесь)

http://www.lowlevel.ru/cgi-bin/yabb/YaBB.cgi - Форум
Посмотреть 10 последних сообщений форума

http://sf.net/projects/tyros/ - Открытая операционная система Tyros/Neutronix, разрабатываемая по материалам нашей рассылки


Желаю удачи!
Lonesome


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное