https://github.com/martinezjavier/ldd3/
https://www.kernel.org/doc/html/latest/driver-api/index.html
The memory in the kernel is divided into several parts. One of them is core_text, which holds the original functions in the kernel. This part is registered in a specific memory map region that is immune to changes or manipulation. Moreover, if we load a new kernel module - namely, write a new function or an override to an original function - this new function will be written in another memory region that is reserved solely for new functions. You can see this in a virtual memory map below. Note that there’s a difference between the address range that is assigned to the original kernel code (text section, aka “core kernel text”) and the address range that is assigned to a new kernel module.

Considerations about mmio on differents rings
Mapping device to user-space (makes the device accessible by the program):
https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch13s02.html
Driver Development (USB & PCI)
https://krinkinmu.github.io/2020/07/12/linux-kernel-modules.html
https://linuxgazette.net/156/jangir.html