rv6 icon indicating copy to clipboard operation
rv6 copied to clipboard

Using `Branded` in `Disk`

Open travis1829 opened this issue 2 years ago • 0 comments

현재 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에서는 존재하지 않는 것 같습니다.)

travis1829 avatar Mar 24 '22 14:03 travis1829