- •6. Механизм стека регистров (rse)
- •6.1. Обзор rsEи вспомогательной памяти
- •6.2. Внутреннее состояние rse
- •6.3. Разделы стека регистров
- •6.4. Работа rse
- •6.5. Управление rse
- •6.5.1. Регистр конфигурации стека регистров (rsc)
- •6.5.2. Регистр NaTсовокупности регистрового стека (rnat)
- •6.5.3. Прикладные регистры указатели вспомогательной памяти (bspstorEиBsp)
- •6.5.4. Инструкции управления rse
- •6.5.5 Плохой pfs, используемый переходом возврата
- •6.6. Прерывания rse
- •6.7. Поведение rsEпри прерываниях
- •6.8. Поведение rsEв неполном регистровом окне
- •6.9. Взаимодействие rsEиAlat
- •6.10. Когерентность вспомогательной памяти и упорядочивание памяти
- •6.11. Переключения внешней памяти rse
- •6.11.1 Переключение из прерванного контекста
- •6.11.2. Возврат в прерванный контекст
- •6.11.3. Синхронное переключение вспомогательной памяти.
- •6.12. Инициализация rse
6. Механизм стека регистров (rse)
Механизм стека регистров (RSE–RegisterstackEngine) перемещает регистры между стеком регистров и вспомогательной памятью, без явного программного вмешательства. МеханизмRSEработает параллельно с процессором и может использовать для динамического запуска операций сливания и заливания регистров, недозагрузку пропускной способности памяти. В этом смысле, время ожидания операций сливания/заливания регистров, может перекрываться с полезной работой программы. Основные принципы стека регистров обсуждались в разделе 4.1. В этой главе представлены внутреннее состояние, модель программирования и поведение прерывания механизма стека регистров.
6.1. Обзор rsEи вспомогательной памяти
Окна стека регистров отображаются в набор физических регистров, который работает как циклический буфер, содержащий самые последние созданные окна. Механизм RSEсливает и заливает эти физические регистры во вспомогательную память и из нее. МеханизмRSEперемещает регистры между стеком физических регистров и вспомогательной памятью, без явного программного вмешательства. Как показано на рис. 6.1,RSEобрабатывает физические стековые регистры, вне текущего активного окна (как определено с помощьюCFM). Эти регистры содержат окна родительских процедур текущей процедуры.
Как показано на рис. 6.1, вспомогательная память организована как стек памяти, который растет от более низких к более высоким адресам. Прикладной регистр BSP(BackingStorePointer– указатель вспомогательной памяти) содержит адрес самого первого (низкого) места памяти, резервированного для текущего окна (т.е. места, в которое будет слитGR32 текущего окна). ДействиеRSEсливания/заливания, происходит от адреса содержащегося вBSP, т.к.RSEсливает/заливает окна родителей текущей процедуры. Прикладной регистрBSPSTOREсодержит адрес, с которого произойдет следующееRSEсливание. Регистр адреса, который соответствует следующей операцииRSEзаливания, указатель загрузкиBSP, не является архитектурно видимым. Адреса, содержащиеся вBSPиBSPSTORE, всегда выровнены на 8-байтовую границу. Вспомогательная память содержит локальную область каждого окна. Выходная область не сливается во вспомогательную память (если только позже она не становится частью локальной области вызванной процедуры). В каждом окне стека, регистры с меньшими адресами сохраняются в меньших адресах памяти. Сливания типаRSE, стековых регистров со значениямиNaT, подчиняются тем же самым ограничениям модификации памяти, что и программные сливания (st8.still) статических регистров со значениямиNaT(см. раздел 4.4.4.6 первого тома «Сливания и заливания регистров»).
Механизм RSE, также сливает/заливаетNaTбиты соответствующие стековым регистрам. БитыNaT, соответствующие статическому подмножеству, при необходимости, должны сливаться/заливаться программным обеспечением. БитыNaTявляются 65-ми битами каждого основного регистра. БитыNaTдля стекового подмножества, сливаются/заливаются группами по 63 бита, соответствующими 63-ём последовательным физическим стековым регистрам. КогдаRSEсливает регистр во вспомогательную память, соответствующийNaTбит копируется в прикладной регистрRNAT(RSENaTcollectionApplicationRegister– прикладной регистр совокупностиRSENaT). Каждый раз, когда биты 8:3 регистраBSPSTOREустанавливаются все в 1, механизмRSEсохраняет регистрRNATво вспомогательной памяти. Как показано на рис. 6.2, в результате, во внешней памяти отображаются значения 63-х регистров, а следом за ними совокупностьNaTбитов. Бит 0 совокупностиNaTбитов, соответствует первому (с наименьшим адресом) из 63-х значений регистров, а бит 62 соответствует 63-му значению регистра. В 63-ем бите совокупностиNaTбитов всегда записан ноль. Когда механизмRSEзаливает стековые регистры из вспомогательной памяти, он также заливает иNaTбиты регистров. Каждый раз, когда биты 8:3 указателя загрузки вспомогательной памятиRSEустанавливаются все в 1, механизмRSEперезагружает совокупностьNaTбитов из вспомогательной памяти. 63-ий бит совокупностиNaTбитов игнорируется при чтении из вспомогательной памяти.
|
Физические стековые регистры |
|
Вспомогательная память |
| |||||
procA calls procB calls procC | |||||||||
|
call |
unallocated |
текущее активное окно |
|
| ||||
| |||||||||
sofc |
procC |
|
AR[BSP] | ||||||
solb |
procB |
RSE loads/stores |
procB |
AR[BSPSTOR] | |||||
sola |
procA |
procA | |||||||
|
unallocated |
Предшественники procA |
| ||||||
|
return |
|
Более старшие адреса регистров |
| |||||
|
|
|
|
Более старшие адреса памяти |
Рис. 6.1. Взаимоотношения между физическими регистрами и вспомогательной памятью
|
8 байтов |
BSPSTORE{10:3} | |
|
|
11 000000 |
|
10 111111 |
NaTcollection |
10 111110 |
|
|
63 стековых основных регистров |
| |
10 000000 |
|
01 111111 |
NaTcollection |
01 111110 |
|
|
63 стековых основных регистров |
| |
01 000000 |
|
00 111111 |
NaT collection |
| |
|
|
Рис. 6.2. Формат вспомогательной памяти.
Механизм RSEработает параллельно и асинхронно относительно выполнения инструкций, используя для динамического запуска операций сливания и заливания регистров, недозагрузку пропускной способности памяти. Алгоритм, используемый механизмомRSEдля определения того, следует ли делать сливание/заливание и когда именно, зависит от реализации. Программное обеспечение не имеет связи с алгоритмом сливания/заливания. Чтобы гарантировать, что процессор и работаRSEне влияют друг на друга, программное обеспечение не должно обращаться к стековым регистрам вне текущего стекового окна. Архитектура гарантирует целостность стека регистров, вызывая ошибку при попытке записи вне окна регистров. Чтение вне окна регистров, может взаимодействовать сRSEоперациями и вернуть неопределенное значения данных. Однако чтения вне окна регистров требуются для распространенияNaTбитов.
Работа RSEмеханизма, управляется прикладным регистромRSC(RegisterStackConfiguration– конфигурации стека регистров). Действия между процессором и механизмомRSEсинхронизируются только тогда, когда инструкцииflushrs, loadrs, br.ret или rfiреально требуют, чтобы регистры были слиты или залиты, либо когда программное обеспечение явно запрашивает синхронизациюRSE, путем выполнения инструкцииmovв/из прикладных регистровRSC,BSPSTOREиRNAT.