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

Proposal: Async-like way in handling user process #1

Open
skyzh opened this issue Feb 20, 2020 · 3 comments
Open

Proposal: Async-like way in handling user process #1

skyzh opened this issue Feb 20, 2020 · 3 comments
Assignees
Labels
enhancement New feature or request

Comments

@skyzh
Copy link
Owner

skyzh commented Feb 20, 2020

In xv6, code path for trapping into user-space and back is really confusing. Typically this is done with:

forkret() -> usertrap() -> making syscalls, etc. -> usertrapret()

I've encountered the issue of RAII. As we call usertrap in forkret, any object created in forkret won't be dropped as usertrap won't return.

Previously I thought this could been done by introducing a return_to function, in which RISC-V return address register ra is rewritten with the address of that function. For example,

fn forkret() -> NeverReturn {
    return_to(usertrap)
}

Therefore, object can be correctly dropped before jumping to usertrap. However, there're many issues with that.

After that, I propose to use a k_thread() function to represent full code path for trapping into and returning from user-space.

func k_thread() {
    // forkret contents
    loop {
        // usertrap contents
        await_into_userspace(); // A function calls into user space and returns on trap
        if scause == timer { yield(); }
        
        syscall();

        // usertrapret contents
    }
}

And the scheduler just schedules those k_threads, which solves the RAII issue.

Furthermore, I would like to have this issue solved with async-std crate, which supports no-std environment.

@skyzh skyzh self-assigned this Feb 24, 2020
@skyzh skyzh added the enhancement New feature or request label Feb 26, 2020
@wangrunji0408
Copy link

Hi! Glad to see your excellent project!

I've made some attempts on this topic:

Hope it helps!
And looking forward to further communication if you have any ideas.

Thanks!

@skyzh
Copy link
Owner Author

skyzh commented Feb 27, 2020

@wangrunji0408 Thank you! That's exactly what I would like to implement!

@skyzh
Copy link
Owner Author

skyzh commented Mar 28, 2020

osblog wrote a new article on this! https://os.phil-opp.com/async-await/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants