PintOS 3주차 -day 15

힘겹게 진행하는 3주차에서 PintOS에 치이다가 이제서야 이어서 포스팅을 올린다. 그동안 많은 변화가 있었다. 지난번에 이어졌던 문제상황도 포스팅하고 몇가지만 추가로 적어서 기록하고자 한다. 일단 지난번에 무한루프에 빠졌던 이유는, notpresent 대신에 write을 썼기 때문에 그랬다. if(write)에서 검사를 하고, 실제 페이지 할당을 위해서 vmdoclaimpage를 실행해야 하는데, notpresent 여부(페이지가 할당되어 있는지)를 확인하지 않고, write에서부터 걸러져서 문제가 발생했기 때문. faulthandler를 거치고 나서도 다시 똑같은 주소에 접근했더니, 계속 무한루프를 도는 것. 이 문제를 해결 하고 나서도 많은 문제가 있었다. 특히 유저 스택을 설정해주는 부분에서 많은 문제가 발생했는데, 이 부분이 가장 어려웠다. 가장 오랫동안 붙잡고 있던 test 케이스는 큰 데이터를 스택 영역에 할당해주는 것이었다. 해당 부분에서 우리가 가

2023년 1월 13일
·
0개의 댓글
·

PintOS 3주차 - day 8

다시 또 오랜만에 쓰는 TIL이다.. 무한loop에 빠져서 제대로 된 진도가 나가지 않는게 매우 힘들다. 아래 코드가 project 3 에서 실행해야 하는 함수 중에 가장 핵심인 vmtryhandlefault 함수이다. 이 함수를 통해서, 기존의 pml4 기반의 페이지 탐색에 실패했을 때, 새로운 보충 페이지테이블인 spt(supplementalpage_table)에서 검색한다. 그리고 만일 spt에서도 페이지를 찾을 수 없으면, vmdoclaim_page 를 통해서 새롭게 page를 요청하고, pml4를 찾아주는 순서로 코드가 실행되어야 했다. 하지만 커널 패닉이 뜬다. 분명 iskernelvaddr 를 통해서 주소가 제대로 커널 영역에 있는걸 확인하고 vmdoclaim으로 넘어가는데, 계속해서 새로운 페이지만 생성하고 제대로 참조가 되지 않았다. 그렇게 무한루프에 빠졌다. 오늘 이걸 디버깅 하느라 거의 하루를 날렸는데도 여전히 난항중에 있다. 내일은

2023년 1월 9일
·
0개의 댓글
·
post-thumbnail

PintOS 3주차 - day3

TIL을 다시 적기 시작한다... 2주차를 진행하다가 음식을 잘못먹고 급성장염으로 몇일간 아프면서 TIL도 같이 중단됐었다. 그리고 그 사이에 벌써 3주차로 넘어왔다. 2주차 내용은 아직 많이 쓰지도 못했는데 말이다. 그래도 다시 써보고자 3주차부터 다시 쓰려고 한다. 2주차 나머지 내용은 나중에 시간이 있을때 별도로 작성하는 걸로 할 예정이다. 오늘로 3주차 3일째이다. 월요일 오후부터 시작해서 3일차이다. 오늘까지 기본적인 이론을 공부했다. 그 내용들을 조금 여기에 정리해고자 한다. 가장 초기의 OS에서 page allocation 방식은 contiguous allocation(연속할당) 방식이었고, 이런 방식은 치명적인 외부 단편화 문제를 발생시켰다. 이러한 문제를 잡기 위해서 메모리를 동일한 크기인 page로 쪼개는 방법이 나왔다. page를 사용하면서 메모리를 100% 만큼으로 사용할 수 있게 되었는데, physical memory에서 여기저기 퍼져있기 때문에 프로

2023년 1월 5일
·
0개의 댓글
·

PintOS 2주차 - day6

thread 구조체 수정부터 시작하려고 했었던 계획은 실패했다. 코드 여러 구석을 뜯어보고 알게됐다. 이 부분은 userprogram 부분의 핵심인 fork() 함수와 wait()함수 작성이 필수인 부분이었다. 그리고 아직 작성되지 않은 시스템 콜을 작성해나가면서 인수를 하나하나 추가해가는 방식으로 해야 전체적인 그림을 잡을 수 있을 것으로 보였다. 몇일간의 노력이 허무했지만, 다시 가장 처음으로 돌아가 system_call을 작성하는 것 부터 시작했다. 시스템 콜 핸들러 자체는 어려운 함수가 아니었다. interrupt frame에서 레지스터의 정보를 저장하는 필드가 있고, 어떤 순서로 자료가 저장되는지만 파악하면 쉽게 인자를 넘겨줄 수 있었다. 이후에는 각 case 별로 실행되는 함수를 작성했다. 몇 개만 기록으로 남긴다. 현재 프로세스를 종료하는 시스템 콜인데 오늘 팀원들과 얘기하다가 이후에 나오는 fd_table 을 생성하고 이후에 thread를 종료할 때,

2022년 12월 28일
·
0개의 댓글
·
post-thumbnail

PintOS 2주차 - day5

5일차. 체력이 급격히 줄어든게 확실히 실감된다. 주변 사람들은 감기가 유행처럼 퍼졌다. 이제 절반인데 피곤하게 느껴지니 체력 안배의 중요성이 조금 더 느껴진다. 오늘은 코드를 직접 짠건 거의 없었다. 팀원들하고 Project 2 를 크게 나눠서 조금씩 진행을 하는 방식으로 진행을 했다. 앞의 system_call 부분은 가볍게 훑어보고 Thread 부분을 우선적으로 봤다. 코드도 작성할 수 있으면 작성하고, 내용에 대해서 서로 나누는 방식으로 하기로 했기 때문. 카이스트에서 진행할때는 하나의 큰 과제로 진행했지만, 인터넷에서 찾은 다른 자료에서는 조금더 작게 쪼개서 Thread 부분을 진행하는 과제로 쪼개져있었기에 그렇게 진행을 했다. User program에서는 child process가 실행될 수 있기 때문에, 이를 OS가 인지할 수 있도록 해야한다. 동시에 프로세스 하나를 담당하는 하나의 Thread에서도 child 에 대한 정보를 담아야 한다. 여러개의 child가

2022년 12월 27일
·
0개의 댓글
·

PintOS 2주차 - day4

오늘은 argument passing과 user memory 관련 함수를 완성했다. argument_stack()함수를 짜기 위해서 어떻게 구성해야 하는지도 생각하기 위해 굉장히 애를 먹었는데, 동료들과 얘기해가면서 구성을 마칠 수 있었다. 이렇게 구성하였는데, PintOS에서는 메모리영역에서 단순하게 순서대로 집어넣는게 아니라 주소값이 큰 곳에서부터 역순으로 넣는게 난관이었다. 이를 해결하기 위해서 포인터를 잘 사용해야 했다. 결국 memcpy 함수를 사용해서 넣기 때문에, 낮은 주소값을 시작값으로 넣어주는 것이 포인트였는데, for문을 돌릴때 주소값을 먼저 낮춘뒤에 memcpy 함수에 넣어주는 방법으로 해결했다. 한번 argument들을 넣는 것을 해결하고 나니, 뒤에는 똑같은 방법으로 해결할 수 있었다. 임시로 배열을 만들고 메모리에 argument 데이터를 넣을 때마다 그 포인터를 임시 배열에 넣어준 뒤에 그 배열을 새로 넣어주는 방식으로 PintOS 에서 원하는 구

2022년 12월 26일
·
0개의 댓글
·

PintOS 2주차 - day3

알고리즘 풀고 CS책을 읽다가 둘째날에 회고록을 적는걸 잊었다... 시작하자마자 하루가 빠진게 너무 아쉽지만 그래도 이제는 빠지지 않고 적어보고자 한다. 오늘도 첫째날과 비교해도 딱히 진도가 많이 나가지는 않았다. 코드에 대해서 이해하고, 과제를 차근차근 진행하려고 했는데 여전히 argument들을 유저 stack에 쌓는 과정을 구현하지 못하고 있다. 과제를 진행하면서 우리가 가동할 프로그램이 Userstack을 참조해서 가동될 수 있게 하도록 hex_dump()함수를 추가했지만, 기본적으로 PintOS에서 적절하게 해볼 테스트가 없어서 난관을 마주했다. 인자로 받은 file_name 변수를 그대로 사용해서 argument 에 넣어도 상관이 없는건지, 별도의 buffer 가 필요한건지 고민중이다. 오늘은 일요일이고 하니 여기서 마무리하고 나머지는 내일 팀원들과 함께 이런저런 시도를 해봐야겠다.

2022년 12월 25일
·
0개의 댓글
·

PintOS 2주차-day1

핀토스를 공부하면서 간단하게 적기로 했습니다. Thread 를 처리하는 과제를 마치고 WIL을 적었었고, 정리하면서 머릿속에서 정리되는 것을 느꼈다. 그래서 간단하게 나마 조금씩 적기로 했다. 오늘은 Git book을 읽으면서 대체적인 내용을 훑어봤다. Project 2의 과제의 핵심은 바로, userprogram과 I/O를 다루는 것이다. user program을 실행하는 것은 kernel에 의해서 다양한 작업이 발생하는 것이라고 이해했다. kernel도 user program이 실행될 때 다양한 일들이 일어나는데, 이 과정에 대해서 제대로 실행되도록 하는 것이 이번 과제였다. OS의 특성상 커널부분은 고정된 Physical memory 주소를 가지고 있으며, user가 함부로 해당 주소로 접근하거나 수정하는 것을 막도록 되어있다. 이를 위해서 프로그램이 접근이 불가능하도록 메모리 주소를 관리해야한다. 이를 위해서 파일을 수정해 나갈 예정이다. 그리고 user pro

2022년 12월 23일
·
0개의 댓글
·