π©π»βπ» GITHUB λ ν¬μ§ν 리
π©π»βπ» GITHUB System Call μ΄μ
μ°μ project 2λ₯Ό μ§ννκΈ° μν΄ μμλ₯Ό μ ν΄μΌνλ€.
μΆμ²νλ λ°©μμ
1οΈβ£ #3 System Call -> #5 File Descriptor -> #4. Hierarchical Process Structure
2οΈβ£ File related -> Process related
1λ²μ νμλ κ°μμλ£μ μμλ₯Ό ꡬννκΈ° μ½κ² μμλ‘ λ°κΎΌ κ²μ΄κ³ ,
2λ²μ μΉ΄μ΄μ€νΈ κ°μμλ£μ μμμ΄λ€.
2λ²μΌλ‘ νλ©΄ file relatedμμ λΆλμ΄ κΈΈμ΄μ§κΈ°μ, 1λ²μΌλ‘ μ§ννλ € νλ€.
νν μ€λ μμ€ν μ½ νΈλ€λ¬κ° ꡬνλμ΄ μμ§ μμ μμ€ν μ½μ΄ μ²λ¦¬λμ§ μλλ€.
π System Callμ΄λ?
μμ€ν μ½μ μ¬μ©μκ° μ»€λ μμμ μ κ·Όνκ³ μΆμ λ, μνλ λͺ©μ μ λμ ν΄μ μμ νλ νλ‘κ·Έλλ° μΈν°νμ΄μ€μ΄λ€. κ·Έλ κΈ° λλ¬Έμ μμ€ν μ½μ 컀λ λͺ¨λμμ μ€νλκ³ , μμ ν μ¬μ©μ λͺ¨λλ‘ λ³΅κ·νλ€. PintOSμμλ μ΄λ₯Ό μμ€ν μ½ νΈλ€λ¬λ₯Ό ν΅ν΄ μμ€ν μ½μ νΈμΆνλ€.
μμ€ν μ½(halt, exit,create, remove)μ ꡬννκ³ μμ€ν μ½ νΈλ€λ¬λ₯Ό ν΅ν΄ νΈμΆν΄μΌνλ€.
π‘μμ€ν μ½ νΈλ€λ¬ λ° μμ€ν μ½ (halt, exit, create, remove) ꡬννμ!!
Gitbookμμ μμ€ν
μ½ κ³Όμ μ΄μ μ λμ€λ User memory accessλ μμ€ν
μ½μ ꡬνν λ λ©λͺ¨λ¦¬μ μ κ·Όν ν
λ°, μ΄λ μ κ·Όνλ λ©λͺ¨λ¦¬ μ£Όμκ° μ μ μμμΈμ§ 컀λ μμμΈμ§λ₯Ό 체ν¬νλΌλ κ³Όμ μ΄λ€. μ΄λ νμλ κ°μμλ‘ pdf μμ€ν
μ½ κ³Όμ μ μλ check_address()
μ ν΄λΉνλ―λ‘ μ΄ ν¨μλΆν° ꡬννκ³ μμνλ€.
π‘ μ€μ
void νμμ return μΆκ°ν΄μΌν¨. (λλ²κΉ νλ€ λ°κ²¬ν μ¬μ€)
π‘ μ€μ
forkμ μΈμ κ°μλ₯Ό λ³κ²½νμ¬ κ΅¬νν μ μλλ°, μμλ‘ λ³κ²½ νλ©΄ μλλ€!!!
void
syscall_handler (struct intr_frame *f UNUSED) {
// TODO: Your implementation goes here.
/** project2-System Call */
int sys_number = f->R.rax;
// Argument μμ
// %rdi %rsi %rdx %r10 %r8 %r9
switch (sys_number) {
case SYS_HALT:
halt();
break;
case SYS_EXIT:
exit(f->R.rdi);
break;
case SYS_FORK:
f->R.rax = fork(f->R.rdi);
break;
case SYS_EXEC:
f->R.rax = exec(f->R.rdi);
break;
case SYS_WAIT:
f->R.rax = process_wait(f->R.rdi);
break;
case SYS_CREATE:
f->R.rax = create(f->R.rdi, f->R.rsi);
break;
case SYS_REMOVE:
f->R.rax = remove(f->R.rdi);
break;
case SYS_OPEN:
f->R.rax = open(f->R.rdi);
break;
case SYS_FILESIZE:
f->R.rax = filesize(f->R.rdi);
break;
case SYS_READ:
f->R.rax = read(f->R.rdi, f->R.rsi, f->R.rdx);
break;
case SYS_WRITE:
f->R.rax = write(f->R.rdi, f->R.rsi, f->R.rdx);
break;
case SYS_SEEK:
seek(f->R.rdi, f->R.rsi);
break;
case SYS_TELL:
f->R.rax = tell(f->R.rdi);
break;
case SYS_CLOSE:
close(f->R.rdi);
break;
default:
exit(-1);
}
}
/** project2-System Call */
void
check_address (void *addr)
{
if (is_kernel_vaddr(addr) || addr == NULL || pml4_get_page(thread_current()->pml4, addr) == NULL)
exit(-1);
}
/** project2-System Call */
#include <stdbool.h>
void check_address(void *addr);
void halt(void);
void exit(int status);
bool create(const char *file, unsigned initial_size);
bool remove(const char *file);
void
halt(void)
{
power_off();
}
exit(), wait() ꡬν λ μ¬μ©λ exit_statusλ₯Ό μΆκ°νκ³ μ΄κΈ°ν ν΄μ£Όμ΄μΌνλ€.
#define USERPROG
#ifdef USERPROG
/* Owned by userprog/process.c. */
uint64_t *pml4; /* Page map level 4 */
/** project2-System Call */
int exit_status;
#endif
t->original_priority = t->priority;
t->niceness = NICE_DEFAULT;
t->recent_cpu = RECENT_CPU_DEFAULT;
/** project2-System Call */
t->exit_status = 0;
}
void
exit(int status)
{
struct thread *t = thread_current();
t->exit_status = status;
printf("%s: exit(%d)\n", t->name, t->exit_status); // Process Termination Message
thread_exit();
}
-userprog/syscall.c
bool
create(const char *file, unsigned initial_size)
{
check_address(file);
return filesys_create(file, initial_size);
}
bool
remove(const char *file)
{
check_address(file);
return filesys_remove(file);
}
λ€μ ν¬μ€ν κΈ°λ€λ¦½λλ€...