[TIL] 11/19

da__ell·2022년 11월 19일
0

TIL

목록 보기
1/5
post-thumbnail

11/19 토요일

  • Pintos Project 2 시작
  • 학습 방향 정하기
  • 코드 분석

📍따다성조 학습 방향

🐢 각자 해보기

  1. 깃북을 일단 읽어보고 어떻게 해결할지 먼저 각자 작성해보기.
  2. 테스트 코드도 한 번 보면 좋을거 같다
  3. 관련 개념 MUST_READ에 공유하기

🦔 같이 해보기

  1. 한양대 자료를 보면서 보완해야 할 점 비교해보기
  2. 한양대 자료 보면서 코드 작성
    1. 돌아가면서 작성하기
    2. 한양대 자료가 실제 카이스트 핀토스와 조금 다르다는 것도 고려해야함
      (카이스트 ee나, 기타 자료도 참고해보는 방식도 고민해보자)

Git Book - Argument Passing 해석본


Implement the argument passing. (인자 전달의 구현)

Currently, process_exec() does not support passing arguments to new processes. Implement this functionality, by extending process_exec() so that instead of simply taking a program file name as its argument, it divides it into words at spaces. The first word is the program name, the second word is the first argument, and so on. That is, process_exec("grep foo bar") should run grep passing two arguments foo and bar.

현재, process_exec() 함수는 새로운 프로세스들에 인자를 전달하는 것을 지원하지 않습니다.
process_exec() 함수를 확장 구현해서, 지금처럼 단순히 프로그램 파일 이름만을 인자로 받아오게 하는 대신 공백을 기준으로 여러 단어로 나누어지게 만드세요.
첫 번째 단어는 프로그램 이름이고, 두 번째 단어는 첫 번째 인자이며, 그런 식으로 계속 이어지게 만들면 됩니다.
따라서, 함수 process_exec("grep foo bar") 는 두 개의 인자 foo와 bar을 받아서 grep 프로그램을 실행시켜야 합니다.


🔖 관련 TEST

TEST CODES - args.c

/* Prints the command-line arguments.
   This program is used for all of the args-* tests.  Grading is
   done differently for each of the args-* tests based on the
   output. */

#include "tests/lib.h"

int
main (int argc, char *argv[]) 
{
  int i;

  test_name = "args";

  if (((unsigned long long) argv & 7) != 0)
    msg ("argv and stack must be word-aligned, actually %p", argv);

  msg ("begin");
  msg ("argc = %d", argc);
  for (i = 0; i <= argc; i++)
    if (argv[i] != NULL)
      msg ("argv[%d] = '%s'", i, argv[i]);
    else
      msg ("argv[%d] = null", i);
  msg ("end");

  return 0;
}

tests/userprog/args-none - 문자열 인자가 없는 경우
tests/userprog/args-single - 인자가 하나인 경우
tests/userprog/args-multiple - 인자가 여러 개인 경우
tests/userprog/args-many - 인자가 저장할 레지스터의 크기보다 큰 경우?
tests/userprog/args-dbl-space - 공백이 연달아 이어질 경우


char *strtok_r(char *str, const char *delim, char **saveptr);

🔖 인자 분석

str (분리할 문자열)

  • delimiter단위로 분리할 문자열.
  • NULL이면 saveptr 변수에서 저장하고 있던 이전에 호출한 위치 다음부터 분리작업을 진행합니다.

※주의 : str문자열은 변경이 일어나기 때문에 원본 문자열을 보존하려면
임시변수에 복사한 후 임시변수를 사용하기 바랍니다.

delim (분리 문자 - 분리 기준이 되는 문자)

  • 문자열을 분리할 delimiter 문자들. delim에 포함된 아무 문자라도 만나면 분리함.

saveptr (분리된 문자열 이후 문자열 저장)

  • 다음 처리를 위한 위치를 저장하는 pointer.
  • 이 변수는 직접 handling하지 않습니다.

IBM 공식문서 링크


우리의 생각..

  • 일단 test에서 원하는 것은 인자의 상태에 따라 적절하게 인자를 받는 것을 원한다.
  • int process_exec (void *f_name) 의 f_name을 적절하게 분리해준다.
  • strtok_r을 사용해서 *f_name을 분리하자. 분리조건 - 공백
  • 분리한 문자열의 첫 번째 인자argv[0]*f_name이 된다.
  • 인자가 NULL일때까지만 받는다 → NULL이면 종료.
  • 받은 인자는 intr_framegp_register에 받는다(추정)
  • 공백이 여러 개가 나오더라도 문자열만 저장할 수 있도록 한다.

해결 방향

tid_t process_create_initd(const char *file_name)

process_create_initd에서 argument parsing을 통해 프로세스명과 프로세스에서 실행될 인자들을 구분한다.

/* Create a new thread to execute FILE_NAME. */
tid = thread_create(process_name, PRI_DEFAULT, initd, fn_copy);

strtok_r을 사용하여 인자를 공백으로 분리한다. 인자를 여러개 받을 경우 argv[0]이 프로세스 명이 된다.

int process_exec(void *f_name)

해당 프로세스 명으로 실행되는 프로세스 메모리의 스택에 파싱한 인자들을 저장한다.

profile
daelkdev@gmail.com

0개의 댓글