2012-06-29 4 views
4

Я могу получить выполнение вызова системных вызовов и его обработки в ядре. Но мне пока не все ясно. При вводе подпрограммы Swi, ядро ​​сохраняет регистры пользовательского режима в стеке. Вопрос:Системный вызов Linux

  1. Кто такой стек? (Поскольку обработка swi и соответствующая системная обработка вызовов требуют, чтобы рама стека работала)

  2. Если это собственный стек ядра, откуда будет выделен стек ...? Приступит ли он к использованию текущего стека? Если да, то текущий может быть любым процессом, который может выполняться в данный момент в ядре. Это не стека тока выхлопа?

  3. Если он использует текущий исполняемый стек пользовательского процесса в swi-обработчике, это будет пространство адресов пользователей, к которому теперь будет обращаться ядро. Возможно ли это? Поскольку адресная память ядра находится в пределах 1 ГБ (если соотношение 1: 3, отношение пространства между ядром к пользователю используется в 4 ГБ оперативной памяти).

ответ

5

Большинство режимов ARM имеют отдельный стек. Стеки обычно устанавливаются вскоре после сброса. Из арки/руки/ядра/setup.c:

/* 
* setup stacks for re-entrant exception handlers 
*/ 
__asm__ (
"msr cpsr_c, %1\n\t" 
"add sp, %0, %2\n\t" 
"msr cpsr_c, %3\n\t" 
"add sp, %0, %4\n\t" 
"msr cpsr_c, %5\n\t" 
"add sp, %0, %6\n\t" 
"msr cpsr_c, %7" 
    : 
    : "r" (stk), 
     "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE), 
     "I" (offsetof(struct stack, irq[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE), 
     "I" (offsetof(struct stack, abt[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE), 
     "I" (offsetof(struct stack, und[0])), 
     "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE) 
    : "r14"); 

P.S. SVC - это текущее имя так называемого SWI.

+0

Спасибо, и вы правы. Пользовательский режим SP, LR сохраняется при входе в SWI hander. Но я могу видеть текущую (активную ядро ​​Linux task_struct, которая активна) info из стека обработчика SWI .. Как это возможно? –

0

Это правда, что стек специфичен для режимов ARM.

Это быстрый обратный путь к сбоку. Мы делаем как можно меньше здесь, и это включает в себя сохранение r0 обратно в стек SVC.

Приведенные выше строки указаны в начального common.S. Таким образом, стек представляет собой стек SVC. (Примечание: swi заменяется на svc).

Смежные вопросы