kaist-cp / rv6

Other
126 stars 13 forks source link

"hart 1 starting" message가 안뜹니다 #55

Closed jeehoonkang closed 4 years ago

jeehoonkang commented 4 years ago
jeehoonkang commented 4 years ago

추측하기로 #8 과 관련이 있을 것 같습니다.

coolofficials commented 4 years ago
hart 2 starting
hart 1 starting

메세지의 경우 아래에서 출력됩니다. https://github.com/mit-pdos/xv6-riscv/blob/9ead904afef8d060c2cc5cee6bd8e8d223de8c40/kernel/main.c#L35-L42

kimjungwow commented 4 years ago

kernel_main.rs::kernel_main()에서 사용하는 변수 started가 함수 내부에서 선언된 것이 문제로 보입니다. 우선 kernel/main.c에서는 아래와 같이 startedmain() 외부에서 선언합니다. https://github.com/kaist-cp/rv6/blob/4729a61694493f7d7445c6a5a623df07c97362a0/kernel/main.c#L7-L13 하지만 kedrnel-rs/srcv/kernel_main.rs에서는 startedmain_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 에서 무한 루프를 돕니다.

startedmain_0 함수 외부에서 static mut started: AtomicBool = AtomicBool::new(false);를 이용하면 무한 루프는 돌지 않지만 부팅이 되지 않아 그 이유를 확인해봐야 합니다.

kimjungwow commented 4 years ago

kernel_main.rsstartedmain_0 함수 내부에서 정의하지 않고, main_0 함수 외부에서

static mut started: AtomicBool = AtomicBool::new(false);

를 이용해 정의할 경우, #53 의 커밋까지는 아래 사진과 같이 hart 2 startinghart 1 starting이 잘 뜹니다. image

하지만 바로 그 다음 커밋인 #54 의 커밋부터는 아래 사진과 같이 hart 2 starting은 뜨지 않으며, hart 1 starting이 뜬 뒤 부팅이 되지 않습니다. (QEMU terminated는 제가 종료시켜서 뜬 메시지입니다) image

jeehoonkang commented 4 years ago
jeehoonkang commented 4 years ago

54 에 대해 한마디만 더 하자면: 리버트한 후에, 여기 안에 있는 refactoring은 가능하면 다시 수행하면 좋겠습니다. 저처럼 크게 한번에 commit을 만들지 말고 종종걸음으로 조금씩 바꿔서 commit 만들고... 이런 과정을 거쳐 여러 commit을 수록한 refactoring PR을 만들어주면 좋겠습니다.

coolofficials commented 4 years ago

54에 가해진 작업 commit 한 단계씩 하다보니 type casting reducing 과정에서 문제가 있는 것으로 보입니다. 정확히 어떤 곳에서 일어났는지 검토해보겠습니다.

coolofficials commented 4 years ago

54에 가해진 작업 commit 한 단계씩 하다보니 type casting reducing 과정에서 문제가 있는 것으로 보입니다. 정확히 어떤 곳에서 일어났는지 검토해보겠습니다.

sysproc.rs의 type_casting 제거 또는 spin_loop에 의한 문제인 것 같습니다.

해당 부분 제외하고 나머지 부분 마저 수정하여 pr 올리겠습니다.

jeehoonkang commented 4 years ago

일단 #54 revert하고 staeted를 전역 변수로 만듭시다.

coolofficials commented 4 years ago

54 에 대해 한마디만 더 하자면: 리버트한 후에, 여기 안에 있는 refactoring은 가능하면 다시 수행하면 좋겠습니다. 저처럼 크게 한번에 commit을 만들지 말고 종종걸음으로 조금씩 바꿔서 commit 만들고... 이런 과정을 거쳐 여러 commit을 수록한 refactoring PR을 만들어주면 좋겠습니다.

@jeehoonkang 이거에 맞춰서 #60 올렸습니다.

혹시 commit들을 여러 PR에 걸쳐서 나누길 바라신다면 말씀해주시면 감사하겠습니다.