[PintOS] Argument Passing

0

pintos-project

목록 보기
5/8
post-thumbnail

해야할 일

파일 이름과 옵션이 터미널 입력을 통해 들어오는데(file_name) 파일 이름과 옵션이 한 문자열에 합쳐져 있기 때문에 그걸 띄어쓰기 기준으로 split하고 결과물을 stack으로 넣어야한다.

한양대과제를 참고할 경우 PDF엔 start_process 함수가 있는데 KAIST버전은 process_exec()에 구현되어 있으니 주의해야한다. (프로젝트 2부터 KAIST와 한양대는 조금씩 차이가 있으니 너무 의지해서는 안된다)

process_exec()에서 호출되는 load()에 strtok_r 함수를 이용해 코드를 구현하면 된다.

strtok_r

strtok_r 함수는 string.h에 포함되어있는 함수로, 유튜브나 구글링을 참고하는게 더 자세하다.
본인은 유튜브영상을 통해 이해했다. (strtok_r는 strtok의 래핑함수로 인자 갯수만 달라 이해하는데 무리없다. 또한 구글링하다보면 strtok_s 가 나와 혼동하게 되는데, 윈도우버전은 s, 리눅스는 r이니 아무거나 보면된다)

/* userprog/process.c */
static bool 
load (const char *file_name, struct intr_frame *if_) {

	...
    
	char *arg_list[128];
	char *token, *save_ptr;
	int token_count = 0;
	
	token = strtok_r(file_name, " ", &save_ptr);
	arg_list[token_count] = token;

	while(token!=NULL){
		token = strtok_r(NULL, " ", &save_ptr);
		token_count++;
		arg_list[token_count] = token;
	}
    
    ...
    
}

argument_stack()

argument_stack 함수는 깃북에 나와있는

를 보고 그대로 구현하면 된다.

rsp는 현재 위치를 나타내는 스택포인트이며 스택을 거꾸로돌면서 (거꾸로 되어있다!) 값을 삽입한다.
문자열 길이 만큼 밑으로 간 후(거꾸로 되어 있어서 그렇지 오른손 잡이가 오른쪽에서 왼쪽으로 이동하면서 글을 오른쪽으로 쓴다고 생각하면 이해가 쉽다) memcpy 해주면 스택에 값이 넣어지는 원리 같다(라고 이해함)

part B는 8의 배수만큼 0을 넣어줘야 하는 부분이고
part C는 담아놨던 주소값을 넣어주는 과정이다.

part D에서 rdi, rsi 는 위에서 보듯이(esi, edi라고 적힌 이유는 32비트 기준이기 때문이다, 64비트는 r로 시작한다) 인덱스를 담당하는 인터럽트 프레임 멤버인데, 설정해줘야 한다(라네요)
인터럽트 프레임은 컨텍스트 스위칭이나 자식에게 물려주거나, 유저모드에서 커널모드로 옮겨다닐때 들고다니는 바구니라고 생각하면 될거같다.

test

우리는 write systemcall을 구현하기 전에, 테스트를 해볼수가 없다. 그러기에 디버깅툴의 도움을 받아야 하는데, 스택에 있는 내용을 보여주는 hex_dump를 이용하면된다.

//userprog/process.c
int
process_exec (void *f_name) {

	...
 
	if (!success)
	{
		return -1;
	}
	//요거
	hex_dump(_if.rsp, _if.rsp, KERN_BASE - _if.rsp, true);
	
	do_iret (&_if);
	NOT_REACHED ();
}

우리는 process_wait도 구현이 되어있지 않기때문에, 자식 프로세스를 기다리는 과정에서 -1이 리턴이 되어 오류가 남. 핀토스에게 자식을 기다리고 있다고 속이기 위해, 무한 루프를 걸어준다.

//userprog/process.c
int process_wait (tid_t child_tid UNUSED) {
	while (1) {}
	return -1;
}

테스트하기(build내에서)

pintos --fs-disk=10 -p tests/userprog/args-single:args-single -- -q -f run 'args-single onearg'

만약 make 과정에서 함수 관련 오류가 뜬다면
헤더파일에 함수 추가했는지, 헤더파일에 선언된 함수 인자와 실제 인자가 같은지 등을 확인해보는게 좋다.

(테스트 화면) (뒤늦게 작성하는거라 캡쳐가 없는 관계로 woony님 블로그에서 가져왔다!)

0개의 댓글