Is there an easy way for one task to share address space with another task directly or does it have to go through the kernel/os and be emulated?

I noticed that support for mapping memory is mostly low level assignment of physical frames to virtual frames via page tables, unlike Mach which uses memory objects.