Код context_switch() для РРС делает немного больше работы для получения того же результата. В отличие от регистра сгЗ на архитектуре х86, РРС использует функцию юпирования для указания на окружение контекста. Следующий код для switch_mm() изсается этой функции, но в гл. 4, «Управление памятью», находится его более подробное описание.
Здесь приведена функция switch_mm(), которая, в свою очередь, вызывает функцию set_context ().
include/asm-ppc/mmu_context.h 155 static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,struct task_struct *tsk)
1:6 {
157 tsk->thread.pgdir = next->pgd;
158 get_mmu_context(next);
159 set_context(next->context, next->pgd); 153 }
Строка 157
Глобальная директория страницы (регистр сегмента) для нового потока устанавливается указывающей на указатель next->pgd.
Строка 158
Поле context структуры mm_struct (next->context) передается Bswitch_mm() и обновляется значением соответствующего контекста. Эта информация получается из глобальной ссылки на переменную context_map [ ], которая содержит набор полей битовых карт.
Строка 159
Это вызов ассемблерной функции set_context. После самого кода приводится обсуждение этой функции. Во время выполнения инструкции Ыг на строке 1468 код возвращается в функцию switch_mm.
/arch/ppc/kernel/head.S
1437 _GLOBAL(set_context)
1438 mulli r3,r3,897 /* умножение контекста на фактор ассимметрии */
1439 rlwinm r3,r3,4,8,27 /* VSID = (context & Oxfffff) « 4 */
1440 addis r3,r3,0x6000 /* установка битов Ks, Ku */
1441 li r0,NUM_USER_SEGMENTS
1442 mtctr rO
1457
lsync
1461 mtsrin r3,r4
1462 addi r3,r3,0x111
1463 rlwinm r3,r3,0,8,3
1464 addis r4,r4,0x1000
1465 bdnz 3b
1466 sync
1467 isync
1468 blr
/* следующий VSID */
/* очистка переполнения поля VSID */ /* адрес следующего сегмента */
Строки 1437-1440
Поле context структуры mm_struct (next->context) передается в set_ context () через гЗ и устанавливает хеш-функцию для сегментации РРС.
Строки 1461-1465
Поле структуры iran_struct (next->pgd) передается в set_context () через г 4 и указывает на регистр сегмента.
Сегментация - это основа управления памятью на РРС (см. гл. 4). Во время возвращения из set_context (), инициализируется mm_struct для соответствующей области памяти и выполняется возвращение в switch_mm().