This is a purely theoretical question. As far as I'm concerned each process have different addressing space and each thread inside one process share the same memory space?
Is there a way, especially in some UNIX system to change that behavior. To be more clear, to make two processes share the same address space? Or to make two threads from the same process to have different address space?
Yes. Google gvisor or rump for examples of how to do this. Short story is you start with a Mother process, which forks() to create new children. These children are managed by ptrace() which isolates them from the kernel. The mother process then manipulates the address space(s) of the children as it sees fit; making them identical is one option.
There is usually a bit of a bootstrapping trick involved, so when a child calls fork(), the Mother forks and execs a known binary (re: aspace layout), then proceeds to clone the original fork()ers aspace into the new one.