파일 디스크립터(file descriptor) :
리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다. 파일 스크립터는 일반적으로 음수가 아닌 0과 양수인 정수 값을 의미한다.
- 기본적으로 할당되는 파일 디스크립터
- 0 : 표준 입력(Standard Input) / STDIN_FILENO
- 1 : 표준 출력(Standard Output) / STDOUT_FILENO
- 2 : 표준 에러(Standard Error) / STDERR_FILENO
우리가 생성하는 파일 디스크립터들은 3번부터 차례대로 할당받게 된다.
void halt(void):
power_off()를 호출하여 pintos를 종료합니다. 이 함수는 교착 상태 등에 대한 정보를 잃게 되므로 거의 사용하지 않는 것이 좋습니다.
void exit(int status):
현재 사용자 프로그램을 종료하여 커널에 상태를 반환합니다. 프로세스의 부모가 기다리는 경우 반환되는 상태이다. 일반적으론 0은 성공을 나타내고 0이 아닌 값을 오류를 나타냅니다.
PID_T FORK (const char *THREAD_NAME):
현재 프로세스의 복제본인 새 프로세스를 THREAD_NAME이라는 이름으로 생성합니다. (이 프프로세스가 자식 프로세스) 자식 프로세스의 PID를 반환합니다. 자식 프로세스에서는 0을 반환합니다.
int exec (const char *cmd_line):
주어진 인자를 전ㄷ라하여, 현재 프로세스를 cmd_line에 지정된 이름을 가진 실행 파일로 변경합니다.
int wait(pid_t pid):
자식 프로세스 pid를 기다렸다가 자식의 종료 상태를 검색합니다. pid가 아직 살아있다면 종료될 때까지 기다립니다. 그런 다음 pid가 종료하기 위해 전달한 상태를 반환합니다.
pid가 exit()를 호출하지 않았지만 커널에 의해 종료된 경우(예외처리로 인해서) -1을 반환합니다.
bool creaet(const char *file, unsigned initial_size):
initial_size 크기의 새 파일을 생성하고 성공하면 true를 실패하면 false를 리턴 합니다. 새 파일이 생성된다고 해서 파일이 열리지는 않습니다. 새 파일을 열려면 open System Call이 필요합니다.
bool remove(const char *file):
file 파일을 삭제합니다. 성공하면 true, 그렇지 않으면 false를 리턴합니다. 파일은 열려있는지 닫혀있는지에 관계없이 제거 할 수 있으며, 열려있는 파일을 제거해도 닫히지 않습니다.
int open(const char *file):
file 파일을 엽니다. file descriptor가 음수가 아닌 정수를 반환하거나 파일을 열 수 없는 경우 -1을 반환합니다.
int filesize(int fd):
fd로 열린 파일의 크기를 반환합니다.
int read(int fd, void *buffer, unsigned size):
fd로 열린 파일에서 버퍼로 크기 바이트를 읽습니다. 실제로 읽은 바이트 수를 반환하거나, 파일을 읽을 수 없는 경우 -1을 반환합니다. fd 0은 input_getc()를 사용하여 키보드에서 읽은 값입니다.
int write(int fd, const void *buffer, unsigned size):
버퍼에서 열린 파일 fd에 크기 바이트를 씁니다. 실제로 쓰여진 바이트 수를 반환하며, 일부 바이트가 쓰여지지 않은 경우 크기보다 작을 수 있습니다. 파일 끝을 지나서 쓰면 일반적으로 파일이 확장되지만 기본 파일 시스템에서는 파일 확장이 구현되지 않습니다.
void seek(inf fd, unsigned position):
열린 파일 fd에서 읽거나 쓸 다음 바이트를 파일 시작부터 바이트 단위로 표시되는 위치로 변경합니다 (위치가 0이면 파일의 시작). 파일의 현재 끝을 지나서 찾는 것은 오류가 아닙니다 후에 read 는 0 바이트를 얻고, 파일의 끝을 나타냅니다. 나중에 write 는 파일을 확장하여 기록되지 않은 간격을 0으로 채웁니다. ( pintos에서는 프로젝트 4가 완료할 때까지 파일 길이가 고정되어 있으므로 파일 끝을 지나서 쓰면 오류가 반환됨)
unsigned tell (int fd):
열린 파일 fd에서 읽거나 쓸 다음 바이트의 위치를 파일 시작부터 바이트로 표현하여 반환합니다.
void close(int fd):
fd를 닫습니다. 프로세스를 종료하거나 종료하면 마치 이 함수를 각각 호출하는 것처럼 열려있는 모든 fd를 암시적으로 닫습니다.
프로세스과 관련된 System calls
- halt , exit , exec, wait
파일 관련된 System calls
- create, remove, open, filesize, read, write, seek, tell, close
📌 - 64비트 범용 레지스터
👉 - 포인터 레지스터(RSI, RDI, RBP, RSP)
RSI(Extended Source Index) / RDI(Extended Destination Index)
문자열 출발지/목적지 주소. 확장 소스 인덱스, 확장 목적지 인덱스 레지스터. 각각 메모리 출발지와 목적지를 나타냄. 고속 메모리 전송 명령어에서 사용.
RSP(Extended Stack Pointer)
현재 스택 주소. 그러니까 스택 맨 윗쪽 주소. 스택에 있는 데이터의 주소를 지정. 계산, 데이터 전송에는 거의 사용되지 않는다
RBP(Extended Base Pointer)
스택 복귀 주소. 고급언어에서 스택에 있는 함수 매개변수와 지역변수를 참조하기 위해서 사용. 고급 수준의 프로그래밍 이외에 일반적 계산과 데이터 전송에서 사용되지 않아야.RSP, RBP에 대한 자세한 설명
RIP
현재 명령 실행 주소
r8 ~ r15
일반적으로 함수의 매개변수로 사용
👉 - 데이터 레지스터 (RAX ~ RDX)
RAX(Extended Accumulator Register)
사칙연산 명령어에서 자동으로 사용, 리턴 레지스터시스템콜의 실질적인 번호를 가리키는 레지스터
RBX(Extended Base Register)
메모리 주소를 저장하는 용도로 사용
RCX(Extended Counter Register)
CPU는 루프 카운터로 ECX를 자동으로 사용
RDX(Extended Data Register)
EAX와 같이 사용됨.