System Call
시스템콜 함수
추가적인 수정이 필요함..
check_addr()
받아온 주소의 유효성을 검사
- 가상 메모리와 주소가 맵핑된 것이 없는 경우
- 주소가 유저 스택의 최상단 주소보다 같거나 큰 경우(유저 영역이 아닌 경우)
- 주소가 NULL인 경우
void check_addr(void *addr)
{
// 가상메모리와 매핑된게 없거나 유저스택보다 같거나 크고 NULL이면 종료(exit)
if (pml4_get_page(thread_current()->pml4, addr) == NULL || !is_user_vaddr(addr) || addr == NULL)
{
exit(-1);
}
}
halt()
power_off를 호출해서 PintOS를 종료시킴
void halt(void)
{
power_off();
}
exit()
현재 실행 중인 쓰레드의 exit_status 상태를 저장하고 쓰레드를 종료시킴
void exit(int status)
{
struct thread *curr = thread_current();
curr->exit_status = status;
printf("%s: exit(%d)\n", curr->name, status);
thread_exit();
}
read()
파일 디스크립터를 이용해 파일을 찾아서 버퍼에서 크기만큼 읽어들임
int read(int fd, void *buffer, unsigned size)
{
check_addr(buffer);
struct thread *curr = thread_current();
struct file *curr_file = curr->fdt[fd];
if (fd < 0 || fd >= 64)
{
return -1;
}
return file_read(curr_file, buffer, size);
}
write()
파일 디스크립터가 1인지 확인하고 버퍼에서 실제로 쓰여진 길이만큼을 반환함
int write(int fd, const void *buffer, unsigned length)
{
check_addr(buffer);
if (fd < 1 || fd > 63)
{
return -1;
}
if (fd == 1)
{
putbuf(buffer, length);
}
return length;
}
create()
사이즈를 체크하고 파일을 생성함
bool create(const char *file, unsigned initial_size)
{
check_addr(file);
if (initial_size < 0)
{
return false;
}
else
{
return filesys_create(file, initial_size);
}
}
remove()
파일명으로 파일을 제거
bool remove(const char *file)
{
check_addr(file);
return filesys_remove(file);
};
open()
파일 디스크립터 테이블에 오픈할 파일을 지정하고 next_fd를 빈 곳을 찾아서 갱신
int open(const char *file)
{
check_addr(file);
struct file *curr_file;
struct thread *curr = thread_current();
int target;
curr_file = filesys_open(file);
if (curr_file == NULL)
{
return -1;
}
curr->fdt[curr->next_fd] = curr_file; // fd에 파일 주소 삽입
target = curr->next_fd;
for (int i = curr->next_fd + 1; i < 64; i++)
{
if (curr->fdt[i] == NULL)
{
curr->next_fd = i;
return target;
}
}
return -1;
};
close()
현재 실행 중인 쓰레드에서 파일을 닫고 파일 디스크립터 테이블에서 NULL로 갱신
void close(int fd)
{
struct thread *curr = thread_current();
if (fd != NULL)
{
return;
}
else
{
file_close(curr->fdt[fd]);
curr->fdt[fd] = NULL;
}
}
filesize()
파일 디스크립터가 유효한지 확인하고 파일의 크기(byte 단위)를 반환(fd 0, 1은 표준 입출력)
int filesize(int fd)
{
struct thread *curr = thread_current();
if (fd < 2 || fd > 63)
{
return -1;
}
struct file *curr_file = curr->fdt[fd];
if (curr_file == NULL)
{
return -1;
}
return file_length(curr_file);
};
결 과
pass tests/threads/priority-donate-chain
pass tests/userprog/args-none
pass tests/userprog/args-single
pass tests/userprog/args-multiple
pass tests/userprog/args-many
pass tests/userprog/args-dbl-space
pass tests/userprog/halt
pass tests/userprog/exit
pass tests/userprog/create-normal
pass tests/userprog/create-empty
pass tests/userprog/create-null
pass tests/userprog/create-bad-ptr
pass tests/userprog/create-long
pass tests/userprog/create-exists
pass tests/userprog/create-bound
pass tests/userprog/open-normal
pass tests/userprog/open-missing
pass tests/userprog/open-boundary
pass tests/userprog/open-empty
pass tests/userprog/open-null
pass tests/userprog/open-bad-ptr
pass tests/userprog/open-twice
pass tests/userprog/close-normal
pass tests/userprog/close-twice
pass tests/userprog/close-bad-fd
pass tests/userprog/read-normal
pass tests/userprog/read-bad-ptr
pass tests/userprog/read-boundary
pass tests/userprog/read-zero
pass tests/userprog/read-stdout
pass tests/userprog/read-bad-fd
pass tests/userprog/write-normal
pass tests/userprog/write-bad-ptr
pass tests/userprog/write-boundary
pass tests/userprog/write-zero
pass tests/userprog/write-stdin
pass tests/userprog/write-bad-fd
FAIL tests/userprog/fork-once
FAIL tests/userprog/fork-multiple
FAIL tests/userprog/fork-recursive
FAIL tests/userprog/fork-read
FAIL tests/userprog/fork-close
FAIL tests/userprog/fork-boundary
FAIL tests/userprog/exec-once
FAIL tests/userprog/exec-arg
FAIL tests/userprog/exec-boundary
FAIL tests/userprog/exec-missing
FAIL tests/userprog/exec-bad-ptr
FAIL tests/userprog/exec-read
FAIL tests/userprog/wait-simple
FAIL tests/userprog/wait-twice
FAIL tests/userprog/wait-killed
FAIL tests/userprog/wait-bad-pid
FAIL tests/userprog/multi-recurse
FAIL tests/userprog/multi-child-fd
FAIL tests/userprog/rox-simple
FAIL tests/userprog/rox-child
FAIL tests/userprog/rox-multichild
pass tests/userprog/bad-read
pass tests/userprog/bad-write
pass tests/userprog/bad-read2
pass tests/userprog/bad-write2
pass tests/userprog/bad-jump
pass tests/userprog/bad-jump2
pass tests/filesys/base/lg-create
FAIL tests/filesys/base/lg-full
FAIL tests/filesys/base/lg-random
FAIL tests/filesys/base/lg-seq-block
FAIL tests/filesys/base/lg-seq-random
pass tests/filesys/base/sm-create
FAIL tests/filesys/base/sm-full
FAIL tests/filesys/base/sm-random
FAIL tests/filesys/base/sm-seq-block
FAIL tests/filesys/base/sm-seq-random
FAIL tests/filesys/base/syn-read
FAIL tests/filesys/base/syn-remove
FAIL tests/filesys/base/syn-write
FAIL tests/userprog/no-vm/multi-oom
pass tests/threads/alarm-single
pass tests/threads/alarm-multiple
pass tests/threads/alarm-simultaneous
pass tests/threads/alarm-priority
pass tests/threads/alarm-zero
pass tests/threads/alarm-negative
pass tests/threads/priority-change
pass tests/threads/priority-donate-one
pass tests/threads/priority-donate-multiple
pass tests/threads/priority-donate-multiple2
pass tests/threads/priority-donate-nest
pass tests/threads/priority-donate-sema
pass tests/threads/priority-donate-lower
pass tests/threads/priority-fifo
pass tests/threads/priority-preempt
pass tests/threads/priority-sema
pass tests/threads/priority-condvar
pass tests/threads/priority-donate-chain
33 of 95 tests failed.
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 71 ~83(Virtual Memory) (0) | 2024.06.03 |
---|---|
크래프톤 정글 5기 TIL - Day 70 (0) | 2024.05.30 |
크래프톤 정글 5기 TIL - Day 64~66(Pintos Project 2) (1) | 2024.05.24 |
크래프톤 정글 5기 TIL - Day 60 ~ 64(PintOS Project 2) (0) | 2024.05.20 |
크래프톤 정글 5기 TIL - Day 53 ~ 59 (0) | 2024.05.13 |