[SW_Jungle] PintOS project 2 - Argument passing

Jin Lee·2022년 1월 10일
0

PintOS

목록 보기
13/16
post-thumbnail

과제 목표

  • 커맨드 라인에서 파싱 기능 구현

과제 설명

  • 현재 PintOS는 프로그램과 인자를 구분하지 못하는 구조
    ex> $ls -a 를 입력하면 PintOS는 'ls -a'를 하나의 프로그램 명으로 인식
  • 프로그램 이름과 인자를 구분하여 스택에 저장하고 인자를 프로그램에 전달해보자

과제 해결을 위해서는?

  • 응용 프로그램을 실행 흐름을 추적하여 프로그램 파싱 시점 파악
  • 문자열 파싱을 담당하는 함수 이해
  • 함수 호출 규약에 따른 인자 전달 매커니즘을 이해하고 이를 저장하는 인터페이스 제작

수정해야 할 부분

수정 & 추가 함수

tid_t process_execute() (const char *file_name)
	프로그램을 실행 할 프로세스 생성
    	file_name 문자열을 파싱하여 첫번째 토큰을 thread_create() 함수에 스레드 이름으로 전달
        
static void start_process() (void *file_name_)
	프로그램을 메모리에 탑재하고 응용 프로그램 실행
    	file_name 문자열을 파싱하여 argument_stack() 함수를 이용해 스택에 토큰들을 저장
void argument_stack(char **parse ,int count ,void **esp)
	함수 호출 규약에 따라 유저 스택에 프로그램 이름과 인자들을 저장
    	parse : 프로그램 이름과 인자가 저장되어 있는 메모리 공간
        count : 인자의 갯수
        esp : 스택 포인터를 가리키는 주소

문자열 분리 함수

 /* string.h */
char *strtok_r (char *s, const char *delimiters, char **save_ptr)
	문자열 s와 구분자 delimiters를 받아 구분자를 기준으로 파싱
/* 문자열을 첫 번째 공백 기준으로 파싱 */
char s[] = "String to tokenize.";
char *token, *save_ptr;
for (token = strtok_r (s, " ", &save_ptr); token != NULL;
        token = strtok_r (NULL, " ", &save_ptr))
     printf ("'%s'\n", token);

실행 파일 이름 전달

스레드의 파일 이름을 실행 파일명으로 지정(process_execute())

  • 커맨드 라인의 첫 번째 토큰을 thread_create() 함수이 첫 인자로 전달 되도록 프로그램을 수정
  • 현재는 커맨드 라인 전체가 thread_create()에 전달되고 있음

실행 파일 로드(start_process())

  • 인자들을 토큰화(strtok_r(), string.h) 및 토큰의 갯수 계산
  • 실행 파일 이름을 load() 함수의 첫번째 인자로 전달

80x86 Calling Convention

  • 함수 호출 시 인자 값은 오른쪽 -> 왼쪽 순으로 스택에 저장
  • return address : caller(함수를 호출하는 부분)의 다음 수행 명령어 주소
  • caller(호출 받은 함수)의 리턴 값은 eax 레지스터에 저장

Argument passing 흐름

stack의 구성 예

tip

  • hex_dump() 를 이용하여 프로그램 스택 메모리 출력
    • 핀토스에서 제공하는 디버깅 툴로서 16진수의 메모리 형태로 화면에 출력
    • 유저 스택에 인자를 저장 후 유저 스택 메모리 확인
profile
깃허브 : https://github.com/jinlee9270

0개의 댓글