[Pint OS] 핀토스

[PintOS] 핀토스 뽀개기 - User Programs 1 - Argument Passing

codeomni 2024. 1. 5. 23:07
반응형


잘못된 부분은 댓글을 남겨주세요.


목표

PintOS는 기본적으로 사용자 프로그램을 실행할 때 인자를 전달하지 않습니다. 그러나 실제 운영체제에서는 사용자 프로그램이 명령어 인자(argv)를 통해 동작을 제어하므로, 이를 구현하기 위해 Argument Passing 기능을 추가해야 합니다.

process_exec() 함수는 기존에 단순히 실행 파일 이름만 받아 실행했지만, 이 단계를 확장하여 인자를 파싱하고 직절한 형태로 사용자 스택에 올려야 합니다. 이를 통해 사용자 프로그램은 일반적인 C언어 스타일의 int main(int argc, char *argv[]) 형태로 실행될 수 있습니다.


수정 파일

/userprog/process.c

/include/userprog/process.h

/devices/timer.c

/threads/thread.c


구현

1. 인자 파싱 및 전달 로직: process_exec()

1
2
3
4
5
6
7
8
9
/* threads/thread.c */
char *parse[64];char *token, *save_ptr;
int count = 0;
 
token = strtok_r(file_name, " "&save_ptr);
while (token != NULL) {
    parse[count++= token;
    token = strtok_r(NULL" "&save_ptr);
}

공백을 기준으로 실행 파일 경로 및 인자를 분리합니다. parse 배열에 토큰을 저장하며, 최대 64개 인자로 제한합니다. 

 

2. 사용자 스택에 인자 올리기: argument_stack()

1
2
3
/* userprog/process.c */
void argument_stack (char **parse, int count, void **rsp) {
}

인자 문자열을 역순으로 스택에 복사해서 포인터 배열(argv)를 역순으로 다시 삽입합니다. %rdi ← argc, %rsi ← argv[0] 주소으로 마지막으로 가짜 return address (NULL) 삽입합니다.

 

3. 디버깅을 위한 hex_dump() 활용

1
2
/* userprog/process.c */
hex_dump(_if.rsp, _if.rsp, USER_STACK - (uint64_t)_if.rsp, true);

스택의 상태를 바이너리 형식으로 출력합니다. 스택에 잘못된 값이 삽입되거나 정렬이 틀릴 경우 추적에 매우 유용합니다.

 


결과

process_exec()에서 사용자 인자를 파싱하고, 스택에 정확히 적재하는 기능을 구현합니다. 이는 사용자 프로그램이 main(int argc, char **argv) 형태로 실행되기 위한 구현입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Boot complete.
Putting 'args-single' into the file system...
Executing 'args-single onearg':
000000004747ffc0                          00 00 00 00 00 00 00 00 |        ........|
000000004747ffd0  ed ff 47 47 00 00 00 00-f9 ff 47 47 00 00 00 00 |..GG......GG....|
000000004747ffe0  00 00 00 00 00 00 00 00-00 00 00 00 00 61 72 67 |.............arg|
000000004747fff0  73 2d 73 69 6e 67 6c 65-00 6f 6e 65 61 72 67 00 |s-single.onearg.|
system call!
Execution of 'args-single onearg' complete.
Timer: 130 ticks
Thread: 30 idle ticks, 95 kernel ticks, 5 user ticks
hd0:00 reads, 0 writes
hd0:185 reads, 264 writes
hd1:0118 reads, 0 writes
Console: 1227 characters output
Keyboard: 0 keys pressed
Exception: 0 page faults
Powering off...

 


GITHUB

깃허브 Merge pull request입니다.
https://github.com/laphayen/pintos-kaist/pull/8/files

 

Argument passing by laphayen · Pull Request #8 · laphayen/pintos-kaist

Project 2의 Argument Passing 구현입니다. 실행하려는 프로그램의 이름과 인자들을 받아 새 프로세스를 생성하고 실행하는 과정으로 문자열을 분리하여 프로세스 스택에 사용자가 제공한 인자들이 저

github.com