👉 시스템 콜의 인자로 들어오는 모든 포인터 값을 검사시스템 콜을 구현하기 위해 유저의 가상 주소 공간에 접근할 수 있는 방법을 제시해줘야 한다
void check_address(void* uaddr) {
struct thread *cur = thread_current();
if (uaddr == NULL || is_kernel_vaddr(uaddr) || pml4_get_page(cur->pml4, uaddr) == NULL) {
exit(-1);
}
}
%rax
는 system call number%rcx
가 아니라 %r10
이다syscall_handler()
가 제어권을 잡으면, system call number는 %rax
안에 있게 되고, arguments들은 %rdi
, %rsi
, %rdx
, %r10
, %r8
, %r9
순서로 전달write()
시스템 콜 호출write()
함수 호출int
write (int fd, const void *buffer, unsigned size) {
return syscall3 (SYS_WRITE, fd, buffer, size);
}
syscall3
을 호출syscall3
은 syscall을 호출syscall_handler
로 이동 후 시스템 콜 함수 호출int write(int fd, const void *buffer, unsigned size) {
check_address(buffer);
int bytes_write = 0;
if (fd == STDOUT_FILENO) {
putbuf(buffer, size);
bytes_write = size;
} else {
if (fd < 2)
return -1;
struct file *file = process_get_file(fd);
if (file == NULL)
return -1;
lock_acquire(&filesys_lock);
bytes_write = file_write(file, buffer, size);
lock_release(&filesys_lock);
}
return bytes_write;
}
시스템 콜 write
함수 호출 완료 !!