[pintos] pj1-argument passing
[블로그 이전]
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의 순서는 다음과 같다.

- 아까 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을 읽어보자!!!!!!
이걸 읽고 과제를 했더라면 더 잘했을까....? 잘 모르겠지만 개념 정리에 도움이 많이 된다,
힌트도 생각보다 많다.