
userprog/syscall.c 내의 syscall_init는 커널 부팅 시 threads/init.c 내의 main 함수에 의해 실행됨
syscall_init 내에서 MSR 레지스터(MSR_LSTAR 등)에 syscall_entry 함수 포인터 등록
write_msr(MSR_LSTAR, (uint64_t)syscall_entry);
사용자 프로그램이 시스템 콜을 호출하면 라이브러리 내부에서 syscall 실행
syscall_entry에 작성된 어셈블리 코드 실행
syscall_handler가 인자를 받아 해당하는 작업 실행
인터럽트나 시스템 콜 발생 시, CPU 레지스터 상태, 스택 포인터, 명령어 포인터, 플래그 등 전체를 저장하는 구조체
include/threads/interrupt.h에 선언되어 있음
struct intr_frame {
/* Pushed by intr_entry in intr-stubs.S.
These are the interrupted task's saved registers. */
struct gp_registers R;
...
intr_frame→R.rsi 와 같이 가져오면 됨 !!struct gp_registers {
uint64_t r15;
uint64_t r14;
uint64_t r13;
uint64_t r12;
uint64_t r11;
uint64_t r10;
uint64_t r9;
uint64_t r8;
uint64_t rsi;
uint64_t rdi;
uint64_t rbp;
uint64_t rdx;
uint64_t rcx;
uint64_t rbx;
uint64_t rax;
} __attribute__((packed));
x86-64 CPU의 MSR(Model-Specific Register)에 값을 기록하는 함수
MSR은 무엇인가?
write_msr은 지정한 MSR에 값을 기록할 수 있음!!
write_msr(MSR_LSTAR, (uint64_t)syscall_entry);
시스템 콜을 핸들러에 등록해두어야 함
위치는? pintos-kaist/userprog/syscall.c
/* The main system call interface */
void
syscall_handler (struct intr_frame *f UNUSED) {
// TODO: Your implementation goes here.
printf ("system call!\\n");
thread_exit ();
}
fd에 buffer의 size만큼의 데이터를 씀. 실제로 쓴 바이트 수를 반환.