2022.11.29 SW정글 ~ 72일차 / Pintos Weekly I learned

2022. 11. 29. 21:35카테고리 없음

Pintos 프로젝트 2주차가 마무리 되었다! 스레드 기반의 스케쥴링을 공부했던 1주차에 비해 2주차는 구현해야할 것도 많고, 함수들도 엄청 많아서 깊게 공부하기가 어려웠다. 2주차 프로젝트는 바로, 유저프로그램이다.

 

1) Argument passing

처음에는 유저가 입력한 커맨드라인에서 인자를 추출하여 커널, 즉 운영체제가 전달 받을 수 있게 만드는 작업을 하였다. 예를 들면 함수가 있을 때의 안에 들어가는 argument가 여기에 해당한다. 메모리에서는 유저가가 사용하는 부분과 커널만이 접근 가능한 영역이 나누어져있다. 

(유저는 유저영역만 참조 가능 / OS는 유저영역 + 커널영억 둘다 참조 가능)

유저영역에서의 정보를 커널에 전달하기 위해서는 인터럽트프레임(if)이라는 곳에 정보를 담게 된다. if 구조체에는 스택포인터인 rsp가 있다.  rsp는 스택을 가리키게 되며 이를 통해 인자들을 차곡차곡 쌓아 저장하게 된다.

 

2) System Call

두번째로 크게 구현해야할 것은 시스템콜이었다. 위에서 설명했듯이 유저영역과 커널영역은 분리되어 있다. 유저는 유저영역만 참조가능하기 때문에 하드웨어와 직접적인 연관이 있는 작업을 실행하기 위해서는 커널의 도움이 꼭 필요하다. 커널은 곧 OS, 따라서 유저가 OS에게 작업을 요청하면, 커널 스레드가 미리 설계되어있던 시스템콜 핸들러 (시스템콜을 커널에서 받았을 때, 미리 설정해뒀던 함수로 작업하기 위한 것,,, CSAPP에서는 서브루틴으로 설명하기도 함) 를 통해 작업을 하고 다시 유저영역으로 반환값을 다시 전달해준다.

 

유저프로그램을 실행하면, write() 시스템콜로, 인자를 유저스택에 넣고 커널로 진입하게 해준다. rsp는 이 때, 인자가 들어간 영역을 가리키게 되어, 커널 스레드가 작업을 수행할 수 있다. 인터럽트가 도달했을 때, 대처하기 위한 테이블인 인터럽트 벡터 테이블에 따라서 시스템콜 핸들러를 호출하면, 시스템콜핸들러에 따라서 작업을 수행해주는 것이다.