[Pintos-KAIST] Project 2 : System Call

μœ μ„ Β·2024λ…„ 5μ›” 6일
1

Pintos - KAIST

λͺ©λ‘ 보기
7/16
post-thumbnail

πŸ‘©πŸ»β€πŸ’» 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()에 ν•΄λ‹Ήν•˜λ―€λ‘œ 이 ν•¨μˆ˜λΆ€ν„° κ΅¬ν˜„ν•˜κ³  μ‹œμž‘ν•œλ‹€.

κ΅¬ν˜„

1. syscall_handler() ν•¨μˆ˜ κ΅¬ν˜„

  • userprog/syscall.c
    μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•  λ•Œ, μ›ν•˜λŠ” κΈ°λŠ₯에 ν•΄λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 콜 번호λ₯Ό rax에 λ‹΄λŠ”λ‹€. 그리고 μ‹œμŠ€ν…œ 콜 ν•Έλ“€λŸ¬λŠ” rax의 숫자둜 μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜κ³ , ν•΄λ‹Ή 콜의 λ°˜ν™˜κ°’μ„ λ‹€μ‹œ rax에 λ‹΄μ•„μ„œ intr frame(μΈν„°λŸ½νŠΈ ν”„λ ˆμž„)에 μ €μž₯ν•œλ‹€.

πŸ’‘ μ€‘μš”
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);
    }
}

2. check_address() ν•¨μˆ˜ κ΅¬ν˜„

  • userprog/syscall.c
  • μ£Όμ†Œ 값이 μœ μ € μ˜μ—­μ—μ„œ μ‚¬μš©ν•˜λŠ” μ£Όμ†Œ 값인지 확인
  • μœ μ € μ˜μ—­μ„ λ²—μ–΄λ‚œ μ˜μ—­μΌ 경우 ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ(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);
}

3. System Call ν•¨μˆ˜ μ„ μ–Έ

  • include/userprog/syscall.h
/** 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);

4. halt() ν•¨μˆ˜ κ΅¬ν˜„

  • userprog/syscall.c
  • ν•€ν† μŠ€λ₯Ό μ’…λ£Œμ‹œν‚€λŠ” μ‹œμŠ€ν…œ 콜
void 
halt(void) 
{
    power_off();
}

5. exit_status 자료 ꡬ쑰 μΆ”κ°€ 및 μ΄ˆκΈ°ν™”

exit(), wait() κ΅¬ν˜„ λ•Œ μ‚¬μš©λ  exit_statusλ₯Ό μΆ”κ°€ν•˜κ³  μ΄ˆκΈ°ν™” ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

  • include/threads/thread.h
#define USERPROG 
#ifdef USERPROG
	/* Owned by userprog/process.c. */
	uint64_t *pml4;                     /* Page map level 4 */
	/** project2-System Call */
	int exit_status;
#endif
  • threads/thread.c
    t->original_priority = t->priority;
    t->niceness = NICE_DEFAULT;
    t->recent_cpu = RECENT_CPU_DEFAULT;

	/** project2-System Call */
	t->exit_status = 0;
}

6. exit() ν•¨μˆ˜ κ΅¬ν˜„

  • userprog/syscall.c
  • ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œμ‹œν‚€λŠ” μ‹œμŠ€ν…œ 콜
  • μ’…λ£Œ μ‹œ β€œν”„λ‘œμ„ΈμŠ€ 이름: exit(status)” 좜λ ₯ (Process Termination Message)
  • μ •μƒμ μœΌλ‘œ μ’…λ£Œ μ‹œ statusλŠ” 0
  • status : ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ μ’…λ£ŒλλŠ”μ§€ 확인

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();
}
  • Process Termination Messageλ₯Ό 미리 κ΅¬ν˜„ν•΄λ‘μž.

7. create() ν•¨μˆ˜ κ΅¬ν˜„

-userprog/syscall.c

  • νŒŒμΌμ„ μƒμ„±ν•˜λŠ” μ‹œμŠ€ν…œ 콜
  • 성곡 일 경우 true, μ‹€νŒ¨ 일 경우 false 리턴
  • file : 생성할 파일의 이름 및 경둜 정보
  • initial_size : 생성할 파일의 크기

bool 
create(const char *file, unsigned initial_size) 
{
    check_address(file);

    return filesys_create(file, initial_size);
}

8. remove() ν•¨μˆ˜ κ΅¬ν˜„

  • userprog/syscall.c
  • νŒŒμΌμ„ μ‚­μ œν•˜λŠ” μ‹œμŠ€ν…œ 콜
  • file : μ œκ±°ν•  파일의 이름 및 경둜 정보
  • 성곡 일 경우 true, μ‹€νŒ¨ 일 경우 false 리턴
bool 
remove(const char *file) 
{
    check_address(file);

    return filesys_remove(file);
}
profile
Sunny Day!

2개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 5μ›” 6일

λ‹€μŒ ν¬μŠ€νŒ… κΈ°λ‹€λ¦½λ‹ˆλ‹€...

1개의 λ‹΅κΈ€