2012-06-29 6 views
4

시스템 호출의 실행을 얻을 수 있었고 커널에서 처리 중입니다. 그러나 나에게 아직 명확하지 않은 것은 거의 없습니다. swi 루틴에 들어가면 커널은 사용자 모드 레지스터를 스택에 저장합니다. 질문은 -리눅스 시스템 콜

  1. 누가 스택인가? (swi 핸들링과 해당 시스템 호출 루틴은 스택 프레임이 필요합니다.

  2. 커널 자체의 스택 인 경우, 스택이 할당 된 곳에서 ..? 현재 스택을 사용할 것인가? 그렇다면 현재는 커널에서 그 순간에 실행될 수있는 프로세스 일 수 있습니다. 이것은 현재 스택을 소모하지 않습니까?

  3. swi 핸들러에서 현재 실행중인 사용자 프로세스 스택을 사용하는 경우 커널이 현재 액세스 할 사용자 주소 공간이됩니다. 이것이 가능합니까? 커널 주소 지정 가능 메모리가 1GB 이내이므로 (4GB RAM 메모리 시스템에서 커널 대 사용자 주소 공간 비율이 1 : 3 인 경우).

답변

5

대부분의 ARM 모드에는 별도의 스택이 있습니다. 스택은 일반적으로 리셋 처리기 바로 다음에 설정됩니다. arch/arm/kernel/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 처리기에 들어가면 저장됩니다. 하지만 현재 (리눅스 커널의 task_struct가 활성화되어 있음) SWI 핸들러 스택의 정보를 볼 수 있습니다. 어떻게 가능합니까? –

0

스택은 ARM 모드에만 해당됩니다.

이것은 빠른 syscall 리턴 경로입니다. 여기서는 가능한 한 적은 작업을 수행하며, 여기에는 r0을 SVC 스택에 다시 저장하는 작업이 포함됩니다.

위의 라인 항목-common.S에서 인용된다. 따라서 스택은 SVC 스택입니다. (참고 : swi는 svc로 대체됩니다.)

관련 문제