Linux의 task_struct 의 소스를 분석
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

목차

1. 문제정의

2. task struct_2.6.20 구조체

3. task_struct_2.6.20 source

4. context switch (문맥 교환)

5. context switch source

본문내용

불러온다. ]
sethi.p%hi(__kernel_frame0_ptr),gr6
setlo%lo(__kernel_frame0_ptr),gr6
movsgpsr,gr4
lddi.p@(gr9,#__THREAD_FRAME),gr10
orgr10,gr10,gr27
ldi@(gr11,#4),gr19
lddi@(gr9,#__THREAD_SP),gr12
ldi@(gr9,#__THREAD_LR),gr14
ldi@(gr9,#__THREAD_PC),gr18
ldi.p@(gr9,#__THREAD_FRAME0),gr7
or gr10, gr10, gr27
- prev 를 저장해둔다.
ldi @(gr11,#4), gr19
- new_current 의 thread_info 값을 가져온다.
[ kernal context switching 을 수행한다. ]
# actually switch kernel contexts with ordinary exceptions disabled
andigr4,#~PSR_ET,gr5
movgsgr5,psr
or.pgr10,gr0,gr28 set __frame
or.pgr10,gr0,gr28 set __current
or.pgr12,gr0,sp
orgr13,gr0,fp
orgr19,gr0,gr15 set __current_thread_info
stigr7,@(gr6,#0) set __kernel_frame0_ptr
stigr29,@(gr6,#4) set __kernel_current_task
movgsgr14,lr
bar
srligr15,#28,gr5
subiccgr5,#0xc,gr0,icc0
beqicc0,#0,111f
break
nop
111:
or.pgr10,gr0,gr28
- frame 을 설정한다.
or.pgr10,gr0,gr28
- current 를 설정한다.
orgr19,gr0,gr15
- current_thread_info 를 설정한다.
stigr7,@(gr6,#0)
- kernel_frame0_ptr 을 설정한다.
stigr29,@(gr6,#4)
- kernal_current_task 를 설정한다.
[ prev 로 돌아간다 ]
# jump to __switch_back or ret_from_fork as appropriate
# - move prev to GR8
movgsgr4,psr
jmpl.p@(gr18,gr0)
orgr27,gr27,gr8
switch_back 이나 ret_from_fork 로 jump 해서 prev 로 돌아간다.
# system call handler stub
ENTRY(system_call)
RING0_INT_FRAME# can't unwind into user space anyway
pushl %eax # save orig_eax
CFI_ADJUST_CFA_OFFSET 4
SAVE_ALL
...
syscall_call:
call *sys_call_table(,%eax,4)
movl %eax,PT_EAX(%esp)# store the return value
pushl %eax
- orig_eax (기존의) 레지스터를 저장해 둔다.
SAVE ALL
- 레지스터들을 Stack 에 push 해 둔다.
call *sys_call_table(,%eax,4)
- sys_call_table[] 에 등록된 함수를 호출한다. 호출결과는 eax 에 저장된다.
movl %eax,PT_EAX(%esp)
- eax 값을 나중에 돌려주기 위해서 stack 에 저장한다.
*참고* system_call() 함수는 어셈블리어 ENTRY(system_call)로 정의된다. arch\i386\kernel 에 entry.S 파일을 보면 system_call 이 어셈블리 language 로 구현된것을 볼수 있다.
ENTRY(resume_userspace)
DISABLE_INTERRUPTS(CLBR_ANY)# make sure we don't miss an interrupt
# setting need_resched or sigpending
# between sampling and the iret
movl TI_flags(%ebp), %ecx
andl $_TIF_WORK_MASK, %ecx# is there any work to be done on
# int/exception return?
jne work_pending
jmp restore_all
DISABLE_INTERRUPTS(CLBR_ANY)
- 인터럽트 발생을 막는다.
restore_all
- restore_all 메크로를 통해 이전에 저장했던 레지스터 값들을 다시 부른다.
#ifdef CONFIG_PREEMPT
ENTRY(resume_kernel)
DISABLE_INTERRUPTS(CLBR_ANY)
cmpl $0,TI_preempt_count(%ebp)# non-zero preempt_count ?
jnz restore_nocheck
need_resched:
movl TI_flags(%ebp), %ecx# need_resched set ?
testb $_TIF_NEED_RESCHED, %cl
jz restore_all
testl $IF_MASK,PT_EFLAGS(%esp)# interrupts off (exception path) ?
jz restore_all
call preempt_schedule_irq
jmp need_resched
#endif
CFI_ENDPROC
cmpl $0,TI_preempt_count(%ebp)
jnz restore_nocheck
- preempt_count 가 설정되어 있는지 확인하여, 만약 설정되어 있다면 restore_nocheck를 수행한다.
testb $_TIF_NEED_RESCHED, %cl
testl $IF_MASK,PT_EFLAGS(%esp)
call preempt_schedule_irq
- need_resched 가 설정되어 있고, interrupts 가off 되어있으면 preempt_schedule_irq 를 호출한다.
jz restore_all
- 그렇지 않은 경우에는 restore_all 매크로를 실행하여 이전에 저장했던 레지스터 값들을 다시 부른다.

키워드

  • 가격2,000
  • 페이지수11페이지
  • 등록일2008.01.13
  • 저작시기2007.4
  • 파일형식한글(hwp)
  • 자료번호#447062
본 자료는 최근 2주간 다운받은 회원이 없습니다.
  • 편집
  • 내용
  • 가격
청소해
다운로드 장바구니