Skip to content
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

Using Branded in Disk #617

Open
travis1829 opened this issue Mar 24, 2022 · 0 comments
Open

Using Branded in Disk #617

travis1829 opened this issue Mar 24, 2022 · 0 comments

Comments

@travis1829
Copy link
Collaborator

현재 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에서는 존재하지 않는 것 같습니다.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant