> Why do we even have linear physical and virtual addresses in the first place, when pretty much everything today is object-oriented?

Simple: we don't want some low level kernel memory management dictating what constitutes an "object".

Everything isn't object-oriented. E.g. large arrays, memory-mapped files, including executables and libraries.

Linear memory sucks, but every other organization sucks more.

Segmented has been done; the benefit-to-clunk ratio was negligible.

Yet in practice the stack on x64 is separate from the heap, GPU memory is general is separate from system memory, and even inside the GPU you have at least a 3 level segmented memory hierarchy.

Even in C-land, you're technically not supposed to fabricate arbitrary heap pointers, you're supposed to offset something you get from malloc(). The Standard says (if memory serves) that only pointers from the beginning of a malloc() to 1-past-the-end have defined behavior (when it comes to the heap).

Of course, there are probably lots of in-practice exceptions when it comes to embedded, kernel code, mmap() shenanigans, etc.

Well, unless you're implementing malloc using e.g. sbrk().

Although you shouldn't be on a modern system, you'd instead be implementing malloc on top of mmap. So remove sbrk, and make mmap the "object allocator", and tada! You don't really need linear virtual address spaces anymore.

Newer allocators like mimalloc[0] don't even support sbrk (I think jemalloc still does). Mimalloc seems to have some interesting features.

[0] https://github.com/microsoft/mimalloc