There are really a lot of different io_uring crates for rust. Some are quick bindings, some are specialized to particular application or runtime environments, some are doing deeper experiments to how they connect to the applications using the interface, I think I'll start looking at them to contrast their approaches in a little more detail.
First a little background on a number of different approaches a program can take in order to make I/O calls, be they to the network, disk, or some other device. This post is the first in a series of notes reviewing the tradeoffs of the various approaches at a high level, from different kinds of synchronous i/o calls to different kinds of asynchronous calls. Some focus on an environment where a program os running directly in an OS, but a lot of this also applies in other environments besides Rust.
The first part is below on a little background on Synchronous I/O and architectures that handle it, mostly a language independent discussion.