8, 1/1 회원가입  로그인  
   ka0r1
   커널에서 어셈블리어

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=11 [복사]


#define switch_to(prev,next,last) do {                                  \
        unsigned long esi,edi;                                          \
        asm volatile("pushl %%ebp\n\t"                                  \
                     "movl %%esp,%0\n\t"        /* save ESP */          \
                     "movl %5,%%esp\n\t"        /* restore ESP */       \
                     "movl $1f,%1\n\t"          /* save EIP */          \
                     "pushl %6\n\t"             /* restore EIP */       \
                     "jmp __switch_to\n"                                \
                     "1:\t"                                             \
                     "popl %%ebp\n\t"                                   \
                     :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
                      "=a" (last),"=S" (esi),"=D" (edi)                 \
                     :"m" (next->thread.esp),"m" (next->thread.eip),    \
                      "2" (prev), "d" (next));                          \
} while (0)



switch_to()함수가 define으로 전처리가 되어 있다니...
그나저나 저 4번째 줄에 "movl %%esp,%0\n\t" <- 이 문법을 어떻게 해석해야 될까요?
책에선 간단하게 "prev로 표시될 프로세스의 ESP 레지스터를 백업해 두고..."라고 나오는데
저는 저 어셈블리어의 작동과정과 원리가 궁금합니다.





p.s. 어셈 공부 좀 해둘 걸... ㅠㅠ

  Hit : 5238     Date : 2013/01/31 07:43



    
ka0r1 어... 소스 코드를 자세히 보니
"pushl %%ebp\n\t"
"movl %%esp,%0\n\t"
라고 적혀있는데 이게 "스택 프레임"인지 뭐시기인지 그거 아닌가요?
스택을 깨지는 것을 방지하기 위해...???
2013/01/31  
Mephist Context switching 코드네요...
%0, %1 등은.. 맨 밑에서 알려주고 있죠..
:"=m" (prev->thread.esp),"=m" (prev->thread.eip), \
"=a" (last),"=S" (esi),"=D" (edi) \
:"m" (next->thread.esp),"m" (next->thread.eip), \
"2" (prev), "d" (next)); \
입니다.
%0 은.. 맨 앞... prev->thread.esp 를 얘기합니다.. %1 는 prev->thread.eip 가 되겠죠.
2013/02/01  
Mephist 참고로~
"movl %5,%%esp\n\t" /* restore ESP */ 라인 하고...
"pushl %6\n\t" /* restore EIP */ \ 라인...
"jmp __switch_to\n" 라인이... Context switching 의 핵심입니다.

잘 분석해보세요~
2013/02/01