카테고리 없음

[pintos] pj1-argument passing

bananackck 2025. 2. 20. 23:31

[블로그 이전]

2022.10.05

 

./src/userprog 에 make를 해주고 아래 명령을 입력한다.

pintos --filesys-size=2 -p ../examples/echo -a echo -- -f -q run 'echo x'

...... 이거 그냥 예시문인데 안된다.

../examples/echo: stat: No such file or directory

examples 안에 echo파일이 없댄다.

혹시 가서 확인해보니 있다.

혹시 몰라서 make 돌려본 후 다시 명령해보니 된다.

....... 좀 알려주지 누가.

이제 이렇게 나온다.

뭔가 돌아는 가지만 자세히 보면 echo x가 실행이 안됨을 알 수 있다.

아직 syscall을 구현하지 않았고, 이를 연결해주지 않아서 그런거다.

그럼 이제 해볼까요.

먼저 syscall 전에 입력으로 받은 command line을 전달해주어야 되겠지.


<argument parsing>

argument passing 전에 parse 먼저 해야 argv 단위로 받을 수 있다.

parsing은 process.c 의 load()에다 작성하면 된다.

strtok_r() 과 strlcpy() 함수를 사용하여 filesys_open() 위에 간단히 작성해준다.

#include <string.h> char *strtok_r(char *str, const char *delim, char **saveptr);

strtok_r()은 str의 문자영을 delim 단위로 쪼갠다.

delim을 찾아서 '\0'으로 변환해준다.

saveptr은 값이 중요하지 않다. 직접 hadling하지 않기 때문.

parsing한 후 argv[0] 를 open 한다.

<setup stack>

이제 argument passing을 위해 stack을 쌓아야 한다.

이는 핀토스가 입력 command에 접근할 때 esp를 더해가면서 데이터를 접근하기 때문이다.

즉 stack을 잘 쌓아야한다.

stack의 순서는 다음과 같다.

  1. 아까 parsing 한 argv의 데이터를 역으로 쌓는다.

hint (null 포인터까지 저장하려면 strlen(argv[])+1 해주어야함.)

hint 아래의 4번을 위해서 argv 데이터를 저장한 곳의 주소를 새로운 리스트에다 저장해두자.

2. word-align : 이 다음에 쌓는 stack이 구조에 맞으려면 4byte단위가 되어야 한다. 따라서 argv데이터의 총 길이가 4의 배수가 아니면 그 만큼 할당해준다.

hint esp의 초기 주소값은 항상 4의 배수이다. 따라서 argv를 쌓은 후, word-align을 하면 4의 배수가 되어야한다.

3. argv[argc] : 왜 하는지는 모르겟지만 0을 넣는다.

4. argv의 주소값 : 1에서 저장한 argv 주소를 하나씩 쌓는다.

5. argv의[0]의 주소값을 저장한다.

hint argv[0]은 바로 위에 있으므로 현재 esp에서 4만 더하면 된다.

6. argc

7. return addr : 0을 넣는다.

hex_dump(*esp, *esp, 100, 1)를 사용해서 echo x 가 출력되는지 확인한다.

~/pintos/src/lib/stdio.c hex_dump(uintptr_t ofs, const void *buf_, size_t size, bool ascii)

이렇게 하면 끝!!


그리고 꼭 pintos manual을 읽어보자!!!!!!

이걸 읽고 과제를 했더라면 더 잘했을까....? 잘 모르겠지만 개념 정리에 도움이 많이 된다,

힌트도 생각보다 많다.