목차
1. 문제정의
2. task struct_2.6.20 구조체
3. task_struct_2.6.20 source
4. context switch (문맥 교환)
5. context switch source
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 매크로를 실행하여 이전에 저장했던 레지스터 값들을 다시 부른다.
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 매크로를 실행하여 이전에 저장했던 레지스터 값들을 다시 부른다.
키워드
추천자료
캐릭터 마케팅에 대한 이해와 캐릭터 마케팅 성공 사례 분석 (포켓몬스터, 헬로키티의 사례)
샌드위치 외식업체 Subway의 마케팅 현황과 마케팅 전략 분석 및 나아갈 방향
[C언어]예제를 통한 조건문(if문, switch문) 분석
리눅스 커널 2.6 task_struct (context switch)분석
[e비즈니스]인터넷서점 'YES24'와 '교보문고'의 6C전략 분석 (리포트)
[C언어] 피보나치수열 리커시브와 인터렉티브 방식 프로그램 시간분석
식객(만화, 영화, 드라마 비교분석)
소팅 알고리즘(sorting algorithm) 구현 및 분석
[경영학마케팅A+] 서브웨이(Sandwich Franchise) 기업소개 및 마케팅전략과 swot분석 및 향후...
스마트폰(Smart Phone) - 스마트폰전략 및 분석,스마트폰의 기능적속성,스마트폰현재와미래,S...
CJ E&M (Entertainment & Media) CJ엔터테인먼트 기업분석 및 마케팅전략,CJ엔터테인...
파스타 전문레스토랑 창업계획서,수제 파스타 전문점 창업 사업계획서,시장동향분석
『산업별 장수기업의 리더 연구』장수기업의 리더, 기업가들의 특징 비교 및 분석, 몽고식품,...
[★PPT★][서울seoul 여행 코스 분석] 귀여운 허세녀 여친님을 위한 서울 속 세계여행, 서울 세...