Sorry should have been more clear. With 'in software' I meant something like an intermediate software layer which itself is the sole 'owner' of a device, opens devices, receives the interrupts and so on. And all other components don't open devices directly but instead acquire them from the intermediate layer.
Granted this has limitations when it comes to receiving and sending data, you need prioritisation schemes and whatnot, but for simple 'pin goes high' interrupts the idea is straightforward: the intermediate layer gets an interrupt and calls all registered components in turn.