rv6
rv6 copied to clipboard
Using `Branded` in `Disk`
현재 Braneded
는 여러 개의 Kernel
/Procs
/WaitGuard
객체를 구분하기 위해 사용중인데, 사실 더 일반적으로 유용할만한 use case로는 이미 하나의 Kernel
에 여러 개 존재하는 객체 (ex: Disk
)를 구분하기 위해 사용할 때가 아닐까 싶습니다.
예로, Bcache
의 invariant는, Buf
는 항상 disk block의 latest 데이터를 가지고 있다는 것인데, rv6내에 여러 개의 Disk
가 존재할 수 있는 경우 다음 method이 위 invariant를 깨트릴 수 있습니다.
impl SleepableLock<VirtioDisk> {
pub fn write(self: Pin<&Self>, b: &mut Buf, ctx: &KernelCtx<'_, '_>) {
//...
}
}
위 method는 Buf
가 주어진 self
로부터 왔음을 확인하지 않으므로, Disk
로부터 Buf
를 받은 후, 다른 Disk
로부터 받은 Buf
로 그 Disk
의 해당 부분을 덮어쓰게되면 invariant가 깨질 수 있게 됩니다.
- 이러면, functionality 및 consistency 등의 면에서는 당연히 문제가 발생할 수 있게 됩니다.
- memory safety bug는 현재로서는 없는 것 같습니다만, 이는
ufs
내의assert!
덕분이며, 이를 없애게 되면 disk가 초기에는 문제가 없었다고 가정하더라도 후에 UB가 일어나게 할 수는 있습니다. (예시; 참고로 위 예시의assert!
는 xv6에서는 존재하지 않는 것 같습니다.)