Pin is an obscure type in Rust because of the naming and indirect concepts.
The first indirect concept is pointer. Pin<X> does not guarantee that X will not move. If X is a pointer which target type is T, Pin<X> guarantees that T will not move.
The second is “not move”. It really means that the only way to get the mut reference to T is via unsafe interface.
The last is the Unpin mark trait. Pin forbids safe interface to get the mut reference to T only when T is !Unpin.
In simple words, Pin is a pointer wrapper. When a pointer is trapped inside Pin, and the pointee type is !Unpin, there’s no safe way to get a mut reference to the pointee.