RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : А вот вопрос, однако...


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : valerius
To : Юрий Пронякин
Subj : А вот вопрос, однако...

> Ладно, зайдём к этой теме с другой стороны. У меня с flexpages концы с концами не сходятся.
> Flexpages - это абстракция, которой оперирует L4. (Иначе говоря, flexpages - это элемент архитектуры абстрактной L4-машины). Но микроядро-то запускается на реальной машине, поэтому все его абстракции должны отображаться на что-то реальное. Так вот на что отображены flexpages в случае x86 (применительно к памяти) - на физические страницы или на страницы линейного пространства? Оба варианта ответа немедленно порождают ещё кучу вопросов.

Прежде всего, в L4 есть абстракции: тред, адресное пространство, IPC.

тред -- это исполняемая и диспетчеризуемая единица. То есть, его можно рассматривать 1) в ракурсе исполнения процессором и 2) в ракурсе планирования шедулером

адресное пространство -- область _виртуальной_ (не физической) памяти, в которой могут исполняться несколько тредов

адресное пространство с исполняющимися в нем тредами == понятию "задача" (task)

L4 фактически оперирует виртуальной памятью процессора. Есть "начальное" "плоское" адресное пространство sigma0. Ему соответствует начальный менеджер памяти, который также называется sigma0. То есть, физическая память всего компьютера 1:1 (или, как математики говорят, идемпотентно) отображена на адресное пространство sigma0. То есть (виртуальное) адресное пространство sigma0 1:1 соответствует физической памяти компьютера.

Адресные пространства конструируются рекурсивно. Для этого служат операции map и grant. Обе эти операции оперируют виртуальными страницами (flexpages или fpages).

Flexpage это страница виртуальной памяти, которая должна удовлетворять требованиям: 1) ее размер не меньше 1 Kb и не меньше аппаратной страницы памяти процессора для данной архитектуры 2) размер кратен степени двойки и 3)начальный адрес ее должен быть выровнен по ее же размеру.

Flexpages рассматриваются как неделимые объекты, т.е., нельзя отмапить часть уже примапленной страницы, операции можно с нею производить только над ней целиком.

Flexpages соответствуют частям разных адресных пространств. То есть, есть много независимых виртуальных адресных пространств, каждое из которых состоит из flexpages. Flexpages могут передаваться насовсем (grant) из одного адресного пространства в другое; либо могут отображаться (map), так что после этого страница оказывается в обеих адресных пространствах (т.е., получается общая, или шаренная область памяти). Причем возможно, что в разных адресных пространствах страница будет по разным адресам. Но содержимое е будет тем же в обеих адресных пространствах.

> Точно так же интересует - как порождается задача? Функциями SpaceControl() и ThreadControl()?

Задача состоит как минимум из одного треда. Тред запускается при помощи системного вызова ThreadControl(). Этот системный вызов имеет вид:

result = ThreadControl(dest, SpaceSpecifier, Scheduler, Pager, void* UtcbLocation);

где:
dest -- ThreadId треда, к которому применяется этот системный вызов
SpaceSpecifier -- ThreadId адресного соответствующего пространства (адресное пространство определяется TID-ом любого принадлежащего ему треда; адресное пространство не может существовать вообще без принадлежащих ему тредов. Когда удаляется последний тред, вместе с ним удаляется и само адресное пространство)
Scheduler -- тред-шедулер, который управляет раздачей процессорного времени данному треду.
Pager -- тред, который обрабатывает page faults, возникающие в данном треде
UtcbLocation -- адрес области UTCB (User-Mode Thread Control Block) -- области, принадлежащей адресному пространству треда и содержащую часть его (треда) контекста (т.е., регистры) при переключении задач

При создании первого треда автоматически создается его адресное пространство. При удалении последнего треда автоматически удаляется адресное пространство. Тред может создаваться в активном или неактивном состоянии. Неактивные треды не исполняются до момента их активизации другими тредами, исполняющимися в том же адресном пространстве (через вызов ExchangeRegisters()). Добавляются новые треды тем же вызовом ThreadControl()
Когда создается самый первый тред, он создается вызовом ThreadControl(), в котором dest == SpaceSpecifier.
Если SpaceSpecifier != dest, dest не существует, то создается новый тред в том же адресном пространстве.
Если SpaceSpecifier != dest, dest существует, то это дает только модификацию параметров треда.
Если Pager == NilThread, то тред создается неактивным. Его потом может активизировать другой тред, исполняющийся в том же адресном пространстве, вызовом ExchangeRegisters().

При старте каждый тред входит в фазу receive короткой IPC-операции -- он ждет сообщения от своего пейджера. Когда это сообщение приходит, в этом сообщении закодировано будущее содержимое регистров IP и SP. То есть, он загружает эти регистры и после этого начинает исполняться.

Есть еще SpaceControl() -- он для настройки адресных пространств. Как я понимаю, все, что он делает -- это настраивает адреса областей KIP (Kernel Interface Page) и UTCB (User-Mode TCB) для нового адресного пространства.

Кстати, всё это подробно описано вот в этой доке: l4-x2-20061117.pdf (L4 API, version X.2 reference manual)

Mon 25 Jun 2007 18:46 Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.7.10) Gecko/2005




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.