Open skyzh opened 4 years ago
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!
@wangrunji0408 Thank you! That's exactly what I would like to implement!
osblog wrote a new article on this! https://os.phil-opp.com/async-await/
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
inforkret
, any object created inforkret
won't be dropped asusertrap
won't return.Previously I thought this could been done by introducing a
return_to
function, in which RISC-V return address registerra
is rewritten with the address of that function. For example,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.And the scheduler just schedules those
k_thread
s, which solves the RAII issue.Furthermore, I would like to have this issue solved with
async-std
crate, which supports no-std environment.