Closed jeehoonkang closed 4 years ago
추측하기로 #8 과 관련이 있을 것 같습니다.
hart 2 starting
hart 1 starting
메세지의 경우 아래에서 출력됩니다. https://github.com/mit-pdos/xv6-riscv/blob/9ead904afef8d060c2cc5cee6bd8e8d223de8c40/kernel/main.c#L35-L42
kernel_main.rs::kernel_main()
에서 사용하는 변수 started
가 함수 내부에서 선언된 것이 문제로 보입니다.
우선 kernel/main.c
에서는 아래와 같이 started
를 main()
외부에서 선언합니다.
https://github.com/kaist-cp/rv6/blob/4729a61694493f7d7445c6a5a623df07c97362a0/kernel/main.c#L7-L13
하지만 kedrnel-rs/srcv/kernel_main.rs
에서는 started
를 main_0()
내부에서 선언합니다.
https://github.com/kaist-cp/rv6/blob/4729a61694493f7d7445c6a5a623df07c97362a0/kernel-rs/src/kernel_main.rs#L19-L20
cpuid() == 0
인 경우
https://github.com/kaist-cp/rv6/blob/4729a61694493f7d7445c6a5a623df07c97362a0/kernel-rs/src/kernel_main.rs#L70
에서 started
의 값을 바꿔도 로컬 변수로 선언되어서 예상대로 rv6가 동작하지 않습니다. 즉, cpuid != 0
인 경우
https://github.com/kaist-cp/rv6/blob/4729a61694493f7d7445c6a5a623df07c97362a0/kernel-rs/src/kernel_main.rs#L72
에서 무한 루프를 돕니다.
started
를 main_0
함수 외부에서 static mut started: AtomicBool = AtomicBool::new(false);
를 이용하면 무한 루프는 돌지 않지만 부팅이 되지 않아 그 이유를 확인해봐야 합니다.
kernel_main.rs
의 started
를 main_0
함수 내부에서 정의하지 않고, main_0
함수 외부에서
static mut started: AtomicBool = AtomicBool::new(false);
를 이용해 정의할 경우, #53 의 커밋까지는 아래 사진과 같이 hart 2 starting
과 hart 1 starting
이 잘 뜹니다.
하지만 바로 그 다음 커밋인 #54 의 커밋부터는 아래 사진과 같이 hart 2 starting
은 뜨지 않으며, hart 1 starting
이 뜬 뒤 부팅이 되지 않습니다. (QEMU terminated는 제가 종료시켜서 뜬 메시지입니다)
54에 가해진 작업 commit 한 단계씩 하다보니 type casting reducing 과정에서 문제가 있는 것으로 보입니다. 정확히 어떤 곳에서 일어났는지 검토해보겠습니다.
sysproc.rs의 type_casting 제거 또는 spin_loop에 의한 문제인 것 같습니다.
해당 부분 제외하고 나머지 부분 마저 수정하여 pr 올리겠습니다.
일단 #54 revert하고 staeted를 전역 변수로 만듭시다.
54 에 대해 한마디만 더 하자면: 리버트한 후에, 여기 안에 있는 refactoring은 가능하면 다시 수행하면 좋겠습니다. 저처럼 크게 한번에 commit을 만들지 말고 종종걸음으로 조금씩 바꿔서 commit 만들고... 이런 과정을 거쳐 여러 commit을 수록한 refactoring PR을 만들어주면 좋겠습니다.
@jeehoonkang 이거에 맞춰서 #60 올렸습니다.
혹시 commit들을 여러 PR에 걸쳐서 나누길 바라신다면 말씀해주시면 감사하겠습니다.
mit-pdos/riscv
브랜치에선 부팅할땐hart 1 starting
이라는 메시지가 뜨는데 이 리포의riscv
브랜치에선 위와 같은 메시지가 안뜹니다.