ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 71일차] Pintos project 2 - System Calls 구현 3일차
    기타/SW 사관학교 정글 2021. 10. 12. 14:06
    /* 구현 완료 */
    void halt (void) NO_RETURN;
    /* 구현 완료 */
    void exit (int status) NO_RETURN;
    pid_t fork (const char *thread_name);
    /* 구현 완료 */
    int exec (const char *file);
    /* 구현 완료 */
    int wait (pid_t);
    bool create (const char *file, unsigned initial_size);
    bool remove (const char *file);
    int open (const char *file);
    int filesize (int fd);
    int read (int fd, void *buffer, unsigned length);
    int write (int fd, const void *buffer, unsigned length);
    void seek (int fd, unsigned position);
    unsigned tell (int fd);
    void close (int fd);

     

     

     

    1. bool create(const char *file, unsigned initial_size)

    create() syscall은 첫 번째 인자인 file을 이름으로 가지는 file을 생성하는데 파일의 크기 초기화를 인자로 받은 initial_size로 해주는 것이다.

    성공적으로 create를 했다면 true를 반환하고 그렇지 않으면 false를 반환한다.

     

    file을 create해주기 전에 인자로 받은 file 주소 값이 user 영역에 있는지 check_address()를 통해 확인을 해준다.user 영역에 있는 주소라는 것이 확인되면 filesys.c에 있는 filesys_create()함수를 사용하여 create해주면 된다.filesys_create()함수를 해석하는 것이 creat() syscall을 구현하는 것의 핵심인데 아직은 file system에 대한 개념이 없어 이해하기 힘들다..project 4 때 file system을 공부하고 다시 볼 생각이다.

     

     

     

    2. bool remove (const char *file)

    remove() syscall은 인자로 받은 file을 이름으로 가진 파일을 삭제하는 역할을 한다.

    성공적으로 삭제를 했다면 true를 반환하고 실패했다면 false를 반환한다.

    파일이 open되어있거나 close되었다는 것에 상관없이 삭제를 진행하고 open상태인 파일을 삭제하는 것은 파일을 close하는 것이 아니다.

     

    create와 마찬가지로 check_address()를 통해 user 영역에 있는 주소인지 확인을 해주고 filesys.c에 있는 file_remove()를 사용하면 되는데 지금 상태에서는 이해가 잘 되는 부분은 아니다.

    project 4 때 다시 볼 예정이다.

     

     

     

    3. int filesize (int fd)

    filesize() syscall은 인자로 받은 file disciptor가 가리키는 파일의 사이즈를 byte단위로 반환해주는 역할을 한다.

     

    구현은 스레드 구조체에 file을 관리해주는 file 구조체 투포인터형 멤버 file table을 추가해준다.

    투포인터를 하는 이유는 이전에 스레드 구조체를 설명할 때 4kb 이내로 늘릴 수 있다고 한 적이 있다.

    만약에 원포인터로 포인터 배열으로 선언한다면 구조체의 크기가 4kb를 넘을 수 있으므로 투포인터로 선언하여 palloc을 이용하여 공간을 확보한 곳을 가리키는 것으로 생각을 했다.

     

    이렇게 file discriptor를 관리하는 멤버를 추가하면 해당 멤버 안에 인자로 받은 file discriptor에 해당하는 파일의 길이를 반환해주면 된다.

     

     

    남은 file system과 관련된 syscall인 open, close, read, write는 조금 더 개념을 공부하고 시도해야할 것같다...
    그리고 syscall 대장 fork를 꼭 해볼 수 있도록 하자..

     


    [오늘의 나는 어땠을까?]

    이제 project 2를 할 날도 하루 밖에 남지 않았다...

    아쉬움이 많이 남는 주차이다.

    선택과 집중이 필요한 시기에 애매모호하게 행동하고 이렇게까지 시간이 지난 지금, 내가 얻은 것들이 무엇일까?라는 의문이 든다.

    책을 본 시간도 있고 코테를 준비하는 시간, pintos 구현코드를 이해하는 시간 등... 한 것은 있기는 한데 아쉬움이 많다..

    언제나 이러한 아쉬움이 들었지만 이번에는 더 큰 것같다.

    내일은 이번 주차의 마지막 날이니까 remind하고 궁금하던 포인트를 다시 볼 생각이다.

    주차 마무리를 잘 짓도록 한다.

     

     

    댓글

Designed by Tistory.