-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Modeling safety of UART or is it bug? #188
Comments
|
|
|
Xv6 upstream의 변화와 #286 에서의 변화가 본 이슈와 어떤 연관성이 있는지 논의가 필요할 것 같습니다. |
@Medowhill 최근 변화들에서 이 이슈 관련 변화가 있었나요? Trap refactoring 이후에 다시 visit 하기로 했었습니다. |
#503 에서 진행한 아래와 같은 수정에 따라 이 이슈는 닫도록 하겠습니다.
Volatile concurrent access가 허용되어야 하는지 따지는 것은 이 일의 범위가 아니라고 생각되므로, 해당 PR에서는 volatile concurrent access가 허용된다고 가정했습니다. |
현재
Uart
구현은, UART interrupt가 발생했을 때에는,Uart
에 대한 lock을 걸지 않고 그냥 UART 의 MMIO register를 읽고 씁니다. xv6 spec 과 riscv interrupt 의 설명에 따르면, device interrupt 는 임의의 CPU에 전해지므로, CPU A 가putc()
를 하는 도중에 CPU B 가 UART interrupt를 받아서getc()
를 호출, MMIO register 에 대한 data race 가 발생할 수 있습니다. 자세하게 설명하자면 상태 레지스터LSR
에 대해서는 multi read가 있을 수 있고, recieve / transmit register 가 주소를 공유하기 때문에 해당 주소에 대해서는 concurrent read / write 이 존재할 수 있습니다.여기서 발생하는 문제가 두 가지 있는데,
getc()
s 도 순서가 보장되지 않게 읽어오므로 옳은 모델은getc()
를 호출할 때&mut Uart
를 받는 것이라고 생각하는데, 그 경우 UART interrupt가 Uart 에 대한 exclusive ownership을 가진다는 것을 나타내기 어렵습니다. (UART interrupt가 걸려서 UART interrupt가 disable 되었다는 것이 exclusiveness 를 보장.) 이걸 잘 말아서 타입으로 wrapping 하는 게 맞을 지,getc()
가 그냥&self
를 받도록 하고, 해당 문제는 직접적인 memory safety 와 상관이 없으므로 괜찮다고 하는 게 맞을 지 궁금합니다.어떻게 생각하시나요? @jeehoonkang
The text was updated successfully, but these errors were encountered: