> Then why are you still arguing it? Why are your anecdotes somehow superior to mine (if you want to call an entire mainstream market "anecdotal" evidence)?

I'm giving the stated reasons for why Linux intentionally has no stable in-kernel ABI, and what some of the downsides of having one are. That's not an anecdote, that's a description of the stated design philosophy (see also https://www.kernel.org/doc/Documentation/stable_api_nonsense... ). You gave exclusively upsides to having a stable ABI, as though it was an obvious design failing of the Linux kernel, rather than a tradeoff.

To be clear: I absolutely agree that it's possible to provide driver interfaces that don't change; as you said, systems like Windows provide evidence of that. But that doesn't come without a cost.

But I'd be happy to be proven wrong; just point to the source code of one of the kernels you mentioned where they implement a stable kernel ABI without any accumulated cruft...oh, wait. ;)

> And note I never said that you have to maintain ABI/API compatibility forever. Even operating systems with stable API/ABIs do change them from major release to major release.

You gave no indication that you ever considered it acceptable to break ABI. I'm certainly in agreement that ABI shouldn't be broken gratuitously for its own sake; however, it shouldn't be necessary when making a change to the kernel to think about whether out-of-tree drivers (that nobody can see the code of) depend on the behavior of a particular function call, or the layout of a data structure, or the context a given function can be called in.

> So in other words, there's a genuine need for a stable API/ABI and RedHat supports it

For RedHat paying customers who intentionally want to run the same software for 5+ years at a time and avoid any changes, sure. It makes no sense for the upstream Linux kernel to give those same guarantees while doing active development. 5 years ago was roughly 2.6.36. That's 5 years and ~24 kernel releases where not a single field can be added or removed from a data structure, no argument can be added or removed for an existing function, and semantics like "what lock do you need to hold to call this function" cannot change. (There's a lot more to ABI than just function calls and data structures, particularly when you're talking about a C ABI between privileged code running in the same address space.) Maintaining compatibility like that would completely hamstring day-to-day development.

If you have that kind of compatibility requirement for a kernel, and that kernel remains under active development (rather than being declared done and untouchable, which is another option used for some embedded systems or microkernels), you'd need to heavily rework your architecture and development processes to insulate the actively-developed kernel from the drivers, generally by introducing something like a HAL, so that the kernel can change as long as it exposes a compatible HAL. Then you get into issues like HAL versioning, including potentially supporting multiple versions at once, interactions between drivers and interfaces provided by one driver to another, and so on. All for the sake of offering better support for drivers that refuse to submit their code to the upstream Linux kernel.

So yeah, it's possible to build a kernel that provides interfaces that drivers can rely on across many versions. Not without a cost, though.