x86-64 기반 Pint OS 프로젝트 2의 System Calls를 구현하기 위해 공부한 개념을 정리한다.
파일 시스템 콜
파일 조작을 위한 인터페이스를 제공한다. Pint OS - Project 2(System Calls)에서 구현해야 할 파일 관련 시스템 콜은 다음과 같다.
create
정의
bool create (const char *file, unsigned initial_size);
'create' 시스템 콜은 'file'이라는 이름으로 초기 크기가 'initial_size'인 새로운 파일을 생성한다. 즉, 파일 시스템에 새로운 파일을 만들고 초기 크기에 해당하는 공간을 할당한다. 이 과정에서 파일이 열리는 것(open)은 아니다. 파일을 열기(open) 위해서는 별도의 'open' 시스템 콜을 호출해야 한다!
파일이 이미 존재하는 경우나 파일 시스템에 더 이상 공간이 없는 경우에는 파일 생성(create)이 실패하게 된다.
create ()
bool
create (const char *file_name, unsigned initial_size) {
check_address (file_name);
return filesys_create (file_name, initial_size);
}
- 인자로 받은 file_name의 유효성을 체크한다.
- filesys 라이브러리 함수를 사용해서 파일을 생성한다.
remove
정의
bool remove (const char *file);
'remove' 시스템 콜은 이름이 'file'인 파일을 삭제한다. 이때, 파일이 열려있는 상태(open)인지에 상관없이 파일을 삭제할 수 있다. 삭제 작업은 파일을 닫지(close) 않는다. 즉, 파일을 삭제해도 현재 열린 파일의 상태는 유지된다.
remove ()
bool
remove (const char *file_name) {
check_address (file_name);
return filesys_remove (file_name);
}
- 인자로 받은 file_name의 유효성을 체크한다.
- filesys 라이브러리 함수를 사용해서 파일을 삭제한다.
open
정의
int open (const char *file);
'open' 시스템 콜은 이름이 'file'인 파일을 연다. 이때, 열린 파일에 대한 fd(file descriptor)를 반환한다. 만약 파일을 열 수 없는 경우에는 -1을 반환한다. fd는 파일을 식별하는 번호로, 열린 파일을 읽거나 쓸 때 사용된다. fd는 0과 1을 제외한 음수가 아닌 정수 값으로 표현되며, 0은 표준 입력(stdin)을 나타내고, 1은 표준 출력(stdout)을 나타낸다. 이러한 표준 입출력 파일 디스크립터는 'open' 시스템 콜에서 반환되지 않으며, 명시적으로 사용자가 지정하는 시스템 콜 인자로만 유효하다.
각 프로세스는 독립적인 파일 디스크립터 세트를 가지며, fd는 자식 프로세스에게 상속된다. 동일한 파일을 하나의 프로세스 또는 다른 프로세스에서 여러 번 열 경우, 각 'open' 호출은 새로운 파일 디스크립터를 반환한다. 동일한 파일에 대한 다른 파일 디스크립터는 독립적으로 닫히며 파일 위치를 공유하지 않는다.
open ()
int
open (const char *file_name) {
check_address (file_name);
struct file *file = filesys_open (file_name);
if (file == NULL)
return -1;
int fd = process_add_file (file);
if (fd == -1)
file_close (file);
return fd;
}
- 인자로 받은 file_name의 유효성을 체크한다.
- filesys 라이브러리 함수를 사용해서 파일을 연다.
- 반환값은 file 구조체이다.
- process_add_file 함수를 호출해서 file을 현재 프로세스의 파일 디스크립터 세트에 추가한다.
- open 시스템 콜로 열린 파일은 현재 프로세스에만 추가되므로, 현재 프로세스에서만 작성 가능하다.
process_add_file ()
int
process_add_file (struct file *f) {
struct thread *curr = thread_current();
struct file **fdt = curr->fdt;
while (curr->next_fd < FDT_COUNT_LIMIT && fdt[curr->next_fd])
curr->next_fd++;
if (curr->next_fd >= FDT_COUNT_LIMIT)
return -1;
fdt[curr->next_fd] = f;
return curr->next_fd;
}
- 인자로 받은 파일을 현재 프로세스의 파일 디스크립터 세트에 추가한다.
filesize
정의
int filesize (inf fd);
인자로 받은 fd로 열린 파일의 크기를 반환한다.
filesize ()
int
filesize (int fd) {
struct file *file = process_get_file (fd);
if (file == NULL)
return -1;
return file_length (file);
}
- process_get_file 함수를 호출해서, 현재 프로세스에서 fd에 해당하는 file 구조체를 가져온다.
- file 라이브러리 함수를 사용해서 file의 크기를 구한다.
'프로젝트 > Pint OS' 카테고리의 다른 글
[Pint OS] System Calls (6) (0) | 2023.06.17 |
---|---|
[Pint OS] 에러: multi-oom (0) | 2023.06.17 |
[Pint OS] System Calls (4) (0) | 2023.06.11 |
[Pint OS] System Calls (3) (0) | 2023.06.11 |
[Pint OS] System Calls (2) (0) | 2023.06.11 |