-
[SW 정글 66일차] Pintos project 2 - Argument Passing기타/SW 사관학교 정글 2021. 10. 8. 07:52
오늘부터 PintOs project 2. Argument Passing 구현에 들어가기 시작했다.
일단은 https://casys-kaist.github.io/pintos-kaist/에 설명되어있는 우리가 해결해야할 과제를 파악했다.
1. 내가 해결해야할 것은?
이번 Argument Passing은 문제는 그냥 딱 명확하다.
그런데 동작과정이 project 1때보다 머릿 속에서 잘 그려지지 않는다.
오늘 점심부터 gitbook과 ppt를 보는데 이해도 안되고 어떠한 로직을 그려야할지 모르겠어서 답답하기는 하지만 일단은 문제정의부터 하려고 한다.
우리가 어떠한 파일이나 프로그램을 실행시킬 때 main()함수에서부터 시작하고 main에 arguments를 준다.
(물론 void인 경우에는 안 주겠지만 그러면 argument[1]이 NULL이지 않을까 싶다)
이전에 로드되고 _start()함수로 어떠한 과정이 시작되는데 그 부분은 다시 공부해서 정리할 생각이다.
GUI에서 그냥 단순히 아이콘을 누르면 실제로 어떻게 arugments가 들어가는지 안들어가는지 명확하지 않으므로 CLI환경을 생각해야한다.
예시로 echo를 생각해보자.
echo는 함께 받은 인자를 출력해주는 역할을 한다.
echo "foo" "bad"
라는 명령어를 입력하면 argument[0] = echo, argument[1] = "foo", argument[2] = "bad"이고 argument[0]을 실행하는데 argument[1]과 argument[2]는 echo의 인자로 들어가는 것이다.
그러면 여기에서는 어떠한 작업이 필요할지 생각해봐야한다.
일단은 우리가 한 줄로 echo "foo" "bad"를 입력하므로 이 한 줄 입력을 받은 OS입장에서는 어디까지가 파일명인지 어디까지가 argument1인지를 알아야한다.
우리는 이미 알고있겠지만 띄어쓰기를 기준으로 나뉜다. 그리고 순서대로 첫번째가 파일명이고 두번째부터 arguments라고 생각하면 된다.
그러면 OS도 한 줄 입력이 들어오면 '아 띄어쓰기를 기준으로 parsing을 해서 파일명과 arguments를 받으면 되겠구나'하면 된다.
우리는 이 작업을 해주면 된다.
현재는 parsing하는 작업과 parsing한 arugments를 어딘가에 저장해놓는 코드가 구현이 안되어있다.
문제를 알았으니 이미 implement된 코드를 보며 어디를 고쳐야할지 알아보자.
2. 과제 구현 방법 생각하기
문제를 정의했을 때에 해줘야할 일은 크게 2가지이다.
받은 문자열을 parsing하는 것과 parsing을 통해 나온 arguments를 어딘가에 저장해야하는가이다.
여기서 어딘가에 저장해야한다라는 것을 생각해봐야하는데 이 때에 메모리 구조를 떠올려보아야한다.
gitbook에는 전형적인 메모리 구조를 아래와 같이 제시했다.
USER_STACK +----------------------------------+ | user stack | | | | | | | | V | | grows downward | | | | | | | | | | grows upward | | ^ | | | | | | | +----------------------------------+ | uninitialized data segment (BSS) | +----------------------------------+ | initialized data segment | +----------------------------------+ | code segment | 0x400000 +----------------------------------+ | | | | | | | | | | 0 +----------------------------------+
메모리 구조에 대해 찾아보면 나오겠지만 간단하게 정리하면 code영역은 프로그램의 코드, data영역은 global 변수나 static 변수, heap 영역은 동적으로 할당받은 메모리 영역, stack 영역은 함수 호출 시 생성되는 지역변수나 매개변수, return 값들이 들어간다.
메모리 영역을 보면 4가지의 영역 중에 stack 영역에 우리가 받은 문자열(arguments)을 parsing해서 넣어주면 된다.
PintOs에는 user stack 영역의 시작 주소를 제시해주었고 어떻게 저장해야하는지도 table로 아래와 같이 제시했다.
여기서는 argument의 갯수가 4개일 때와 각각의 argument의 크기가 정해져있어 어떻게 user stack에 저장되는지 보여준다.
RDI는 argument의 갯수를 저장하고 RSI는 argument[0](file name)의 char이 저장되기 시작된 주소를 저장한다.
동료의 도움을 받아 정말 깜깜한 구현이라는 숲에서 한 줄기의 빛을 보게 됐다.
정글의 동료들은 다 대단하다.
내일 코드 구현을 시작하고 다음 단계로 넘어갈 예정이다.
[오늘의 나는 어땠을까?]
오늘도 4시간 채 안자고 7시 30분에 일어나니 정말 힘들었다.
힘든 몸을 이끌고 씻은 후에 강의실에서 코딩테스트 문제를 풀었다.
그 후에 운영체제를 10시간 넘게 최고의 집중력으로 해내기에는 힘들다는 생각에 코딩테스트 문제풀이 이 후에 점심 먹기 전까지 HTTP공부를 하기 시작했다.
점심을 먹은 후에는 운영체제 공부를 시작하려고 했는데 나의 뇌가 받아들이기 싫다고 말하듯이 눈이 저절로 감기기 시작했다.
내 몸을 막쓴 나를 싫어하나보다..
몸이 드디어 너무 무리했으니 쉬라는 신호인가..
그래서 휴게실에서 30분정도 잤지만 그래도 계속 눈이 감겨서 기숙사에서 알람을 맞추기 않고 푹 자고 왔다.
여기서 깊은 생각에 빠졌다.
밤잠을 이전처럼 5시간 정도 자야 일상 시간에 제대로 보낼 수 있나라는 생각이 들었고 그렇지만 5시간을 자기 위해서는 일단은 기상시간이 7시 30분으로 정해져있고 그러면 2시 이전에는 가야하는데 2시 이전에 내가 하고자 한 공부를 다 끝내야한다.
하지만 2시 이전에 내가 하고자 한 공부를 끝내는 것은 평소에는 힘들었고 그래서 3시 30분 정도에 기숙사를 간 것이고 4시간을 채 못 잔 것이다.
5시간정도 자려면 2시 정도가 되면 공부를 마무리하고 내일로 미루던가 아니면 스터디를 포기하고 아침에 조금 늦게 기상하는 것 중 선택해야한다.
둘 다 포기하기 싫다..
그냥 점심을 먹고 한 숨 푹 자고 오는 것을 선택을 해야하나..
생각을 해봐야겠다.
일단은 오늘은 2시 이전에 간다고 마음을 먹었지만 그래도 시간이 흘러 또 4시간을 채 못 잘 것같다.
'기타 > SW 사관학교 정글' 카테고리의 다른 글
[SW 정글 68일차] Pintos project 2 - System Calls 구현 1일차 (0) 2021.10.10 [SW 정글 67일차] Pintos project 2 - Argument Passing 구현 (0) 2021.10.08 [SW 정글 65일차] Pintos project 2 입문 (0) 2021.10.07 [SW 정글 64일차] 프로세스의 제어 (0) 2021.10.06 [SW 정글 63일차] 예외 상황 (0) 2021.10.05