RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> > Ладно, зайдём к этой теме с другой стороны. У меня с 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) для нового адресного пространства. > > Кстати, всё это подробно описано вот в этой доке: http://l4hq.org/docs/manuals/l4-x2-20061117.pdf (L4 API, version X.2 reference manual)
_, __, _, __,
/_\ |_) /_\ |_)
| | | | | | \
~ ~ ~ ~ ~ ~ ~
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.