목요일에 마무리하는 수요일 TIL
do fork()에서
세마 업의 위치가 do iret()아래였는데 위로 올려줘서 패스
do iret()이 레지스터를 이용해 실행하는 프로그램을 점프하는? 함수였다. 그래서 do iret 아래는 실행이 되지 않는 것이였다...sema up이 되지 않아 부모의 fork wait이 끝나지 않는 이슈였다.
dueplicate_pte()에서
처음 코드와 주석을 봤을 때, 커널이면 리턴하는 경우에 복사가 진행이 되지 않으니 false를 반환해야 한다고 생각했다. 다른 선배님 글을 참고했을 때, 어느 선배님도 false를 반환하셔서 내가 맞았다고 생각했는데, fork를 진행할 때 do_fork() -> pml4_for_each() -> duplicate pte()에서 error를 반환해서 또 다른 선배님의 글을 참고해 true로 변경했더니 통과했다. 띠용쓰
기존에서 변경한 점!
exec()
해당 종료 문구를 kernel thread 등이 종료될 때는 출력되지 않도록 해야 한다!
그런데 kernel 스레드도 thread_exit()를 호출하기 때문에 process_exit()를 호출해 종료 문구를 출력한다.
그래서 syscall.c 에서 종료 문구를 출력하게 변경해서 pass했다...
분명 TODO는 process_exit()에서 출력하라구 써있었는데...아닌갑다.
fd_table
파일 디스크립터 테이블을 원래는 *fd_table[64]로 선언했었다. 작은 크기라고 생각해서 정적으로 선언했으나 계속 스레드 오버 플로우가 발생했다...
처음엔 메모리를 잘못 건드린 줄 알고, stack_push를 살폈으나 이 부분 이외에도 오버 플로우가 발견되어서 fd_table의 크기를 변경하자 오류 메시지가 조금씩 바뀌었다.
그래서 fd_table을 동적으로 선언하도록 변경해주었다!
선언하는 부분은 다른 분의 코드를 참고했다. 다행히 기존에도 더블 포인터를 이용해 테이블에 접근했어서 선언 이후로는 변경하지 않아도 호환되었다.
선언은
↓ get_child() - tid로 자식의 스레드를 반환받는 함수
부모의 자식 리스트에서 tid를 이용해 스레드를 반환하는 함수다.
구현은 어려운게 없었는데 리스트 순회하는 과정에서 자잘한 오류나 쓰레기값 출력 등이 되어 예외처리 구문을 추가했다.
또, 이해가 안 되는 점은 list_begin등에 삽입하는 매개변수로 &child_list를 할때는 포인터 오류?가 발생했었는데 변수 자체를 *child_list로 받아오니 오류가 진정되었다. 흠...똑같다고 생각했는데 주소값이 계속 바뀌나?
struct list *child_list = &thread_current()->child_list;
struct list_elem *e;
if (list_empty(&child_list))
return NULL;
for (e = list_begin(child_list); e != list_end(child_list); e = list_next(e))
{
struct thread *child = list_entry(e, struct thread, ch_elem);
if (thread_current()->tid != child->parent->tid)
{
break;
}
if (child->tid == tid)
{
return child;
}
}
return NULL;
이거 쌍방 추가해서 rox case 통과됨. 자식이 갖고 있는 load_wait을 조작한다.
정확하진 않지만, 내가 이해한 바로는 load_wait을 이용해서 자식이 부모 모르게 종료해버리는 것을 방지하는 조건이라고 생각한다.
어쩌다보니 진도도 늦어지고 팀 WIL도 작성해야 해서 밤을 샜다.
밤샘 결과 ^^
syn는 조금 더 하면 될 것 같아서 내일 마저 해보려한다. multi-oom은 아직 테스트케이스를 살펴보지 않아서 이것도 내일...
multi-oom은 누수 메모리를 검사하는 케이스라고 코치님께서 말씀하셨다. 잡을 수 있으려나
'TIL (Today I Learned)' 카테고리의 다른 글
3/28 (목) TIL - Project3 Anonymous Page 구현하기 (2) | 2024.03.29 |
---|---|
10주차 키워드 정리 (1) | 2024.03.26 |
3/19 (화) TIL - 오늘은 꼭 fork를 끝내야지 (0) | 2024.03.19 |
3/18 (월) TIL - 여전히 시스템 콜 하는중 (3) | 2024.03.18 |
3/16 (토) TIL - [PintOs] Week08 - System Call (0) | 2024.03.16 |