외부에서 레이블을 액세스 코드 :함수
/* ctsw.c : context switcher
*/
#include <kernel.h>
static void *kstack;
extern int set_evec(int, long);
/* contextswitch - saves kernel context, switches to proc */
enum proc_req contextswitch(struct proc_ctrl_blk *proc) {
enum proc_req call;
kprintf("switching to %d\n", getpid(proc));
asm volatile("pushf\n" // save kernel flags
"pusha\n" // save kernel regs
"movl %%esp, %0\n" // save kernel %esp
"movl %1, %%esp\n" // load proc %esp
"popa\n" // load proc regs (from proc stack)
"iret" // switch to proc
: "=g" (kstack)
: "g" (proc->esp)
);
_entry_point:
asm volatile("pusha\n" // save proc regs
"movl %%esp, %0\n" // save proc %esp
"movl %2, %%esp\n" // restore kernel %esp
"movl %%eax, %1\n" // grabs syscall from process
"popa\n" // restore kernel regs (from kstack)
"popf" // restore kernel flags
: "=g" (proc->esp), "=g" (call)
: "g" (kstack)
);
kprintf("back to the kernel!\n");
return call;
}
void contextinit() {
set_evec(49, (long)&&_entry_point);
}
그것은 작은, 협력, 비 선점 형 커널에 대한 컨텍스트 스위처입니다. contextswitch()
은로드 할 프로세스의 스택 포인터와 함께 dispatcher()
에 의해 호출됩니다. % esp 및 기타 범용 레지스터가로드되면 iret
이 호출되고 사용자 프로세스가 실행되기 시작합니다.
나는 그래서 커널 컨텍스트를 복원하고 dispatcher()
에 콜의 값을 반환 할 수 iret
후 contextswitch()
에서 지점으로 돌아갑니다 설정에 인터럽트가 필요합니다.
가 어떻게이 함수 외부에서 _entry_point
의 메모리 주소를 액세스 할 수 있습니다
이 좋은 생각, 내가 이미하지 않은 경우 디스패처 및 프로세스 제어 코드가 이미 가정 작성 다른 모델, 나는 그것을 사용할지도 모른다. –