본문 바로가기

TIL (Today I Learned)

3/16 (토) TIL - [PintOs] Week08 - System Call

728x90

 

 

제목은 시스템 콜이지만, 그 전에 User Memory부터 구현해야 한다.

 

do_fork()부터 구현하려고 하는데 parent->tf로는 유저 컨텍스트를 가져올 수가 없단다.

그래서 유저 컨텍스트부터 알아봤다.

 

유저 컨텍스트는 생각하던 그대로, 프로세스를 스위칭 할 때, 유저 프로그램의 진행 상황을 저장해두기 위한 작업이다.

이 과정에서 부모 프로세스의 인터럽트 프레임은 시스템 콜 호출로 커널에 저장된 정보들을 가리키기 때문에 parent->tf로는 유저 정보를 가져올 수 없다.

 

자세한 정보는 이 블로그를 참고했다. 정글 선배님 ㅎㅎ...

 

위 블로그를 가보면 코드는 접혀 있고, 어떻게 방향을 잡아야 하는지 자세하게 안내해주신다. 굿

 

암튼 그래서 일단 해야할 일

1. 변하지 않을 현재 정보를 저장 -> thread 구조체에 if 추가

2. 자식 프로세스에 접근할 수 있게 자식 리스트를 만들어야 한다. -> thread 구조체에 추가.

 2-1) 리스트 요소를 추가하라는 정보만 봤는데 자식 리스트 자체도 갖고 있어야 하지 않을까? 즉, 내가 자식으로 들어갈 때 필요한 list_elem과 부모로서 필요한 child_list가 필요할 것 같다.

3. do_fork() 이후에 duplicate_pte() 구현하고, system call에서는 위에서 얘기한 유저 정보를 커널에 넘기는? 작업을 해야할 듯 하다.

 

 

1. 2.

 

세 변수를 추가해줬다. #ifdef USERPROG 아래에 pml4가 이미 있었기 때문에 pml4 아래에 선언했다.

struct intr_frame user_tf;
struct list_elem ch_elem; // child
struct list child_list;
 
list_elem은 초기화가 필요없고, child_list는 init_thread()에서 초기화했다.
user_tf를 어디서 초기화 해야 할까...user_tf를 굳이 기존의 tf와 동기화할 필요는 없을 것 같다. 
userland context가 이루어질때 백업용으로 쓰면 되지 않을까?

 

3.

duplicate_pte()에서 va가 커널 영역이면 리턴시키는 구간을 추가.

newpage에 palloc으로 할당을 해주었다.

memcpy가 맞는진 모르겠지만 parent_page -> newpage로 카피해주었다. 그리고 is_writable을 이용해 쓰기가 가능한지 플래그 설정을 했다.

 

이후, newpage에 대한 pml4 세팅에서 세팅이 실패하면 에러 핸들링을 하라고 써있는데... 이 경우도 페이지 폴트를 발생시켜야 하는 건가?

 

 

4.

halt 테스트를 이용해 시스템 콜 핸들러에서 call num를 출력해보니 어라라 분명 halt는 SYS_HALT로 0이 출력되어야 하는데 SYS_WRITE 10이 출력되었다.

write부터 해라 이거지 알겟다.

 

write()를 보니 인자로 fd를 받아온다.

그리고 filesys_open()을 보니 파일 이름이 필요하다..! 결국 파일 디스크립터 테이블이 필요하다는 얘기다.

 

파일 디스크립터 테이블은 프로세스 당 하나씩 갖고 있으니 스레드 구조체에 선언해줬다.

 

근데 파일 디스크립터는 intr_frame에 저장할 수가 없다.

gpt한테 물어보니 파일 디스크립터 포인터 어쩌구한다.

그러면 해당 포인터를 레지스터에 저장해야 하냐? 하고 다른 정글러께 물어보니 정답이라구 하신다 ㅋㅋ

근데 레지스터에 언제 넣어야 하냐 ㅠㅠ

 

다른 정글러분의 의견은 그냥 thread_current()를 호출하면 되지 않느냐고 하셨다. 이 방법이 쉬우니까 이거부터 해보자ㅎ

 

ㅜㅜ 레지스터에서 변수 받아오는 데에서 막혔다...

분명 위에서 rax를 int64_t로 받아왔는데 왜 size와 fd를 받아오는 건 안 될까...

물론 buffer를 받아오는 것도 안 된다. void *로 받았었는데, int64_t로 받아도 안 된다. 잉잉

 

일단 오늘은 여기까지...하필 단단히 체해서 집중도 안 되고...내일 자소서 작성하고! 못한 구현 더 해보자. 파이틴